The software development process consists of a sequence of consecutive phases, such as requirement analysis, high level design, detailed design, implementation and validation [SommOO, Jacog9]. A typical characteristic of the software lifecycle is a gradual evolution from abstract, declarative models to concrete, computational ones. For each of the phases a well-founded theoretical basis is available, as well as a significant body of knowledge and experience [Gammg4, Jacog2, Wirf9O, Bind9g]. One of the major problems in the development of software systems is a lack of adequate support for evolution, i.e. evolution throughout the lifecycle as well as evolution in time [Lehm 85]. Consecutive models arl hardly related, so that in practice various phases of the development cycle are only marginally or not at all worked out. Moreover, a modification of a software system often requires manual changes to all of the models of the consecutive phases. Therefore, in practice, modifications are often carried through only at the lowest levels and nqt documented properly. This results in so-called legacy systems, that embody complex functionality, but that have lost their overall structure, making it possible to maintain them in a cost-efficient way.