To add a migration to a new model version, the following steps need to be performed:

1. Updates in org.eclipse.app4mc.amalthea.converters.common
  - Add the new version to ModelVersion
  - Register the AmaltheaNamespace for the new ModelVersion in AmaltheaNamespaceRegistry

2. Create a new converter plugin with name org.eclipse.app4mc.amalthea.converters.<version>
  - implement the required IConverter
  - note that it is not required to implement a dedicated NamespaceConverter, as such a converter will
    will be registered by default automatically.

3. Create a new converter test plugin with name org.eclipse.app4mc.amalthea.converters.<version>.tests
  - implement the test cases for the new IConverter

4. Add the new converter plugin in the feature org.eclipse.app4mc.amalthea.converters.headless
  - this feature is included in org.eclipse.app4mc.amalthea.converters, so the converters features does
    not need to be updated

5. Add the new converter plugin to the amalthea_migration.bndrun in org.eclipse.app4mc.converters.product
  - Add the bundle to the -runbundles
  - this is needed so it is included in the executable jar file created by the bnd-export-maven-plugin

6. Add the test plugin to the dependencies section of the releng\org.eclipse.app4mc.converters.p2repo pom.xml
  - this is needed to add the coverage report to the aggregated report in target/site/jacoco-aggregate on build