In the model-driven approach to software development, a software system is seen as a cluster of models, on various levels of abstraction and with various characteristics. Each of these models captures certain features or aspects of the systems, allows its own kind of analysis, and has its own tools available. In this way one may apply the many sophisticated tools and theories that have been developed for particular models by the research community. It is clear, however, that this will not work without powerful tools for integrating the various models, transforming them into one another, generating code from them, and keeping them consistent. The course introduces students to this area, concentrating on the use of a concrete, rule based transformation engine.