The dream of Model Driven Engineering (MDE) is that Software Engineering activities should be performed only on models, but in practice a significant amount of programming is still being performed. There is a clear need to keep code and models strongly synchronized when they represent the ities at different levels of abstraction. We observe that versioning is ill supported by MDE tools, and that no strong synchronization is ensured between code and model versions. This, among other things, explains why MDE is not widely adopted in industry. This paper presents the solution developed in the CADSE project for providing consistent support for model and code co-evolution. It is shown that it requires to (1) define, what evolution policy is to be applied, (2) closely synchronize both ways, the model entities and the computer artifacts, and (3) enforce consistency constraints and evolution policies during the commit and check-out of both model elements and their corresponding artifacts.