In this paper we show a new approach to evolution of software systems. We embed high-level specification information into program code patterns, so that such program code is interpretable at different abstraction levels. Since these model information is also acessed at run time for execution, we can avoid the situation that program code and high-level specifications are out of synch. Since the program code is thus a valid notation for the model syntax, we can apply transformations based on model semantics to it. An example will be provided that transforms software based on state machines to process models. This leads to a new perspective of software evolution in which the program code can be considered at higher levels of abstraction.