Model-driven engineering focuses on models as primary artifacts of the software development process, which means programs are mainly generated by model-to-code transformations. In particular, modeling languages tailored to specific domains promise to increase the productivity of software developers and the quality of generated software. Modeling languages, however, evolve over time and therefore, existing models have to be migrated accordingly. The manual migration of models tends to be tedious and error-prone, therefore tools have been developed to (partly) automate this process. Nevertheless, the migration results may not always be well-defined. In this article, we provide a formal framework for model migration which is independent of specific modeling approaches. We treat modeling languages, formalized by metamodels, as well as models as graphs and consider their co-evolutions as coupled graph transformations. In the same line, we study the conditions under which model migrations are well-defined. Existing solutions to model migration are either handwritten or default solutions that can hardly be customized. Here, we introduce a high-level specification approach, called model migration schemes, that supports automation and customization. Starting from a meta-model evolution rule, a default migration scheme can be automatically deduced and customized.