Evolving complex systems from one consistent version to another is a challenging problem. Each version usually requires multiple changes in multiple system components having subtle functional dependencies. Mitigating the costs incurred to check the consistency of a new version is an important concern. An efficient approach to guarantee consistency of the new system is proposed. System components are modeled as communicating finite state machines. A change is a set of update rules that add or delete transitions in the system components. Given a set of changes, the proposed approach automatically generates an aggregated update comprised of groups of update rules. The interactions among the update rules are analyzed in terms of their impacts on the states of the system. Groups of update rules are computed such that each group contains one special rule whose impacted states subsume that of the others in the group. If that rule preserves consistency then the entire group preserves consistency. The proposed approach has been applied to consistently evolve a family of cache coherence protocols with highly encouraging results.