[256856] Support model evolution

https://bugs.eclipse.org/bugs/show_bug.cgi?id=256856

Change-Id: I79cdebb2e7d53caf833466128ad3210d5d2da42e
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml
index 5d77738..a4ec54f 100644
--- a/features/org.eclipse.emf.cdo-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo-feature/feature.xml
@@ -13,7 +13,7 @@
 <feature
       id="org.eclipse.emf.cdo"
       label="%featureName"
-      version="4.7.100.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
@@ -210,4 +210,25 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.emf.cdo.evolution"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.emf.cdo.evolution.edit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.emf.cdo.evolution.editor"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/features/org.eclipse.emf.cdo-feature/pom.xml b/features/org.eclipse.emf.cdo-feature/pom.xml
index 8d4c20d..7f5062d 100644
--- a/features/org.eclipse.emf.cdo-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo</artifactId>
-  <version>4.7.100-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.all-feature/feature.xml b/features/org.eclipse.emf.cdo.all-feature/feature.xml
index 75799de..bfc244a 100644
--- a/features/org.eclipse.emf.cdo.all-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.all-feature/feature.xml
@@ -13,7 +13,7 @@
 <feature
       id="org.eclipse.emf.cdo.all"
       label="%featureName"
-      version="4.7.100.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo.all-feature/pom.xml b/features/org.eclipse.emf.cdo.all-feature/pom.xml
index b6666f2..739a80e 100644
--- a/features/org.eclipse.emf.cdo.all-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.all-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.all</artifactId>
-  <version>4.7.100-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.epp-feature/feature.xml b/features/org.eclipse.emf.cdo.epp-feature/feature.xml
index 141597f..0e1442a 100644
--- a/features/org.eclipse.emf.cdo.epp-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.epp-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.epp"
       label="%featureName"
-      version="4.7.100.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo.epp-feature/pom.xml b/features/org.eclipse.emf.cdo.epp-feature/pom.xml
index c269393..61d88df 100644
--- a/features/org.eclipse.emf.cdo.epp-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.epp-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.epp</artifactId>
-  <version>4.7.100-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
index d8c4b0f..46031e6 100644
--- a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.sdk"
       label="%featureName"
-      version="5.0.100.qualifier"
+      version="5.1.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.sdk-feature/pom.xml b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
index d75aa0c..b9ad521 100644
--- a/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.sdk</artifactId>
-  <version>5.0.100-SNAPSHOT</version>
+  <version>5.1.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
index a6c8025..dfbd133 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server.embedded"
       label="%featureName"
-      version="4.7.100.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
index b13684a..4b597ea 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.server.embedded</artifactId>
-  <version>4.7.100-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j-feature/feature.xml b/features/org.eclipse.net4j-feature/feature.xml
index 6f40db7..b856b93 100644
--- a/features/org.eclipse.net4j-feature/feature.xml
+++ b/features/org.eclipse.net4j-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j"
       label="%featureName"
-      version="4.7.0.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j-feature/pom.xml b/features/org.eclipse.net4j-feature/pom.xml
index 80e2745..a5667f7 100644
--- a/features/org.eclipse.net4j-feature/pom.xml
+++ b/features/org.eclipse.net4j-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j</artifactId>
-  <version>4.7.0-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.db-feature/feature.xml b/features/org.eclipse.net4j.db-feature/feature.xml
index f960055..76569d2 100644
--- a/features/org.eclipse.net4j.db-feature/feature.xml
+++ b/features/org.eclipse.net4j.db-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.db"
       label="%featureName"
-      version="4.7.0.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.net4j.db-feature/pom.xml b/features/org.eclipse.net4j.db-feature/pom.xml
index 230e5a2..b13d621 100644
--- a/features/org.eclipse.net4j.db-feature/pom.xml
+++ b/features/org.eclipse.net4j.db-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.db</artifactId>
-  <version>4.7.0-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.sdk-feature/feature.xml b/features/org.eclipse.net4j.sdk-feature/feature.xml
index aa8ac68..7c297fc 100644
--- a/features/org.eclipse.net4j.sdk-feature/feature.xml
+++ b/features/org.eclipse.net4j.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.sdk"
       label="%featureName"
-      version="4.7.0.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.sdk-feature/pom.xml b/features/org.eclipse.net4j.sdk-feature/pom.xml
index 77651a6..be36e49 100644
--- a/features/org.eclipse.net4j.sdk-feature/pom.xml
+++ b/features/org.eclipse.net4j.sdk-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.sdk</artifactId>
-  <version>4.7.0-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.util-feature/feature.xml b/features/org.eclipse.net4j.util-feature/feature.xml
index 820f785..07d9807 100644
--- a/features/org.eclipse.net4j.util-feature/feature.xml
+++ b/features/org.eclipse.net4j.util-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util"
       label="%featureName"
-      version="4.7.0.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util-feature/pom.xml b/features/org.eclipse.net4j.util-feature/pom.xml
index b52ebfe..8b19a42 100644
--- a/features/org.eclipse.net4j.util-feature/pom.xml
+++ b/features/org.eclipse.net4j.util-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.util</artifactId>
-  <version>4.7.0-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.util.ui-feature/feature.xml b/features/org.eclipse.net4j.util.ui-feature/feature.xml
index 22e6c16..b3a96a7 100644
--- a/features/org.eclipse.net4j.util.ui-feature/feature.xml
+++ b/features/org.eclipse.net4j.util.ui-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util.ui"
       label="%featureName"
-      version="4.7.0.qualifier"
+      version="4.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util.ui-feature/pom.xml b/features/org.eclipse.net4j.util.ui-feature/pom.xml
index 6e2eabd..f1ae447 100644
--- a/features/org.eclipse.net4j.util.ui-feature/pom.xml
+++ b/features/org.eclipse.net4j.util.ui-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.util.ui</artifactId>
-  <version>4.7.0-SNAPSHOT</version>
+  <version>4.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.classpath b/plugins/org.eclipse.emf.cdo.evolution.edit/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.project b/plugins/org.eclipse.emf.cdo.evolution.edit/.project
new file mode 100644
index 0000000..4ead2df
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.project
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.cdo.evolution.edit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+      <arguments>
+      </arguments>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.oomph.version.VersionBuilder</name>
+      <arguments>
+        <dictionary>
+          <key>check.maven.pom</key>
+          <value>true</value>
+        </dictionary>
+        <dictionary>
+          <key>ignore.lower.bound.dependency.ranges</key>
+          <value>true</value>
+        </dictionary>
+        <dictionary>
+          <key>release.path</key>
+          <value>/org.eclipse.emf.cdo.releng/versions/release.xml</value>
+        </dictionary>
+      </arguments>
+    </buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+    <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+    <nature>org.eclipse.oomph.version.VersionNature</nature>
+	</natures>
+  <filteredResources>
+    <filter>
+      <id>1396938000000</id>
+      <name></name>
+      <type>10</type>
+      <matcher>
+        <id>org.eclipse.ui.ide.multiFilter</id>
+        <arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+      </matcher>
+    </filter>
+  </filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..b03b9db
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,427 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,*.ucls,doc-files/,package.html,package-info.java
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=2
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=160
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.launching.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 0000000..556ed07
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+#Fri Sep 02 05:38:34 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=ignore
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..222aec0
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,119 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_EMFT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_EMFT
+formatter_settings_version=12
+org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=org.eclipse.emf.cdo;org.eclipse.emf.internal.cdo;org.eclipse.net4j;org.eclipse.internal.net4j;org.eclipse.emf;org.eclipse;com;org;javax;java;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment"/><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment"/><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment"/><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\r\n * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *    Eike Stepper - initial API and implementation\r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author Eike Stepper\r\n */</template><template autoinsert\="false" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment"/><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment"/><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment"/><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=true
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.ltk.core.refactoring.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..864e30f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.tasks.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..b050639
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.team.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644
index 0000000..97c11e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.mylyn.team.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+commit.comment.template=[${task.id}] ${task.description}\r\n\r\n${task.url}
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.api.tools.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..0c17d59
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,95 @@
+#Thu Feb 04 09:44:24 CET 2010
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+MISSING_EE_DESCRIPTIONS=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Ignore
+automatically_removed_unused_problem_filters=Disabled
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..fe01bb7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,31 @@
+#Thu Feb 04 09:44:24 CET 2010
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=2
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=1
+compilers.p.missing-version-import-package=1
+compilers.p.missing-version-require-bundle=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.evolution.edit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..eea0f2d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.emf.cdo.evolution.edit;singleton:=true
+Automatic-Module-Name: org.eclipse.emf.cdo.evolution.edit
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.emf.cdo.evolution.provider.EvolutionEditPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.emf.cdo.evolution.provider;version="1.0.0"
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo.evolution;bundle-version="[1.0.0,2.0.0)";visibility:=reexport,
+ org.eclipse.emf.edit;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.emf.ecore.edit;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo.edit;bundle-version="[4.0.0,5.0.0)"
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/build.properties b/plugins/org.eclipse.emf.cdo.evolution.edit/build.properties
new file mode 100644
index 0000000..6e3e902
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/build.properties
@@ -0,0 +1,10 @@
+#
+
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Evolution.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Evolution.gif
new file mode 100644
index 0000000..df2990f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Evolution.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/FeaturePathMigration.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/FeaturePathMigration.gif
new file mode 100644
index 0000000..d92f34c
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/FeaturePathMigration.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Model.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Model.gif
new file mode 100644
index 0000000..0b60dcc
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Model.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/ModelSetChange.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/ModelSetChange.gif
new file mode 100644
index 0000000..f988003
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/ModelSetChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Package.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Package.gif
new file mode 100644
index 0000000..d931a97
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Package.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/PropertyChange.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/PropertyChange.gif
new file mode 100644
index 0000000..ce8bdb9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/PropertyChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Release.gif b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Release.gif
new file mode 100644
index 0000000..ce096aa
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/icons/full/obj16/Release.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.properties b/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.properties
new file mode 100644
index 0000000..eb5cb8e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.properties
@@ -0,0 +1,85 @@
+#
+
+pluginName = CDO Model Repository Evolution Edit Support
+providerName = Eclipse Modeling Project
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_UI_CreateChild_text3 = {1}
+_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
+_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
+_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
+
+_UI_PropertyDescriptor_description = The {0} of the {1}
+
+##### Sorted:
+
+_UI_ChangeKind_ADDED_literal = ADDED
+_UI_ChangeKind_CHANGED_literal = CHANGED
+_UI_ChangeKind_COPIED_literal = COPIED
+_UI_ChangeKind_MOVED_literal = MOVED
+_UI_ChangeKind_NONE_literal = NONE
+_UI_ChangeKind_REMOVED_literal = REMOVED
+_UI_Change_children_feature = Children
+_UI_Change_parent_feature = Parent
+_UI_Change_type = Change
+_UI_ElementChange_kind_feature = Kind
+_UI_ElementChange_newElement_feature = New Element
+_UI_ElementChange_oldElement_feature = Old Element
+_UI_ElementChange_type = Element Change
+_UI_Evolution_allPackages_feature = All Packages
+_UI_Evolution_latestRelease_feature = Latest Release
+_UI_Evolution_missingPackages_feature = Missing Packages
+_UI_Evolution_models_feature = Models
+_UI_Evolution_orderedReleases_feature = Ordered Releases
+_UI_Evolution_releases_feature = Releases
+_UI_Evolution_rootPackages_feature = Root Packages
+_UI_Evolution_type = Evolution
+_UI_Evolution_useEcorePackage_feature = Use Ecore Package
+_UI_Evolution_useEresourcePackage_feature = Use Eresource Package
+_UI_Evolution_useEtypesPackage_feature = Use Etypes Package
+_UI_FeaturePathMigration_featurePath_feature = Feature Path
+_UI_FeaturePathMigration_fromClass_feature = From Class
+_UI_FeaturePathMigration_toClass_feature = To Class
+_UI_FeaturePathMigration_type = Feature Path Migration
+_UI_Migration_diagnosticID_feature = Diagnostic ID
+_UI_Migration_modelSet_feature = Model Set
+_UI_Migration_type = Migration
+_UI_ModelSetChange_newModelSet_feature = New Model Set
+_UI_ModelSetChange_oldModelSet_feature = Old Model Set
+_UI_ModelSetChange_type = Changes
+_UI_ModelSet_allPackages_feature = All Packages
+_UI_ModelSet_change_feature = Change
+_UI_ModelSet_migrations_feature = Migrations
+_UI_ModelSet_missingPackages_feature = Missing Packages
+_UI_ModelSet_models_feature = Models
+_UI_ModelSet_rootPackages_feature = Root Packages
+_UI_ModelSet_type = Model Set
+_UI_Model_allPackages_feature = All Packages
+_UI_Model_evolution_feature = Evolution
+_UI_Model_missingPackages_feature = Missing Packages
+_UI_Model_modelSet_feature = Model Set
+_UI_Model_referencedPackages_feature = Referenced Packages
+_UI_Model_rootPackage_feature = Root Package
+_UI_Model_type = Model
+_UI_Model_uRI_feature = URI
+_UI_PropertyChange_feature_feature = Feature
+_UI_PropertyChange_kind_feature = Kind
+_UI_PropertyChange_newValue_feature = New Value
+_UI_PropertyChange_oldValue_feature = Old Value
+_UI_PropertyChange_type = Property Change
+_UI_Release_allPackages_feature = All Packages
+_UI_Release_date_feature = Date
+_UI_Release_evolution_feature = Evolution
+_UI_Release_migrations_feature = Migrations
+_UI_Release_nextRelease_feature = Next Release
+_UI_Release_previousRelease_feature = Previous Release
+_UI_Release_rootPackages_feature = Root Packages
+_UI_Release_type = Release
+_UI_Release_version_feature = Version
+_UI_Unknown_datatype= Value
+_UI_Unknown_feature = Unspecified
+_UI_Unknown_type = Object
+_UI_Evolution_uniqueNamespaceURIs_feature = Unique Namespace UR Is
+_UI_Evolution_uniqueNamespaces_feature = Unique Namespaces
+_UI_Evolution_nextReleaseVersion_feature = Next Release Version
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.xml b/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.xml
new file mode 100644
index 0000000..0446813
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+      <!-- @generated evolution -->
+      <factory
+            uri="http://www.eclipse.org/emf/CDO/evolution/1.0.0"
+            class="org.eclipse.emf.cdo.evolution.provider.EvolutionItemProviderAdapterFactory"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource
+               org.eclipse.emf.edit.provider.IItemColorProvider
+               org.eclipse.emf.edit.provider.IItemFontProvider
+               org.eclipse.emf.edit.provider.IItemStyledLabelProvider"/>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ChangeItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ChangeItemProvider.java
new file mode 100644
index 0000000..ae80529
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ChangeItemProvider.java
@@ -0,0 +1,191 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.Change} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ChangeItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
+    IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider, IItemStyledLabelProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(EvolutionPackage.Literals.CHANGE__CHILDREN);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean hasChildren(Object object)
+  {
+    return hasChildren(object, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    return new StyledString(getString("_UI_Change_type"));
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Change.class))
+    {
+    case EvolutionPackage.CHANGE__CHILDREN:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ((IChildCreationExtender)adapterFactory).getResourceLocator();
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ElementChangeItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ElementChangeItemProvider.java
new file mode 100644
index 0000000..138670d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ElementChangeItemProvider.java
@@ -0,0 +1,234 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.StyledString.Style;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.ElementChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ElementChangeItemProvider extends ChangeItemProvider
+{
+  private static final URI RED = URI.createURI("color://rgb/200/0/0"); //$NON-NLS-1$
+
+  private static final URI GREEN = URI.createURI("color://rgb/0/160/0"); //$NON-NLS-1$
+
+  static final Style REMOVAL_STYLER = Style.newBuilder().setForegroundColor(RED).toStyle();
+
+  static final Style ADDITION_STYLER = Style.newBuilder().setForegroundColor(GREEN).toStyle();
+
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ElementChangeItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addOldElementPropertyDescriptor(object);
+      addNewElementPropertyDescriptor(object);
+      addKindPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Old Element feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addOldElementPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_ElementChange_oldElement_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_ElementChange_oldElement_feature", "_UI_ElementChange_type"),
+        EvolutionPackage.Literals.ELEMENT_CHANGE__OLD_ELEMENT, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the New Element feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addNewElementPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_ElementChange_newElement_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_ElementChange_newElement_feature", "_UI_ElementChange_type"),
+        EvolutionPackage.Literals.ELEMENT_CHANGE__NEW_ELEMENT, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Kind feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addKindPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_ElementChange_kind_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_ElementChange_kind_feature", "_UI_ElementChange_type"),
+        EvolutionPackage.Literals.ELEMENT_CHANGE__KIND, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  @Override
+  public Object getImage(Object object)
+  {
+    ElementChange elementChange = (ElementChange)object;
+    EModelElement element = elementChange.getElement();
+
+    if (element != null)
+    {
+      IItemLabelProvider labelProvider = (IItemLabelProvider)getRootAdapterFactory().adapt(element, IItemLabelProvider.class);
+      if (labelProvider != null)
+      {
+        return labelProvider.getImage(element);
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    ElementChange elementChange = (ElementChange)object;
+    EModelElement element = elementChange.getElement();
+
+    StyledString styledLabel = new StyledString();
+    ChangeKind kind = elementChange.getKind();
+
+    IItemLabelProvider labelProvider = (IItemLabelProvider)getRootAdapterFactory().adapt(element, IItemLabelProvider.class);
+    if (labelProvider != null)
+    {
+      String text = labelProvider.getText(element);
+      if (kind == ChangeKind.ADDED || kind == ChangeKind.COPIED || kind == ChangeKind.MOVED)
+      {
+        styledLabel.append(text, ADDITION_STYLER);
+      }
+      else if (kind == ChangeKind.REMOVED)
+      {
+        styledLabel.append(text, REMOVAL_STYLER);
+      }
+      else
+      {
+        styledLabel.append(text);
+      }
+    }
+    else
+    {
+      styledLabel.append(getString("_UI_ElementChange_type"));
+    }
+
+    String label = kind == null || kind == ChangeKind.NONE ? null : kind.toString();
+    if (label != null)
+    {
+      styledLabel.append("  " + label, StyledString.Style.DECORATIONS_STYLER);
+    }
+
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(ElementChange.class))
+    {
+    case EvolutionPackage.ELEMENT_CHANGE__KIND:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionEditPlugin.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionEditPlugin.java
new file mode 100644
index 0000000..d3b8f2a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionEditPlugin.java
@@ -0,0 +1,99 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.provider.EcoreEditPlugin;
+
+/**
+ * This is the central singleton for the Evolution edit plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class EvolutionEditPlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final EvolutionEditPlugin INSTANCE = new EvolutionEditPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionEditPlugin()
+  {
+    super
+      (new ResourceLocator [] 
+       {
+         EcoreEditPlugin.INSTANCE,
+       });
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipsePlugin
+  {
+    /**
+     * Creates an instance.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProvider.java
new file mode 100644
index 0000000..ceac47f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProvider.java
@@ -0,0 +1,359 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.Evolution} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionItemProvider extends ModelSetItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addUseEcorePackagePropertyDescriptor(object);
+      addUseEresourcePackagePropertyDescriptor(object);
+      addUseEtypesPackagePropertyDescriptor(object);
+      addUniqueNamespacesPropertyDescriptor(object);
+      addRootPackagesPropertyDescriptor(object);
+      addAllPackagesPropertyDescriptor(object);
+      addMissingPackagesPropertyDescriptor(object);
+      addOrderedReleasesPropertyDescriptor(object);
+      addLatestReleasePropertyDescriptor(object);
+      addNextReleaseVersionPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Use Ecore Package feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addUseEcorePackagePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_useEcorePackage_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_useEcorePackage_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__USE_ECORE_PACKAGE, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Use Eresource Package feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addUseEresourcePackagePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_useEresourcePackage_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_useEresourcePackage_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__USE_ERESOURCE_PACKAGE, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Use Etypes Package feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addUseEtypesPackagePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_useEtypesPackage_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_useEtypesPackage_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__USE_ETYPES_PACKAGE, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Unique Namespaces feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addUniqueNamespacesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_uniqueNamespaces_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_uniqueNamespaces_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__UNIQUE_NAMESPACES, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Root Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addRootPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_rootPackages_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_rootPackages_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__ROOT_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the All Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addAllPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_allPackages_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_allPackages_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__ALL_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Ordered Releases feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addOrderedReleasesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_orderedReleases_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_orderedReleases_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__ORDERED_RELEASES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Latest Release feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addLatestReleasePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_latestRelease_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_latestRelease_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__LATEST_RELEASE, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Next Release Version feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addNextReleaseVersionPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_nextReleaseVersion_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_nextReleaseVersion_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__NEXT_RELEASE_VERSION, false, false, false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Missing Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addMissingPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Evolution_missingPackages_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Evolution_missingPackages_feature", "_UI_Evolution_type"),
+        EvolutionPackage.Literals.EVOLUTION__MISSING_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Collection<? extends EStructuralFeature> getChildrenFeaturesGen(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(EvolutionPackage.Literals.EVOLUTION__MODELS);
+      childrenFeatures.add(EvolutionPackage.Literals.EVOLUTION__ORDERED_RELEASES);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    @SuppressWarnings("unchecked")
+    List<EStructuralFeature> childrenFeatures = (List<EStructuralFeature>)getChildrenFeaturesGen(object);
+
+    childrenFeatures.remove(EvolutionPackage.Literals.EVOLUTION__MODELS);
+    childrenFeatures.add(0, EvolutionPackage.Literals.EVOLUTION__MODELS);
+
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  @Override
+  protected boolean hasChildren(Object object, boolean optimized)
+  {
+    Evolution evolution = (Evolution)object;
+    return !(evolution.getModels().isEmpty() && evolution.getReleases().isEmpty());
+  }
+
+  /**
+   * This returns Evolution.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/Evolution"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    return new StyledString(getString("_UI_Evolution_type"));
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Evolution.class))
+    {
+    case EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE:
+    case EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE:
+    case EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE:
+    case EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES:
+    case EvolutionPackage.EVOLUTION__RELEASES:
+    case EvolutionPackage.EVOLUTION__NEXT_RELEASE_VERSION:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    case EvolutionPackage.EVOLUTION__MODELS:
+    case EvolutionPackage.EVOLUTION__ORDERED_RELEASES:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(EvolutionPackage.Literals.EVOLUTION__MODELS, EvolutionFactory.eINSTANCE.createModel()));
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProviderAdapterFactory.java
new file mode 100644
index 0000000..9560a78
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/EvolutionItemProviderAdapterFactory.java
@@ -0,0 +1,443 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.util.EvolutionAdapterFactory;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ChildCreationExtenderManager;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support Viewers.
+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
+ * The adapters also support Eclipse property sheets.
+ * Note that most of the adapters are shared among multiple instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionItemProviderAdapterFactory extends EvolutionAdapterFactory
+    implements ComposeableAdapterFactory, IChangeNotifier, IDisposable, IChildCreationExtender
+{
+  /**
+   * This keeps track of the root adapter factory that delegates to this adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ComposedAdapterFactory parentAdapterFactory;
+
+  /**
+   * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+  /**
+   * This helps manage the child creation extenders.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ChildCreationExtenderManager childCreationExtenderManager = new ChildCreationExtenderManager(EvolutionEditPlugin.INSTANCE,
+      EvolutionPackage.eNS_URI);
+
+  /**
+   * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Object> supportedTypes = new ArrayList<Object>();
+
+  /**
+   * This constructs an instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionItemProviderAdapterFactory()
+  {
+    supportedTypes.add(IEditingDomainItemProvider.class);
+    supportedTypes.add(IStructuredItemContentProvider.class);
+    supportedTypes.add(ITreeItemContentProvider.class);
+    supportedTypes.add(IItemLabelProvider.class);
+    supportedTypes.add(IItemPropertySource.class);
+    supportedTypes.add(IItemColorProvider.class);
+    supportedTypes.add(IItemFontProvider.class);
+    supportedTypes.add(IItemStyledLabelProvider.class);
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.Model} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelItemProvider modelItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.Model}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createModelAdapter()
+  {
+    if (modelItemProvider == null)
+    {
+      modelItemProvider = new ModelItemProvider(this);
+    }
+
+    return modelItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.Evolution} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionItemProvider evolutionItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.Evolution}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createEvolutionAdapter()
+  {
+    if (evolutionItemProvider == null)
+    {
+      evolutionItemProvider = new EvolutionItemProvider(this);
+    }
+
+    return evolutionItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.Release} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ReleaseItemProvider releaseItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.Release}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createReleaseAdapter()
+  {
+    if (releaseItemProvider == null)
+    {
+      releaseItemProvider = new ReleaseItemProvider(this);
+    }
+
+    return releaseItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.ModelSetChange} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelSetChangeItemProvider modelSetChangeItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.ModelSetChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createModelSetChangeAdapter()
+  {
+    if (modelSetChangeItemProvider == null)
+    {
+      modelSetChangeItemProvider = new ModelSetChangeItemProvider(this);
+    }
+
+    return modelSetChangeItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.ElementChange} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ElementChangeItemProvider elementChangeItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.ElementChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createElementChangeAdapter()
+  {
+    if (elementChangeItemProvider == null)
+    {
+      elementChangeItemProvider = new ElementChangeItemProvider(this);
+    }
+
+    return elementChangeItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.PropertyChange} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected PropertyChangeItemProvider propertyChangeItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.PropertyChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createPropertyChangeAdapter()
+  {
+    if (propertyChangeItemProvider == null)
+    {
+      propertyChangeItemProvider = new PropertyChangeItemProvider(this);
+    }
+
+    return propertyChangeItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.emf.cdo.evolution.FeaturePathMigration} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected FeaturePathMigrationItemProvider featurePathMigrationItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.emf.cdo.evolution.FeaturePathMigration}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createFeaturePathMigrationAdapter()
+  {
+    if (featurePathMigrationItemProvider == null)
+    {
+      featurePathMigrationItemProvider = new FeaturePathMigrationItemProvider(this);
+    }
+
+    return featurePathMigrationItemProvider;
+  }
+
+  /**
+   * This returns the root adapter factory that contains this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ComposeableAdapterFactory getRootAdapterFactory()
+  {
+    return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+  }
+
+  /**
+   * This sets the composed adapter factory that contains this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
+  {
+    this.parentAdapterFactory = parentAdapterFactory;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isFactoryForType(Object type)
+  {
+    return supportedTypes.contains(type) || super.isFactoryForType(type);
+  }
+
+  /**
+   * This implementation substitutes the factory itself as the key for the adapter.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter adapt(Notifier notifier, Object type)
+  {
+    return super.adapt(notifier, this);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object adapt(Object object, Object type)
+  {
+    if (isFactoryForType(type))
+    {
+      Object adapter = super.adapt(object, type);
+      if (!(type instanceof Class<?>) || ((Class<?>)type).isInstance(adapter))
+      {
+        return adapter;
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public List<IChildCreationExtender> getChildCreationExtenders()
+  {
+    return childCreationExtenderManager.getChildCreationExtenders();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Collection<?> getNewChildDescriptors(Object object, EditingDomain editingDomain)
+  {
+    return childCreationExtenderManager.getNewChildDescriptors(object, editingDomain);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ResourceLocator getResourceLocator()
+  {
+    return childCreationExtenderManager;
+  }
+
+  /**
+   * This adds a listener.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void addListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.addListener(notifyChangedListener);
+  }
+
+  /**
+   * This removes a listener.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void removeListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.removeListener(notifyChangedListener);
+  }
+
+  /**
+   * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void fireNotifyChanged(Notification notification)
+  {
+    changeNotifier.fireNotifyChanged(notification);
+
+    if (parentAdapterFactory != null)
+    {
+      parentAdapterFactory.fireNotifyChanged(notification);
+    }
+  }
+
+  /**
+   * This disposes all of the item providers created by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void dispose()
+  {
+    if (modelItemProvider != null)
+    {
+      modelItemProvider.dispose();
+    }
+    if (evolutionItemProvider != null)
+    {
+      evolutionItemProvider.dispose();
+    }
+    if (releaseItemProvider != null)
+    {
+      releaseItemProvider.dispose();
+    }
+    if (modelSetChangeItemProvider != null)
+    {
+      modelSetChangeItemProvider.dispose();
+    }
+    if (elementChangeItemProvider != null)
+    {
+      elementChangeItemProvider.dispose();
+    }
+    if (propertyChangeItemProvider != null)
+    {
+      propertyChangeItemProvider.dispose();
+    }
+    if (featurePathMigrationItemProvider != null)
+    {
+      featurePathMigrationItemProvider.dispose();
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/FeaturePathMigrationItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/FeaturePathMigrationItemProvider.java
new file mode 100644
index 0000000..f2b38b4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/FeaturePathMigrationItemProvider.java
@@ -0,0 +1,182 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.FeaturePathMigration} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class FeaturePathMigrationItemProvider extends MigrationItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public FeaturePathMigrationItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addFromClassPropertyDescriptor(object);
+      addToClassPropertyDescriptor(object);
+      addFeaturePathPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the From Class feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addFromClassPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_FeaturePathMigration_fromClass_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_FeaturePathMigration_fromClass_feature", "_UI_FeaturePathMigration_type"),
+        EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FROM_CLASS, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the To Class feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addToClassPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_FeaturePathMigration_toClass_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_FeaturePathMigration_toClass_feature", "_UI_FeaturePathMigration_type"),
+        EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__TO_CLASS, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Feature Path feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addFeaturePathPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_FeaturePathMigration_featurePath_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_FeaturePathMigration_featurePath_feature", "_UI_FeaturePathMigration_type"),
+        EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FEATURE_PATH, true, false, true, null, null, null));
+  }
+
+  /**
+   * This returns FeaturePathMigration.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/FeaturePathMigration"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    String label = ((FeaturePathMigration)object).getDiagnosticID();
+    StyledString styledLabel = new StyledString();
+    if (label == null || label.length() == 0)
+    {
+      styledLabel.append(getString("_UI_FeaturePathMigration_type"), StyledString.Style.QUALIFIER_STYLER);
+    }
+    else
+    {
+      styledLabel.append(getString("_UI_FeaturePathMigration_type"), StyledString.Style.QUALIFIER_STYLER).append(" " + label);
+    }
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/MigrationItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/MigrationItemProvider.java
new file mode 100644
index 0000000..0577be4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/MigrationItemProvider.java
@@ -0,0 +1,167 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Migration;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.Migration} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MigrationItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
+    IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider, IItemStyledLabelProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public MigrationItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean hasChildren(Object object)
+  {
+    return hasChildren(object, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    String label = ((Migration)object).getDiagnosticID();
+    StyledString styledLabel = new StyledString();
+    if (label == null || label.length() == 0)
+    {
+      styledLabel.append(getString("_UI_Migration_type"), StyledString.Style.QUALIFIER_STYLER);
+    }
+    else
+    {
+      styledLabel.append(getString("_UI_Migration_type"), StyledString.Style.QUALIFIER_STYLER).append(" " + label);
+    }
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Migration.class))
+    {
+    case EvolutionPackage.MIGRATION__DIAGNOSTIC_ID:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ((IChildCreationExtender)adapterFactory).getResourceLocator();
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelItemProvider.java
new file mode 100644
index 0000000..bf209fe
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelItemProvider.java
@@ -0,0 +1,331 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Model;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.command.DragAndDropCommand;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.Model} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
+    IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider, IItemStyledLabelProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addURIPropertyDescriptor(object);
+      addRootPackagePropertyDescriptor(object);
+      addAllPackagesPropertyDescriptor(object);
+      addReferencedPackagesPropertyDescriptor(object);
+      addMissingPackagesPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the URI feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addURIPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Model_uRI_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Model_uRI_feature", "_UI_Model_type"),
+        EvolutionPackage.Literals.MODEL__URI, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Root Package feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addRootPackagePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Model_rootPackage_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Model_rootPackage_feature", "_UI_Model_type"),
+        EvolutionPackage.Literals.MODEL__ROOT_PACKAGE, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the All Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addAllPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Model_allPackages_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Model_allPackages_feature", "_UI_Model_type"),
+        EvolutionPackage.Literals.MODEL__ALL_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Referenced Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addReferencedPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Model_referencedPackages_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_referencedPackages_feature", "_UI_Model_type"),
+        EvolutionPackage.Literals.MODEL__REFERENCED_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Missing Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addMissingPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Model_missingPackages_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Model_missingPackages_feature", "_UI_Model_type"),
+        EvolutionPackage.Literals.MODEL__MISSING_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(EvolutionPackage.Literals.MODEL__ROOT_PACKAGE);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean hasChildren(Object object)
+  {
+    return hasChildren(object, true);
+  }
+
+  /**
+   * This returns Model.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/Model"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    URI labelValue = ((Model)object).getURI();
+    String label = labelValue == null ? null : labelValue.toString();
+    StyledString styledLabel = new StyledString();
+    if (label == null || label.length() == 0)
+    {
+      styledLabel.append(getString("_UI_Model_type"), StyledString.Style.QUALIFIER_STYLER);
+    }
+    else
+    {
+      styledLabel.append(getString("_UI_Model_type"), StyledString.Style.QUALIFIER_STYLER).append(" " + label);
+    }
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Model.class))
+    {
+    case EvolutionPackage.MODEL__URI:
+    case EvolutionPackage.MODEL__ALL_PACKAGES:
+    case EvolutionPackage.MODEL__REFERENCED_PACKAGES:
+    case EvolutionPackage.MODEL__MISSING_PACKAGES:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    case EvolutionPackage.MODEL__ROOT_PACKAGE:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ((IChildCreationExtender)adapterFactory).getResourceLocator();
+  }
+
+  @Override
+  public Command createCommand(Object owner, EditingDomain domain, Class<? extends Command> commandClass, CommandParameter commandParameter)
+  {
+    if (commandClass == DragAndDropCommand.class)
+    {
+      // DragAndDropCommand.Detail detail = (DragAndDropCommand.Detail)commandParameter.getFeature();
+      Collection<?> collection = commandParameter.getCollection();
+      if (domain != null && collection.size() == 1 && commandParameter.getOwner() != domain.getResourceSet())
+      {
+        Object element = collection.iterator().next();
+        if (element instanceof URI)
+        {
+          URI uri = (URI)element;
+          return SetCommand.create(domain, owner, EvolutionPackage.Literals.MODEL__URI, uri);
+        }
+
+        // return createDragAndDropCommand(domain, commandParameter.getOwner(), detail.location, detail.operations,
+        // detail.operation,
+        // commandParameter.getCollection());
+      }
+    }
+
+    return super.createCommand(owner, domain, commandClass, commandParameter);
+  }
+
+  @Override
+  protected boolean isWrappingNeeded(Object object)
+  {
+    // Wrapping is always needed because of the derived cross reference 'rootPackage', which is shown as children.
+    return true;
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetChangeItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetChangeItemProvider.java
new file mode 100644
index 0000000..c0746ec
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetChangeItemProvider.java
@@ -0,0 +1,156 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.ModelSetChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelSetChangeItemProvider extends ChangeItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSetChangeItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addOldModelSetPropertyDescriptor(object);
+      addNewModelSetPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Old Model Set feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addOldModelSetPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_ModelSetChange_oldModelSet_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_ModelSetChange_oldModelSet_feature", "_UI_ModelSetChange_type"),
+        EvolutionPackage.Literals.MODEL_SET_CHANGE__OLD_MODEL_SET, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the New Model Set feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addNewModelSetPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_ModelSetChange_newModelSet_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_ModelSetChange_newModelSet_feature", "_UI_ModelSetChange_type"),
+        EvolutionPackage.Literals.MODEL_SET_CHANGE__NEW_MODEL_SET, true, false, true, null, null, null));
+  }
+
+  /**
+   * This returns ModelSetChange.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/ModelSetChange"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    return new StyledString(getString("_UI_ModelSetChange_type"));
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetItemProvider.java
new file mode 100644
index 0000000..7969d8e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ModelSetItemProvider.java
@@ -0,0 +1,196 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.ModelSet} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelSetItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
+    IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider, IItemStyledLabelProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSetItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(EvolutionPackage.Literals.MODEL_SET__CHANGE);
+      childrenFeatures.add(EvolutionPackage.Literals.MODEL_SET__MIGRATIONS);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean hasChildren(Object object)
+  {
+    return hasChildren(object, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    return new StyledString(getString("_UI_ModelSet_type"));
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(ModelSet.class))
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(EvolutionPackage.Literals.MODEL_SET__MIGRATIONS, EvolutionFactory.eINSTANCE.createFeaturePathMigration()));
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ((IChildCreationExtender)adapterFactory).getResourceLocator();
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/PropertyChangeItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/PropertyChangeItemProvider.java
new file mode 100644
index 0000000..cfa947d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/PropertyChangeItemProvider.java
@@ -0,0 +1,294 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.ENamedElement;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.PropertyChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class PropertyChangeItemProvider extends ChangeItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public PropertyChangeItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addFeaturePropertyDescriptor(object);
+      addOldValuePropertyDescriptor(object);
+      addNewValuePropertyDescriptor(object);
+      addKindPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Feature feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addFeaturePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_PropertyChange_feature_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_PropertyChange_feature_feature", "_UI_PropertyChange_type"),
+        EvolutionPackage.Literals.PROPERTY_CHANGE__FEATURE, true, false, true, null, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Old Value feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addOldValuePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_PropertyChange_oldValue_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_PropertyChange_oldValue_feature", "_UI_PropertyChange_type"),
+        EvolutionPackage.Literals.PROPERTY_CHANGE__OLD_VALUE, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the New Value feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addNewValuePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_PropertyChange_newValue_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_PropertyChange_newValue_feature", "_UI_PropertyChange_type"),
+        EvolutionPackage.Literals.PROPERTY_CHANGE__NEW_VALUE, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Kind feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addKindPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_PropertyChange_kind_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_PropertyChange_kind_feature", "_UI_PropertyChange_type"),
+        EvolutionPackage.Literals.PROPERTY_CHANGE__KIND, false, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This returns PropertyChange.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyChange"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    PropertyChange propertyChange = (PropertyChange)object;
+    EStructuralFeature feature = propertyChange.getFeature();
+
+    StyledString styledLabel = new StyledString();
+    if (feature != null)
+    {
+      String text = null;
+
+      EClass eClass = feature.getEContainingClass();
+      IItemPropertySource propertySource = (IItemPropertySource)getRootAdapterFactory().adapt(eClass, IItemPropertySource.class);
+      if (propertySource != null)
+      {
+        for (IItemPropertyDescriptor propertyDescriptor : propertySource.getPropertyDescriptors(eClass))
+        {
+          if (propertyDescriptor.getFeature(eClass) == feature)
+          {
+            text = propertyDescriptor.getDisplayName(eClass);
+            break;
+          }
+        }
+      }
+
+      if (text == null)
+      {
+        text = feature.getName();
+      }
+
+      ChangeKind kind = propertyChange.getKind();
+      if (kind == ChangeKind.ADDED || kind == ChangeKind.COPIED)
+      {
+        styledLabel.append(text, ElementChangeItemProvider.ADDITION_STYLER);
+      }
+      else if (kind == ChangeKind.REMOVED)
+      {
+        styledLabel.append(text, ElementChangeItemProvider.REMOVAL_STYLER);
+      }
+      else
+      {
+        styledLabel.append(text);
+      }
+    }
+    else
+    {
+      // Can't really happen.
+      styledLabel.append(getString("_UI_PropertyChange_type"), StyledString.Style.QUALIFIER_STYLER);
+    }
+
+    StringBuilder builder = new StringBuilder(" ");
+    formatValue(propertyChange.getOldValue(), builder);
+    builder.append(" \u279d ");
+    formatValue(propertyChange.getNewValue(), builder);
+
+    styledLabel.append(builder.toString(), StyledString.Style.DECORATIONS_STYLER);
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(PropertyChange.class))
+    {
+    case EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE:
+    case EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE:
+    case EvolutionPackage.PROPERTY_CHANGE__KIND:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+  private static void formatValue(Object value, StringBuilder builder)
+  {
+    if (value instanceof List<?>)
+    {
+      List<?> list = (List<?>)value;
+      boolean first = true;
+      for (Object element : list)
+      {
+        if (first)
+        {
+          first = false;
+        }
+        else
+        {
+          builder.append(", ");
+        }
+
+        formatValueSingle(element, builder);
+      }
+    }
+    else
+    {
+      formatValueSingle(value, builder);
+    }
+  }
+
+  private static void formatValueSingle(Object value, StringBuilder builder)
+  {
+    if (value instanceof ENamedElement)
+    {
+      builder.append(((ENamedElement)value).getName());
+    }
+    else
+    {
+      builder.append(String.valueOf(value));
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ReleaseItemProvider.java b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ReleaseItemProvider.java
new file mode 100644
index 0000000..2576c88
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.edit/src/org/eclipse/emf/cdo/evolution/provider/ReleaseItemProvider.java
@@ -0,0 +1,256 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.provider;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Release;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.StyledString;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.cdo.evolution.Release} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ReleaseItemProvider extends ModelSetItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ReleaseItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addVersionPropertyDescriptor(object);
+      addDatePropertyDescriptor(object);
+      addAllPackagesPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Date feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addDatePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Release_date_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Release_date_feature", "_UI_Release_type"),
+        EvolutionPackage.Literals.RELEASE__DATE, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the Version feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addVersionPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Release_version_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Release_version_feature", "_UI_Release_type"),
+        EvolutionPackage.Literals.RELEASE__VERSION, true, false, false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the All Packages feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addAllPackagesPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_Release_allPackages_feature"), getString("_UI_PropertyDescriptor_description", "_UI_Release_allPackages_feature", "_UI_Release_type"),
+        EvolutionPackage.Literals.RELEASE__ALL_PACKAGES, false, false, false, null, null, null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Collection<? extends EStructuralFeature> getChildrenFeaturesGen(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(EvolutionPackage.Literals.RELEASE__ROOT_PACKAGES);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    @SuppressWarnings("unchecked")
+    List<EStructuralFeature> childrenFeatures = (List<EStructuralFeature>)getChildrenFeaturesGen(object);
+
+    childrenFeatures.remove(EvolutionPackage.Literals.RELEASE__ROOT_PACKAGES);
+    childrenFeatures.add(0, EvolutionPackage.Literals.RELEASE__ROOT_PACKAGES);
+
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  @Override
+  protected boolean hasChildren(Object object, boolean optimized)
+  {
+    Release release = (Release)object;
+    return !release.getRootPackages().isEmpty();
+  }
+
+  /**
+   * This returns Release.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/Release"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    return ((StyledString)getStyledText(object)).getString();
+  }
+
+  /**
+   * This returns the label styled text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Object getStyledText(Object object)
+  {
+    StyledString styledLabel = new StyledString();
+    styledLabel.append(getString("_UI_Release_type"), StyledString.Style.QUALIFIER_STYLER);
+    styledLabel.append(" v" + ((Release)object).getVersion());
+
+    Date date = ((Release)object).getDate();
+    if (date != null)
+    {
+      styledLabel.append("  " + date.toString(), StyledString.Style.DECORATIONS_STYLER);
+    }
+
+    return styledLabel;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Release.class))
+    {
+    case EvolutionPackage.RELEASE__VERSION:
+    case EvolutionPackage.RELEASE__DATE:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+      return;
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+      return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(EvolutionPackage.Literals.RELEASE__ROOT_PACKAGES, EcoreFactory.eINSTANCE.createEPackage()));
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.classpath b/plugins/org.eclipse.emf.cdo.evolution.editor/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.project b/plugins/org.eclipse.emf.cdo.evolution.editor/.project
new file mode 100644
index 0000000..297c6f6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.project
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.cdo.evolution.editor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+      <arguments>
+      </arguments>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.oomph.version.VersionBuilder</name>
+      <arguments>
+        <dictionary>
+          <key>check.maven.pom</key>
+          <value>true</value>
+        </dictionary>
+        <dictionary>
+          <key>ignore.lower.bound.dependency.ranges</key>
+          <value>true</value>
+        </dictionary>
+        <dictionary>
+          <key>release.path</key>
+          <value>/org.eclipse.emf.cdo.releng/versions/release.xml</value>
+        </dictionary>
+      </arguments>
+    </buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+    <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+    <nature>org.eclipse.oomph.version.VersionNature</nature>
+	</natures>
+  <filteredResources>
+    <filter>
+      <id>1396938000000</id>
+      <name></name>
+      <type>10</type>
+      <matcher>
+        <id>org.eclipse.ui.ide.multiFilter</id>
+        <arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+      </matcher>
+    </filter>
+  </filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ff3d8e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,412 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,*.ucls,doc-files/,package.html,package-info.java
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=2
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=160
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.launching.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 0000000..556ed07
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+#Fri Sep 02 05:38:34 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=ignore
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..222aec0
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,119 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_EMFT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_EMFT
+formatter_settings_version=12
+org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=org.eclipse.emf.cdo;org.eclipse.emf.internal.cdo;org.eclipse.net4j;org.eclipse.internal.net4j;org.eclipse.emf;org.eclipse;com;org;javax;java;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment"/><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment"/><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment"/><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\r\n * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *    Eike Stepper - initial API and implementation\r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author Eike Stepper\r\n */</template><template autoinsert\="false" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment"/><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment"/><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment"/><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=true
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.ltk.core.refactoring.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..864e30f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.tasks.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..b050639
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.team.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644
index 0000000..97c11e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.mylyn.team.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+commit.comment.template=[${task.id}] ${task.description}\r\n\r\n${task.url}
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.api.tools.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..0c17d59
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,95 @@
+#Thu Feb 04 09:44:24 CET 2010
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+MISSING_EE_DESCRIPTIONS=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Ignore
+automatically_removed_unused_problem_filters=Disabled
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..fe01bb7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,31 @@
+#Thu Feb 04 09:44:24 CET 2010
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=2
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=1
+compilers.p.missing-version-import-package=1
+compilers.p.missing-version-require-bundle=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.evolution.editor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8d44202
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.emf.cdo.evolution.editor;singleton:=true
+Automatic-Module-Name: org.eclipse.emf.cdo.evolution.editor
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.emf.cdo.evolution.presentation.EvolutionEditorPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.emf.cdo.evolution.presentation;version="1.0.0",
+ org.eclipse.emf.cdo.evolution.presentation.quickfix;version="1.0.0"
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo.evolution.edit;bundle-version="[1.0.0,2.0.0)";visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.emf.edit.ui;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.jface.text;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.emf.ecore.edit;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.net4j.ui.shared;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.ecore.editor;bundle-version="[2.5.0,3.0.0)"
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/build.properties b/plugins/org.eclipse.emf.cdo.evolution.editor/build.properties
new file mode 100644
index 0000000..5fb0771
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/build.properties
@@ -0,0 +1,10 @@
+#
+
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/obj16/EvolutionModelFile.gif b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/obj16/EvolutionModelFile.gif
new file mode 100644
index 0000000..09bd7b3
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/obj16/EvolutionModelFile.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/NewEvolution.gif b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/NewEvolution.gif
new file mode 100644
index 0000000..e3b9c14
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/NewEvolution.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix.png b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix.png
new file mode 100644
index 0000000..87ef6f5
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix.png
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix@2x.png b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix@2x.png
new file mode 100644
index 0000000..1ce4928
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/icons/full/wizban/quick_fix@2x.png
Binary files differ
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.properties b/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.properties
new file mode 100644
index 0000000..bf42244
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.properties
@@ -0,0 +1,58 @@
+#
+
+pluginName = CDO Model Repository Evolution Editor
+providerName = Eclipse Modeling Project
+
+_UI_EvolutionEditor_menu = &Evolution Editor
+
+_UI_CreateChild_menu_item = &New Child
+_UI_CreateSibling_menu_item = N&ew Sibling
+
+_UI_ShowPropertiesView_menu_item = Show &Properties View
+_UI_RefreshViewer_menu_item = &Refresh
+
+_UI_SelectionPage_label = Selection
+
+_UI_NoObjectSelected = Selected Nothing
+_UI_SingleObjectSelected = Selected Object: {0}
+_UI_MultiObjectSelected = Selected {0} Objects
+
+_UI_OpenEditorError_label = Open Editor
+
+_UI_Wizard_category = Example EMF Model Creation Wizards
+
+_UI_CreateModelError_message = Problems encountered in file "{0}"
+
+_UI_EvolutionModelWizard_label = Evolution Model
+_UI_EvolutionModelWizard_description = Create a new Evolution model
+
+_UI_EvolutionEditor_label = Evolution Model Editor
+
+_UI_EvolutionEditorFilenameDefaultBase = My
+_UI_EvolutionEditorFilenameExtensions = evolution
+
+_UI_Wizard_label = New
+
+_WARN_FilenameExtension = The file name must end in ''.{0}''
+_WARN_FilenameExtensions = The file name must have one of the following extensions: {0}
+
+_UI_ModelObject = &Model Object
+_UI_XMLEncoding = &XML Encoding
+_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
+_UI_Wizard_initial_object_description = Select a model object to create
+
+_UI_FileConflict_label = File Conflict
+_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
+
+_UI_ValidatingPhase_message = Validating phase {0}
+
+_QF_SelectModelsFromWorkspace = Select one or more models from the workspace
+_QF_SelectModelFromWorkspace = Select a model from the workspace
+_QF_PackageMissing = Add the model ''{0}'' to the evolution
+_QF_SetVersionIntoNamespace = Set the upcoming version v{0} into the namespace URI
+_QF_DisableUniqueNamespaceEnforcement = Disable enforcement of unique namespace URIs in this evolution
+_QF_AssignID = Assign a new ID
+_QF_RememberID = Remember the old ID and assign a new ID
+_QF_ReplaceID = Replace the existing ID with a new ID
+_QF_SpecifyFeaturePath = Specify the feature path for the {0} feature ''{1}''
+_QF_CreateRelease = Create the v{0} release
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.xml b/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.xml
new file mode 100644
index 0000000..a1def40
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/plugin.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.net4j.util.factories">
+      <factory
+            productGroup="org.eclipse.emf.cdo.evolution.diagnosticResolutionGenerators"
+            type="default"
+            class="org.eclipse.emf.cdo.evolution.presentation.quickfix.DefaultDiagnosticResolutionGenerator$Factory"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.newWizards">
+      <!-- @generated evolution -->
+      <category
+            id="org.eclipse.emf.ecore.Wizard.category.ID"
+            name="%_UI_Wizard_category"/>
+      <wizard
+            id="org.eclipse.emf.cdo.evolution.presentation.EvolutionModelWizardID"
+            name="%_UI_EvolutionModelWizard_label"
+            class="org.eclipse.emf.cdo.evolution.presentation.EvolutionModelWizard"
+            category="org.eclipse.emf.ecore.Wizard.category.ID"
+            icon="icons/full/obj16/EvolutionModelFile.gif">
+         <description>%_UI_EvolutionModelWizard_description</description>
+         <selection class="org.eclipse.core.resources.IResource"/>
+      </wizard>
+   </extension>
+
+   <extension point="org.eclipse.ui.editors">
+      <!-- @generated evolution -->
+      <editor
+            id="org.eclipse.emf.cdo.evolution.presentation.EvolutionEditorID"
+            name="%_UI_EvolutionEditor_label"
+            icon="icons/full/obj16/EvolutionModelFile.gif"
+            extensions="evolution"
+            class="org.eclipse.emf.cdo.evolution.presentation.EvolutionEditor"
+            contributorClass="org.eclipse.emf.cdo.evolution.presentation.EvolutionActionBarContributor">
+      </editor>
+   </extension>
+   
+</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionActionBarContributor.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionActionBarContributor.java
new file mode 100644
index 0000000..bb58637
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionActionBarContributor.java
@@ -0,0 +1,812 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.presentation;
+
+import org.eclipse.emf.cdo.evolution.util.ElementHandler;
+import org.eclipse.emf.cdo.evolution.util.ElementRunnable;
+import org.eclipse.emf.cdo.evolution.util.IDAnnotation;
+
+import org.eclipse.emf.common.ui.action.ViewerFilterAction;
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.ETypeParameter;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.presentation.EcoreEditorPlugin;
+import org.eclipse.emf.edit.command.ChangeCommand;
+import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.edit.ui.action.CollapseAllAction;
+import org.eclipse.emf.edit.ui.action.ControlAction;
+import org.eclipse.emf.edit.ui.action.CreateChildAction;
+import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.emf.edit.ui.action.FindAction;
+import org.eclipse.emf.edit.ui.action.LoadResourceAction;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.SubContributionItem;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * This is the action bar contributor for the Evolution model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener
+{
+  /**
+   * This keeps track of the active editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IEditorPart activeEditorPart;
+
+  /**
+   * This keeps track of the current selection provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelectionProvider selectionProvider;
+
+  /**
+   * This action opens the Properties view.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IAction showPropertiesViewAction = new Action(EvolutionEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item"))
+  {
+    @Override
+    public void run()
+    {
+      try
+      {
+        getPage().showView("org.eclipse.ui.views.PropertySheet");
+      }
+      catch (PartInitException exception)
+      {
+        EvolutionEditorPlugin.INSTANCE.log(exception);
+      }
+    }
+  };
+
+  /**
+   * This action refreshes the viewer of the current editor if the editor
+   * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IAction refreshViewerAction = new Action(EvolutionEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item"))
+  {
+    @Override
+    public boolean isEnabled()
+    {
+      return activeEditorPart instanceof IViewerProvider;
+    }
+
+    @Override
+    public void run()
+    {
+      if (activeEditorPart instanceof IViewerProvider)
+      {
+        Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();
+        if (viewer != null)
+        {
+          viewer.refresh();
+        }
+      }
+    }
+  };
+
+  protected IAction assignIDsAction = new IDAction("Assign IDs")
+  {
+    @Override
+    protected void handleID(EModelElement modelElement)
+    {
+      IDAnnotation.ensureValue(modelElement);
+    }
+  };
+
+  protected IAction removeIDsAction = new IDAction("Remove IDs")
+  {
+    @Override
+    protected void handleID(EModelElement modelElement)
+    {
+      IDAnnotation.removeFrom(modelElement);
+    }
+  };
+
+  /**
+   * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor
+   * generated for the current selection by the item provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> createChildActions;
+
+  /**
+   * This is the menu manager into which menu contribution items should be added for CreateChild actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IMenuManager createChildMenuManager;
+
+  /**
+   * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor
+   * generated for the current selection by the item provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> createSiblingActions;
+
+  /**
+   * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IMenuManager createSiblingMenuManager;
+
+  protected SelectionChangedEvent lastSelectionChangedEvent;
+
+  protected ViewerFilterAction showGenericsAction = new ViewerFilterAction(EcoreEditorPlugin.INSTANCE.getString("_UI_ShowGenerics_menu_item"),
+      IAction.AS_CHECK_BOX)
+  {
+    @Override
+    protected void refreshViewers()
+    {
+      if (activeEditorPart instanceof EvolutionEditor)
+      {
+        ((EvolutionEditor)activeEditorPart).ecoreItemProviderAdapterFactory.setShowGenerics(isChecked());
+      }
+
+      super.refreshViewers();
+
+      if (lastSelectionChangedEvent != null && activeEditorPart instanceof EvolutionEditor)
+      {
+        selectionChanged(lastSelectionChangedEvent);
+      }
+    }
+
+    @Override
+    public boolean select(Viewer viewer, Object parentElement, Object element)
+    {
+      return isChecked() || !(element instanceof ETypeParameter || element instanceof EGenericType);
+    }
+  };
+
+  /**
+   * This creates an instance of the contributor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EvolutionActionBarContributor()
+  {
+    super(ADDITIONS_LAST_STYLE);
+    loadResourceAction = new LoadResourceAction();
+    // validateAction = new ValidateAction();
+    liveValidationAction = new DiagnosticDecorator.LiveValidator.LiveValidationAction(EvolutionEditorPlugin.getPlugin().getDialogSettings());
+    controlAction = new ControlAction();
+    findAction = FindAction.create();
+    collapseAllAction = new CollapseAllAction();
+
+    showGenericsAction.setChecked(Boolean.parseBoolean(EcoreEditorPlugin.getPlugin().getDialogSettings().get("showGenericsAction")));
+  }
+
+  public void showGenerics(boolean isChecked)
+  {
+    if (showGenericsAction != null)
+    {
+      showGenericsAction.setChecked(isChecked);
+    }
+  }
+
+  @Override
+  public void dispose()
+  {
+    EcoreEditorPlugin.getPlugin().getDialogSettings().put("showGenericsAction", Boolean.toString(showGenericsAction.isChecked()));
+
+    super.dispose();
+  }
+
+  /**
+   * This adds Separators for editor additions to the tool bar.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public void contributeToToolBar(IToolBarManager toolBarManager)
+  {
+    super.contributeToToolBar(toolBarManager);
+    toolBarManager.add(new Separator("evolution-settings"));
+    toolBarManager.add(new Separator("evolution-additions"));
+    toolBarManager.add(assignIDsAction);
+    toolBarManager.add(removeIDsAction);
+  }
+
+  /**
+   * This adds to the menu bar a menu and some separators for editor additions,
+   * as well as the sub-menus for object creation items.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public void contributeToMenu(IMenuManager menuManager)
+  {
+    super.contributeToMenu(menuManager);
+
+    IMenuManager submenuManager = new MenuManager(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionEditor_menu"), "org.eclipse.emf.cdo.evolutionMenuID");
+    menuManager.insertAfter("additions", submenuManager);
+    submenuManager.add(new Separator("settings"));
+    submenuManager.add(new Separator("actions"));
+    submenuManager.add(new Separator("additions"));
+    submenuManager.add(new Separator("additions-end"));
+
+    // Prepare for CreateChild item addition or removal.
+    //
+    createChildMenuManager = new MenuManager(EvolutionEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+    submenuManager.insertBefore("additions", createChildMenuManager);
+
+    // Prepare for CreateSibling item addition or removal.
+    //
+    createSiblingMenuManager = new MenuManager(EvolutionEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+    submenuManager.insertBefore("additions", createSiblingMenuManager);
+
+    // Force an update because Eclipse hides empty menus now.
+    //
+    submenuManager.addMenuListener(new IMenuListener()
+    {
+      public void menuAboutToShow(IMenuManager menuManager)
+      {
+        menuManager.updateAll(true);
+      }
+    });
+
+    addGlobalActions(submenuManager);
+    submenuManager.insertBefore("additions-end", showGenericsAction);
+  }
+
+  /**
+   * When the active editor changes, this remembers the change and registers with it as a selection provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setActiveEditorGen(IEditorPart part)
+  {
+    super.setActiveEditor(part);
+    activeEditorPart = part;
+
+    // Switch to the new selection provider.
+    //
+    if (selectionProvider != null)
+    {
+      selectionProvider.removeSelectionChangedListener(this);
+    }
+    if (part == null)
+    {
+      selectionProvider = null;
+    }
+    else
+    {
+      selectionProvider = part.getSite().getSelectionProvider();
+      selectionProvider.addSelectionChangedListener(this);
+
+      // Fake a selection changed event to update the menus.
+      //
+      if (selectionProvider.getSelection() != null)
+      {
+        selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));
+      }
+    }
+  }
+
+  /**
+   * When the active editor changes, this remembers the change and registers with it as a selection provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public void setActiveEditor(IEditorPart part)
+  {
+    setActiveEditorGen(part);
+
+    if (part instanceof EvolutionEditor)
+    {
+      showGenericsAction.addViewer(((EvolutionEditor)part).getViewer());
+      showGenericsAction.setEnabled(true);
+    }
+    else
+    {
+      showGenericsAction.setEnabled(false);
+    }
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
+   * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
+   * that can be added to the selected object and updating the menus accordingly.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    // Remove any menu items for old selection.
+    //
+    if (createChildMenuManager != null)
+    {
+      depopulateManager(createChildMenuManager, createChildActions);
+    }
+    if (createSiblingMenuManager != null)
+    {
+      depopulateManager(createSiblingMenuManager, createSiblingActions);
+    }
+
+    // Query the new selection for appropriate new child/sibling descriptors
+    //
+    Collection<?> newChildDescriptors = null;
+    Collection<?> newSiblingDescriptors = null;
+
+    ISelection selection = event.getSelection();
+    if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1)
+    {
+      Object object = ((IStructuredSelection)selection).getFirstElement();
+
+      EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
+
+      newChildDescriptors = domain.getNewChildDescriptors(object, null);
+      newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
+    }
+
+    // Generate actions for selection; populate and redraw the menus.
+    //
+    createChildActions = generateCreateChildActions(newChildDescriptors, selection);
+    createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
+
+    if (createChildMenuManager != null)
+    {
+      populateManager(createChildMenuManager, createChildActions, null);
+      createChildMenuManager.update(true);
+    }
+    if (createSiblingMenuManager != null)
+    {
+      populateManager(createSiblingMenuManager, createSiblingActions, null);
+      createSiblingMenuManager.update(true);
+    }
+  }
+
+  /**
+   * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,
+   * and returns the collection of these actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection)
+  {
+    Collection<IAction> actions = new ArrayList<IAction>();
+    if (descriptors != null)
+    {
+      for (Object descriptor : descriptors)
+      {
+        if (!showGenericsAction.isChecked() && descriptor instanceof CommandParameter)
+        {
+          Object feature = ((CommandParameter)descriptor).getFeature();
+          if (isGenericFeature(feature))
+          {
+            continue;
+          }
+        }
+        actions.add(new EcoreCreateChildAction(activeEditorPart, selection, descriptor));
+      }
+    }
+    return actions;
+  }
+
+  /**
+   * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,
+   * and returns the collection of these actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection)
+  {
+    Collection<IAction> actions = new ArrayList<IAction>();
+    if (descriptors != null)
+    {
+      for (Object descriptor : descriptors)
+      {
+        if (!showGenericsAction.isChecked() && descriptor instanceof CommandParameter)
+        {
+          Object feature = ((CommandParameter)descriptor).getFeature();
+          if (isGenericFeature(feature))
+          {
+            continue;
+          }
+        }
+        actions.add(new EcoreCreateSiblingAction(activeEditorPart, selection, descriptor));
+      }
+    }
+    return actions;
+  }
+
+  protected boolean isGenericFeature(Object feature)
+  {
+    return feature == EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES || feature == EcorePackage.Literals.ECLASSIFIER__ETYPE_PARAMETERS
+        || feature == EcorePackage.Literals.EOPERATION__EGENERIC_EXCEPTIONS || feature == EcorePackage.Literals.EOPERATION__ETYPE_PARAMETERS
+        || feature == EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE;
+  }
+
+  /**
+   * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s
+   * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,
+   * by inserting them before the specified contribution item <code>contributionID</code>.
+   * If <code>contributionID</code> is <code>null</code>, they are simply added.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID)
+  {
+    if (actions != null)
+    {
+      // Look for actions that create EAnnotations.
+      //
+      Set<IAction> ignoredActions = new HashSet<IAction>();
+      Set<IAction> annotationActions = new LinkedHashSet<IAction>();
+      for (IAction action : actions)
+      {
+        if (action instanceof EObjectProvider)
+        {
+          EObjectProvider eObjectProvider = (EObjectProvider)action;
+          EObject eObject = eObjectProvider.getEObject();
+          if (eObject instanceof EAnnotation)
+          {
+            annotationActions.add(action);
+            ignoredActions.add(action);
+          }
+        }
+      }
+
+      // If there is more than one action that creates an annotation...
+      //
+      if (annotationActions.size() > 1)
+      {
+        // Create a menu manager to group them.
+        // This assumes the first action is one for the null source.
+        //
+        IAction action = annotationActions.iterator().next();
+        String actionText = action.getText();
+        MenuManager annotationMenuManager = new MenuManager(actionText, action.getImageDescriptor(), "annotations");
+
+        // Add that menu manager instead of the individual actions.
+        if (contributionID != null)
+        {
+          manager.insertBefore(contributionID, annotationMenuManager);
+        }
+        else
+        {
+          manager.add(annotationMenuManager);
+        }
+
+        // Add an item for each annotation action.
+        //
+        for (IAction annotationAction : annotationActions)
+        {
+          annotationMenuManager.add(annotationAction);
+          String source = ((EAnnotation)((EObjectProvider)annotationAction).getEObject()).getSource();
+          if (source != null)
+          {
+            // Set the label to include the source.
+            //
+            annotationAction.setText(actionText + " - " + source);
+          }
+        }
+      }
+      else
+      {
+        ignoredActions.clear();
+      }
+
+      for (IAction action : actions)
+      {
+        if (!ignoredActions.contains(action))
+        {
+          if (contributionID != null)
+          {
+            manager.insertBefore(contributionID, action);
+          }
+          else
+          {
+            manager.add(action);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s
+   * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions)
+  {
+    if (actions != null)
+    {
+      IContributionItem[] items = manager.getItems();
+      for (int i = 0; i < items.length; i++)
+      {
+        // Look into SubContributionItems
+        //
+        IContributionItem contributionItem = items[i];
+        while (contributionItem instanceof SubContributionItem)
+        {
+          contributionItem = ((SubContributionItem)contributionItem).getInnerItem();
+        }
+
+        // Delete the ActionContributionItems with matching action.
+        //
+        if (contributionItem instanceof ActionContributionItem)
+        {
+          IAction action = ((ActionContributionItem)contributionItem).getAction();
+          if (actions.contains(action))
+          {
+            manager.remove(contributionItem);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * This populates the pop-up menu before it appears.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void menuAboutToShow(IMenuManager menuManager)
+  {
+    super.menuAboutToShow(menuManager);
+    MenuManager submenuManager = null;
+
+    submenuManager = new MenuManager(EvolutionEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+    populateManager(submenuManager, createChildActions, null);
+    menuManager.insertBefore("edit", submenuManager);
+
+    submenuManager = new MenuManager(EvolutionEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+    populateManager(submenuManager, createSiblingActions, null);
+    menuManager.insertBefore("edit", submenuManager);
+  }
+
+  /**
+   * This inserts global actions before the "additions-end" separator.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void addGlobalActions(IMenuManager menuManager)
+  {
+    menuManager.insertAfter("additions-end", new Separator("ui-actions"));
+    menuManager.insertAfter("ui-actions", showPropertiesViewAction);
+
+    refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
+    menuManager.insertAfter("ui-actions", refreshViewerAction);
+
+    super.addGlobalActions(menuManager);
+  }
+
+  /**
+   * This ensures that a delete action will clean up all references to deleted objects.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean removeAllReferencesOnDelete()
+  {
+    return true;
+  }
+
+  /**
+   * An interface implemented by {@link EcoreCreateChildAction} and {@link EcoreCreateSiblingAction} to provide access to the data in the descriptor.
+   */
+  public interface EObjectProvider
+  {
+    public EObject getEObject();
+  }
+
+  /**
+   * A create child action subclass that provides access to the {@link #descriptor} and specializes {@link #run()} to show the properties view.
+   */
+  public class EcoreCreateChildAction extends CreateChildAction implements EObjectProvider
+  {
+    public EcoreCreateChildAction(IWorkbenchPart workbenchPart, ISelection selection, Object descriptor)
+    {
+      super(workbenchPart, selection, descriptor);
+    }
+
+    public EObject getEObject()
+    {
+      if (descriptor instanceof CommandParameter)
+      {
+        CommandParameter commandParameter = (CommandParameter)descriptor;
+        return commandParameter.getEValue();
+      }
+      else
+      {
+        return null;
+      }
+    }
+
+    @Override
+    public void run()
+    {
+      super.run();
+
+      // This is dispatched twice because the command stack listener dispatches once and then the viewer selection is
+      // also dispatches once,
+      // and we need to delay until the selection is established.
+      //
+      final Display display = getPage().getWorkbenchWindow().getShell().getDisplay();
+      display.asyncExec(new Runnable()
+      {
+        public void run()
+        {
+          display.asyncExec(new Runnable()
+          {
+            public void run()
+            {
+              showPropertiesViewAction.run();
+            }
+          });
+        }
+      });
+    }
+  }
+
+  /**
+   * A create sibling action subclass that provides access to the {@link #descriptor} and specializes {@link #run()} to show the properties view.
+   */
+  public class EcoreCreateSiblingAction extends CreateSiblingAction implements EObjectProvider
+  {
+    public EcoreCreateSiblingAction(IWorkbenchPart workbenchPart, ISelection selection, Object descriptor)
+    {
+      super(workbenchPart, selection, descriptor);
+    }
+
+    public EObject getEObject()
+    {
+      if (descriptor instanceof CommandParameter)
+      {
+        CommandParameter commandParameter = (CommandParameter)descriptor;
+        return commandParameter.getEValue();
+      }
+      else
+      {
+        return null;
+      }
+    }
+
+    @Override
+    public void run()
+    {
+      super.run();
+
+      // This is dispatched twice because the command stack listener dispatches once and then the viewer selection is
+      // also dispatches once,
+      // and we need to delay until the selection is established.
+      //
+      final Display display = getPage().getWorkbenchWindow().getShell().getDisplay();
+      display.asyncExec(new Runnable()
+      {
+        public void run()
+        {
+          display.asyncExec(new Runnable()
+          {
+            public void run()
+            {
+              showPropertiesViewAction.run();
+            }
+          });
+        }
+      });
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private abstract class IDAction extends Action
+  {
+    public IDAction(String text)
+    {
+      super(text);
+    }
+
+    @Override
+    public void run()
+    {
+      if (selectionProvider != null)
+      {
+        ISelection selection = selectionProvider.getSelection();
+        if (selection instanceof IStructuredSelection)
+        {
+          IStructuredSelection ssel = (IStructuredSelection)selection;
+          final Object element = ssel.getFirstElement();
+          if (element instanceof EModelElement)
+          {
+            final EModelElement rootElement = (EModelElement)element;
+
+            EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
+            ChangeCommand command = new ChangeCommand(rootElement)
+            {
+              @Override
+              protected void doExecute()
+              {
+                ElementHandler.execute(rootElement, new ElementRunnable()
+                {
+                  public void run(EModelElement modelElement)
+                  {
+                    handleID(modelElement);
+                  }
+                });
+              }
+            };
+
+            domain.getCommandStack().execute(command);
+          }
+        }
+      }
+    }
+
+    protected abstract void handleID(EModelElement modelElement);
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditor.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditor.java
new file mode 100644
index 0000000..bff82ec
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditor.java
@@ -0,0 +1,3024 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.presentation;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.impl.EvolutionImpl;
+import org.eclipse.emf.cdo.evolution.presentation.quickfix.DiagnosticResolution;
+import org.eclipse.emf.cdo.evolution.presentation.quickfix.QuickFixWizard;
+import org.eclipse.emf.cdo.evolution.provider.EvolutionItemProviderAdapterFactory;
+import org.eclipse.emf.cdo.evolution.util.DiagnosticID;
+import org.eclipse.emf.cdo.evolution.util.ElementHandler;
+import org.eclipse.emf.cdo.evolution.util.ValidationContext;
+import org.eclipse.emf.cdo.evolution.util.ValidationPhase;
+
+import org.eclipse.net4j.ui.shared.SharedIcons;
+import org.eclipse.net4j.util.ReflectUtil;
+import org.eclipse.net4j.util.StringUtil;
+import org.eclipse.net4j.util.WrappedException;
+
+import org.eclipse.emf.common.command.AbstractCommand;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.command.CommandStackListener;
+import org.eclipse.emf.common.command.UnexecutableCommand;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.ui.ImageURIRegistry;
+import org.eclipse.emf.common.ui.MarkerHelper;
+import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
+import org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport;
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.ETypeParameter;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.Diagnostician;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.EObjectValidator;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
+import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
+import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
+import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
+import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider;
+import org.eclipse.emf.edit.ui.provider.DelegatingStyledCellLabelProvider;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator.DiagnosticAdapter;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator.LiveValidator;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+import org.eclipse.emf.edit.ui.provider.PropertySource;
+import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
+import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
+import org.eclipse.emf.edit.ui.util.EditUIUtil;
+import org.eclipse.emf.edit.ui.util.FindAndReplaceTarget;
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Adapters;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.IFindReplaceTarget;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySheetEntry;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheetSorter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This is an example of a Evolution model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionEditor extends MultiPageEditorPart implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker
+{
+  /**
+   * This keeps track of the editing domain that is used to track all changes to the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected AdapterFactoryEditingDomain editingDomain;
+
+  /**
+   * This is the one adapter factory used for providing views of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ComposedAdapterFactory adapterFactory;
+
+  /**
+   * This is the content outline page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IContentOutlinePage contentOutlinePage;
+
+  /**
+   * This is a kludge...
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IStatusLineManager contentOutlineStatusLineManager;
+
+  /**
+   * This is the content outline page's viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TreeViewer contentOutlineViewer;
+
+  /**
+   * This is the property sheet page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected List<PropertySheetPage> propertySheetPages = new ArrayList<PropertySheetPage>();
+
+  /**
+   * This is the viewer that shadows the selection in the content outline.
+   * The parent relation must be correctly defined for this to work.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TreeViewer selectionViewer;
+
+  /**
+   * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Viewer currentViewer;
+
+  /**
+   * This listens to which ever viewer is active.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelectionChangedListener selectionChangedListener;
+
+  /**
+   * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
+
+  /**
+   * This keeps track of the selection of the editor as a whole.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelection editorSelection = StructuredSelection.EMPTY;
+
+  /**
+   * The MarkerHelper is responsible for creating workspace resource markers presented
+   * in Eclipse's Problems View.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected MarkerHelper markerHelper = new EditUIMarkerHelper();
+
+  /**
+   * This listens for when the outline becomes active
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IPartListener partListener = new IPartListener()
+  {
+    public void partActivated(IWorkbenchPart p)
+    {
+      if (p instanceof ContentOutline)
+      {
+        if (((ContentOutline)p).getCurrentPage() == contentOutlinePage)
+        {
+          getActionBarContributor().setActiveEditor(EvolutionEditor.this);
+
+          setCurrentViewer(contentOutlineViewer);
+        }
+      }
+      else if (p instanceof PropertySheet)
+      {
+        if (propertySheetPages.contains(((PropertySheet)p).getCurrentPage()))
+        {
+          getActionBarContributor().setActiveEditor(EvolutionEditor.this);
+          handleActivate();
+        }
+      }
+      else if (p == EvolutionEditor.this)
+      {
+        handleActivate();
+      }
+    }
+
+    public void partBroughtToTop(IWorkbenchPart p)
+    {
+      // Ignore.
+    }
+
+    public void partClosed(IWorkbenchPart p)
+    {
+      // Ignore.
+    }
+
+    public void partDeactivated(IWorkbenchPart p)
+    {
+      // Ignore.
+    }
+
+    public void partOpened(IWorkbenchPart p)
+    {
+      // Ignore.
+    }
+  };
+
+  /**
+   * Resources that have been removed since last activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+  /**
+   * Resources that have been changed since last activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> changedResources = new ArrayList<Resource>();
+
+  /**
+   * Resources that have been saved.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> savedResources = new ArrayList<Resource>();
+
+  /**
+   * Map to store the diagnostic associated with a resource.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();
+
+  /**
+   * Controls whether the problem indication should be updated.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean updateProblemIndication = true;
+
+  /**
+   * Adapter used to update the problem indication when resources are demanded loaded.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EContentAdapter problemIndicationAdapter = new EContentAdapter()
+  {
+    protected boolean dispatching;
+
+    @Override
+    public void notifyChanged(Notification notification)
+    {
+      if (notification.getNotifier() instanceof Resource)
+      {
+        switch (notification.getFeatureID(Resource.class))
+        {
+        case Resource.RESOURCE__IS_LOADED:
+        case Resource.RESOURCE__ERRORS:
+        case Resource.RESOURCE__WARNINGS:
+        {
+          Resource resource = (Resource)notification.getNotifier();
+          Diagnostic diagnostic = analyzeResourceProblems(resource, null);
+          if (diagnostic.getSeverity() != Diagnostic.OK)
+          {
+            resourceToDiagnosticMap.put(resource, diagnostic);
+          }
+          else
+          {
+            resourceToDiagnosticMap.remove(resource);
+          }
+          dispatchUpdateProblemIndication();
+          break;
+        }
+        }
+      }
+      else
+      {
+        super.notifyChanged(notification);
+      }
+    }
+
+    protected void dispatchUpdateProblemIndication()
+    {
+      if (updateProblemIndication && !dispatching)
+      {
+        dispatching = true;
+        getSite().getShell().getDisplay().asyncExec(new Runnable()
+        {
+          public void run()
+          {
+            dispatching = false;
+            updateProblemIndication();
+          }
+        });
+      }
+    }
+
+    @Override
+    protected void setTarget(Resource target)
+    {
+      basicSetTarget(target);
+    }
+
+    @Override
+    protected void unsetTarget(Resource target)
+    {
+      basicUnsetTarget(target);
+      resourceToDiagnosticMap.remove(target);
+      dispatchUpdateProblemIndication();
+    }
+  };
+
+  /**
+   * This listens for workspace changes.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener()
+  {
+    public void resourceChanged(IResourceChangeEvent event)
+    {
+      IResourceDelta delta = event.getDelta();
+      try
+      {
+        class ResourceDeltaVisitor implements IResourceDeltaVisitor
+        {
+          protected ResourceSet resourceSet = editingDomain.getResourceSet();
+
+          protected Collection<Resource> changedResources = new ArrayList<Resource>();
+
+          protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+          public boolean visit(final IResourceDelta delta)
+          {
+            if (delta.getResource().getType() == IResource.FILE)
+            {
+              if (delta.getKind() == IResourceDelta.REMOVED || delta.getKind() == IResourceDelta.CHANGED)
+              {
+                final Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
+                if (resource != null)
+                {
+                  if (delta.getKind() == IResourceDelta.REMOVED)
+                  {
+                    removedResources.add(resource);
+                  }
+                  else
+                  {
+                    if ((delta.getFlags() & IResourceDelta.MARKERS) != 0)
+                    {
+                      DiagnosticDecorator.Styled.DiagnosticAdapter.update(resource,
+                          markerHelper.getMarkerDiagnostics(resource, (IFile)delta.getResource(), false));
+                    }
+                    if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
+                    {
+                      if (!savedResources.remove(resource))
+                      {
+                        changedResources.add(resource);
+                      }
+                    }
+                  }
+                }
+              }
+              return false;
+            }
+
+            return true;
+          }
+
+          public Collection<Resource> getChangedResources()
+          {
+            return changedResources;
+          }
+
+          public Collection<Resource> getRemovedResources()
+          {
+            return removedResources;
+          }
+        }
+
+        final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+        delta.accept(visitor);
+
+        if (!visitor.getRemovedResources().isEmpty())
+        {
+          getSite().getShell().getDisplay().asyncExec(new Runnable()
+          {
+            public void run()
+            {
+              removedResources.addAll(visitor.getRemovedResources());
+              if (!isDirty())
+              {
+                getSite().getPage().closeEditor(EvolutionEditor.this, false);
+              }
+            }
+          });
+        }
+
+        if (!visitor.getChangedResources().isEmpty())
+        {
+          getSite().getShell().getDisplay().asyncExec(new Runnable()
+          {
+            public void run()
+            {
+              changedResources.addAll(visitor.getChangedResources());
+              if (getSite().getPage().getActiveEditor() == EvolutionEditor.this)
+              {
+                handleActivate();
+              }
+            }
+          });
+        }
+      }
+      catch (CoreException exception)
+      {
+        EvolutionEditorPlugin.INSTANCE.log(exception);
+      }
+    }
+  };
+
+  protected EcoreItemProviderAdapterFactory ecoreItemProviderAdapterFactory;
+
+  private TableViewer problemViewer;
+
+  private final Set<Object> readOnlyObjects = new HashSet<Object>();
+
+  private Evolution evolution;
+
+  private Diagnostic[] allDiagnostics;
+
+  /**
+   * Handles activation of the editor or it's associated views.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void handleActivate()
+  {
+    // Recompute the read only state.
+    //
+    if (editingDomain.getResourceToReadOnlyMap() != null)
+    {
+      editingDomain.getResourceToReadOnlyMap().clear();
+
+      // Refresh any actions that may become enabled or disabled.
+      //
+      setSelection(getSelection());
+    }
+
+    if (!removedResources.isEmpty())
+    {
+      if (handleDirtyConflict())
+      {
+        getSite().getPage().closeEditor(EvolutionEditor.this, false);
+      }
+      else
+      {
+        removedResources.clear();
+        changedResources.clear();
+        savedResources.clear();
+      }
+    }
+    else if (!changedResources.isEmpty())
+    {
+      changedResources.removeAll(savedResources);
+      handleChangedResources();
+      changedResources.clear();
+      savedResources.clear();
+    }
+  }
+
+  /**
+   * Handles what to do with changed resources on activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void handleChangedResources()
+  {
+    if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict()))
+    {
+      ResourceSet resourceSet = editingDomain.getResourceSet();
+      if (isDirty())
+      {
+        changedResources.addAll(resourceSet.getResources());
+      }
+      editingDomain.getCommandStack().flush();
+
+      updateProblemIndication = false;
+      for (Resource resource : changedResources)
+      {
+        if (resource.isLoaded())
+        {
+          resource.unload();
+          try
+          {
+            resource.load(resourceSet.getLoadOptions());
+          }
+          catch (IOException exception)
+          {
+            if (!resourceToDiagnosticMap.containsKey(resource))
+            {
+              resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+            }
+          }
+        }
+      }
+
+      if (AdapterFactoryEditingDomain.isStale(editorSelection))
+      {
+        setSelection(StructuredSelection.EMPTY);
+      }
+
+      updateProblemIndication = true;
+      updateProblemIndication();
+    }
+  }
+
+  /**
+   * Updates the problems indication with the information described in the specified diagnostic.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void updateProblemIndication()
+  {
+    if (updateProblemIndication)
+    {
+      BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK, "org.eclipse.emf.cdo.evolution.editor", 0, null,
+          new Object[] { editingDomain.getResourceSet() });
+      for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values())
+      {
+        if (childDiagnostic.getSeverity() != Diagnostic.OK)
+        {
+          diagnostic.add(childDiagnostic);
+        }
+      }
+
+      int lastEditorPage = getPageCount() - 1;
+      if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart)
+      {
+        ((ProblemEditorPart)getEditor(lastEditorPage)).setDiagnostic(diagnostic);
+        if (diagnostic.getSeverity() != Diagnostic.OK)
+        {
+          setActivePage(lastEditorPage);
+        }
+      }
+      else if (diagnostic.getSeverity() != Diagnostic.OK)
+      {
+        ProblemEditorPart problemEditorPart = new ProblemEditorPart();
+        problemEditorPart.setDiagnostic(diagnostic);
+        problemEditorPart.setMarkerHelper(markerHelper);
+        try
+        {
+          addPage(++lastEditorPage, problemEditorPart, getEditorInput());
+          setPageText(lastEditorPage, problemEditorPart.getPartName());
+          setActivePage(lastEditorPage);
+          showTabs();
+        }
+        catch (PartInitException exception)
+        {
+          EvolutionEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+
+      if (markerHelper.hasMarkers(editingDomain.getResourceSet()))
+      {
+        try
+        {
+          markerHelper.updateMarkers(diagnostic);
+        }
+        catch (CoreException exception)
+        {
+          EvolutionEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+    }
+  }
+
+  /**
+   * Shows a dialog that asks if conflicting changes should be discarded.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean handleDirtyConflict()
+  {
+    return MessageDialog.openQuestion(getSite().getShell(), getString("_UI_FileConflict_label"), getString("_WARN_FileConflict"));
+  }
+
+  /**
+   * This creates a model editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionEditor()
+  {
+    super();
+    initializeEditingDomain();
+  }
+
+  /**
+   * This sets up the editing domain for the model editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected void initializeEditingDomain()
+  {
+    // Create an adapter factory that yields item providers.
+    //
+    adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+
+    adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+    adapterFactory.addAdapterFactory(new EvolutionItemProviderAdapterFactory());
+    ecoreItemProviderAdapterFactory = new EcoreItemProviderAdapterFactory();
+    adapterFactory.addAdapterFactory(ecoreItemProviderAdapterFactory);
+    adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
+
+    // Create the command stack that will notify this editor as commands are executed.
+    //
+    BasicCommandStack commandStack = new BasicCommandStack()
+    {
+      @Override
+      public void execute(Command command)
+      {
+        // Cancel live validation before executing a command that will trigger a new round of validation.
+        //
+        if (!(command instanceof AbstractCommand.NonDirtying))
+        {
+          DiagnosticDecorator.Styled.cancel(editingDomain);
+        }
+        super.execute(command);
+      }
+    };
+
+    // Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus.
+    //
+    commandStack.addCommandStackListener(new CommandStackListener()
+    {
+      public void commandStackChanged(final EventObject event)
+      {
+        ((EvolutionImpl)evolution).invalidateChange();
+
+        getContainer().getDisplay().asyncExec(new Runnable()
+        {
+          public void run()
+          {
+            firePropertyChange(IEditorPart.PROP_DIRTY);
+
+            // Try to select the affected objects.
+            //
+            Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand();
+            if (mostRecentCommand != null)
+            {
+              setSelectionToViewer(mostRecentCommand.getAffectedObjects());
+            }
+            for (Iterator<PropertySheetPage> i = propertySheetPages.iterator(); i.hasNext();)
+            {
+              PropertySheetPage propertySheetPage = i.next();
+              if (propertySheetPage.getControl().isDisposed())
+              {
+                i.remove();
+              }
+              else
+              {
+                propertySheetPage.refresh();
+              }
+            }
+          }
+        });
+      }
+    });
+
+    // Create the editing domain with a special command stack.
+    //
+    editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>())
+    {
+      @Override
+      public Command createCommand(Class<? extends Command> commandClass, CommandParameter commandParameter)
+      {
+        Collection<?> collection = commandParameter.getCollection();
+        if (collection != null && !collection.isEmpty())
+        {
+          Object value = collection.iterator().next();
+          if (isReadOnlyObject(value))
+          {
+            return UnexecutableCommand.INSTANCE;
+          }
+        }
+
+        return super.createCommand(commandClass, commandParameter);
+      }
+    };
+  }
+
+  protected boolean isReadOnlyObject(Object object)
+  {
+    if (object instanceof Release)
+    {
+      return true;
+    }
+
+    if (object instanceof Change)
+    {
+      return true;
+    }
+
+    if (readOnlyObjects.contains(object))
+    {
+      return true;
+    }
+
+    if (object instanceof EModelElement)
+    {
+      EModelElement modelElement = (EModelElement)object;
+
+      if (evolution.containsElement(modelElement))
+      {
+        return false;
+      }
+
+      for (Release release : evolution.getReleases())
+      {
+        if (release.containsElement(modelElement))
+        {
+          readOnlyObjects.add(modelElement);
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * This is here for the listener to be able to call it.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void firePropertyChange(int action)
+  {
+    super.firePropertyChange(action);
+  }
+
+  /**
+   * This sets the selection into whichever viewer is active.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setSelectionToViewer(Collection<?> collection)
+  {
+    final Collection<?> theSelection = collection;
+    // Make sure it's okay.
+    //
+    if (theSelection != null && !theSelection.isEmpty())
+    {
+      Runnable runnable = new Runnable()
+      {
+        public void run()
+        {
+          // Try to select the items in the current content viewer of the editor.
+          //
+          if (currentViewer != null)
+          {
+            currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);
+          }
+        }
+      };
+      getSite().getShell().getDisplay().asyncExec(runnable);
+    }
+  }
+
+  /**
+   * This returns the editing domain as required by the {@link IEditingDomainProvider} interface.
+   * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain}
+   * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EditingDomain getEditingDomain()
+  {
+    return editingDomain;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider
+  {
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory)
+    {
+      super(adapterFactory);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object[] getElements(Object object)
+    {
+      Object parent = super.getParent(object);
+      return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object[] getChildren(Object object)
+    {
+      Object parent = super.getParent(object);
+      return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean hasChildren(Object object)
+    {
+      Object parent = super.getParent(object);
+      return parent != null;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object getParent(Object object)
+    {
+      return null;
+    }
+  }
+
+  /**
+   * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,
+   * is the current one.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setCurrentViewer(Viewer viewer)
+  {
+    // If it is changing...
+    //
+    if (currentViewer != viewer)
+    {
+      if (selectionChangedListener == null)
+      {
+        // Create the listener on demand.
+        //
+        selectionChangedListener = new ISelectionChangedListener()
+        {
+          // This just notifies those things that are affected by the section.
+          //
+          public void selectionChanged(SelectionChangedEvent selectionChangedEvent)
+          {
+            setSelection(selectionChangedEvent.getSelection());
+          }
+        };
+      }
+
+      // Stop listening to the old one.
+      //
+      if (currentViewer != null)
+      {
+        currentViewer.removeSelectionChangedListener(selectionChangedListener);
+      }
+
+      // Start listening to the new one.
+      //
+      if (viewer != null)
+      {
+        viewer.addSelectionChangedListener(selectionChangedListener);
+      }
+
+      // Remember it.
+      //
+      currentViewer = viewer;
+
+      // Set the editors selection based on the current viewer's selection.
+      //
+      setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());
+    }
+  }
+
+  /**
+   * This returns the viewer as required by the {@link IViewerProvider} interface.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Viewer getViewer()
+  {
+    return currentViewer;
+  }
+
+  /**
+   * This creates a context menu for the viewer and adds a listener as well registering the menu for extension.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected void createContextMenuFor(StructuredViewer viewer)
+  {
+    MenuManager contextMenu = new MenuManager("#PopUp");
+    contextMenu.add(new Separator("additions"));
+    contextMenu.setRemoveAllWhenShown(true);
+    contextMenu.addMenuListener(this);
+    Menu menu = contextMenu.createContextMenu(viewer.getControl());
+    viewer.getControl().setMenu(menu);
+    getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
+
+    int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+    Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance(), LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
+    viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
+    viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer)
+    {
+      @Override
+      public void dropAccept(DropTargetEvent event)
+      {
+        super.dropAccept(event);
+      }
+
+      @Override
+      public void drop(DropTargetEvent event)
+      {
+        super.drop(event);
+      }
+    });
+  }
+
+  /**
+   * This is the method called to load a resource into the editing domain's resource set based on the editor's input.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void createModelGen()
+  {
+    URI resourceURI = EditUIUtil.getURI(getEditorInput(), editingDomain.getResourceSet().getURIConverter());
+    Exception exception = null;
+    Resource resource = null;
+    try
+    {
+      // Load the resource through the editing domain.
+      //
+      resource = editingDomain.getResourceSet().getResource(resourceURI, true);
+    }
+    catch (Exception e)
+    {
+      exception = e;
+      resource = editingDomain.getResourceSet().getResource(resourceURI, false);
+    }
+
+    Diagnostic diagnostic = analyzeResourceProblems(resource, exception);
+    if (diagnostic.getSeverity() != Diagnostic.OK)
+    {
+      resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+    }
+    editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);
+  }
+
+  /**
+   * This is the method called to load a resource into the editing domain's resource set based on the editor's input.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void createModel()
+  {
+    createModelGen();
+
+    ResourceSet resourceSet = editingDomain.getResourceSet();
+    evolution = EvolutionImpl.get(resourceSet);
+    if (evolution != null)
+    {
+      if (hasGenerics(evolution))
+      {
+        ((EvolutionActionBarContributor)getActionBarContributor()).showGenerics(true);
+      }
+    }
+  }
+
+  private boolean hasGenerics(Evolution evolution)
+  {
+    if (hasGenerics(evolution.getRootPackages()))
+    {
+      return true;
+    }
+
+    for (Release release : evolution.getReleases())
+    {
+      if (hasGenerics(release.getRootPackages()))
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  private boolean hasGenerics(EList<EPackage> rootPackages)
+  {
+    for (EPackage rootPackage : rootPackages)
+    {
+      for (Iterator<EObject> i = rootPackage.eAllContents(); i.hasNext();)
+      {
+        EObject eObject = i.next();
+        if (eObject instanceof ETypeParameter || eObject instanceof EGenericType && !((EGenericType)eObject).getETypeArguments().isEmpty())
+        {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Returns a diagnostic describing the errors and warnings listed in the resource
+   * and the specified exception (if any).
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Diagnostic analyzeResourceProblems(Resource resource, Exception exception)
+  {
+    boolean hasErrors = !resource.getErrors().isEmpty();
+    if (hasErrors || !resource.getWarnings().isEmpty())
+    {
+      BasicDiagnostic basicDiagnostic = new BasicDiagnostic(hasErrors ? Diagnostic.ERROR : Diagnostic.WARNING, "org.eclipse.emf.cdo.evolution.editor", 0,
+          getString("_UI_CreateModelError_message", resource.getURI()), new Object[] { exception == null ? (Object)resource : exception });
+      basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));
+      return basicDiagnostic;
+    }
+    else if (exception != null)
+    {
+      return new BasicDiagnostic(Diagnostic.ERROR, "org.eclipse.emf.cdo.evolution.editor", 0, getString("_UI_CreateModelError_message", resource.getURI()),
+          new Object[] { exception });
+    }
+    else
+    {
+      return Diagnostic.OK_INSTANCE;
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static class PhasedLiveValidator extends LiveValidator
+  {
+    public PhasedLiveValidator(EditingDomain editingDomain, IDialogSettings dialogSettings)
+    {
+      super(editingDomain, dialogSettings);
+    }
+
+    @Override
+    public void scheduleValidation()
+    {
+      if (validationJob == null && (dialogSettings == null || dialogSettings.getBoolean(LiveValidationAction.LIVE_VALIDATOR_DIALOG_SETTINGS_KEY)))
+      {
+        validationJob = new Job("Validation Job")
+        {
+          @Override
+          protected IStatus run(final IProgressMonitor monitor)
+          {
+            try
+            {
+              Diagnostician diagnostician = new Diagnostician()
+              {
+                @Override
+                public String getObjectLabel(EObject eObject)
+                {
+                  String text = labelProvider != null && eObject.eIsProxy() ? ((InternalEObject)eObject).eProxyURI().toString()
+                      : labelProvider.getText(eObject);
+                  if (text == null || text.length() == 0)
+                  {
+                    text = "<i>null</i>";
+                  }
+                  else
+                  {
+                    text = DiagnosticDecorator.escapeContent(text);
+                  }
+                  Image image = labelProvider != null ? labelProvider.getImage(eObject) : null;
+                  if (image != null)
+                  {
+                    URI imageURI = ImageURIRegistry.INSTANCE.getImageURI(image);
+                    return DiagnosticDecorator.enquote("<img src='" + imageURI + "'/> " + text);
+                  }
+                  else
+                  {
+                    return text;
+                  }
+                }
+
+                @Override
+                public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context)
+                {
+                  if (monitor.isCanceled())
+                  {
+                    throw new RuntimeException();
+                  }
+
+                  monitor.worked(1);
+                  return super.validate(eClass, eObject, diagnostics, context);
+                }
+
+                @Override
+                protected boolean doValidateContents(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context)
+                {
+                  Evolution evolution;
+                  List<? extends EObject> eContents;
+
+                  ValidationContext validationContext = ValidationContext.getFrom(context);
+                  if (validationContext != null)
+                  {
+                    ValidationPhase phase = validationContext.getPhase();
+                    evolution = validationContext.getEvolution();
+                    eContents = phase.getContentsToValidate(this, evolution, eObject, context);
+                  }
+                  else
+                  {
+                    evolution = null;
+                    eContents = eObject.eContents();
+                  }
+
+                  boolean result = true;
+                  for (EObject child : eContents)
+                  {
+                    Resource resource = child.eResource();
+                    if (resource == null && evolution != null)
+                    {
+                      // Change objects are not contained in a resource. Use the evolution's resource.
+                      resource = evolution.eResource();
+                    }
+
+                    DiagnosticChain resourceDiagnostic = resource != null && validationContext != null
+                        ? validationContext.getResourceDiagnostics().get(resource)
+                        : null;
+
+                    result &= validate(child, resourceDiagnostic, context);
+                  }
+
+                  return result;
+                }
+              };
+
+              final ResourceSet resourceSet = editingDomain.getResourceSet();
+
+              Map<Object, Object> context = diagnostician.createDefaultContext();
+              context.put(EObjectValidator.ROOT_OBJECT, new Object()); // Disable circular containment validation.
+
+              { ///////////////////////////////////////////////////////////////////////////////
+
+                Evolution evolution = EvolutionImpl.get(resourceSet);
+                ValidationContext validationContext = new ValidationContext(evolution);
+                validationContext.putInto(context);
+
+                int count = 0;
+                for (ValidationPhase phase : ValidationPhase.values())
+                {
+                  validationContext.setPhase(phase);
+
+                  // int xxx;
+                  // System.out.println("Count " + phase);
+
+                  count += countObjects(diagnostician, evolution, validationContext, context, monitor);
+                }
+
+                scheduledResources.clear();
+                monitor.beginTask("", count);
+
+                Map<Resource, BasicDiagnostic> resourceDiagnostics = validationContext.getResourceDiagnostics();
+                final BasicDiagnostic rootDiagnostic = new BasicDiagnostic(EObjectValidator.DIAGNOSTIC_SOURCE, 0,
+                    EMFEditUIPlugin.INSTANCE.getString("_UI_DiagnosisOfNObjects_message", new String[] { "" + resourceDiagnostics.size() }),
+                    new Object[] { resourceSet });
+
+                for (BasicDiagnostic resourceDiagnostic : resourceDiagnostics.values())
+                {
+                  rootDiagnostic.add(resourceDiagnostic);
+                }
+
+                BasicDiagnostic modelSetResourceDiagnostic = resourceDiagnostics.get(evolution.eResource());
+
+                for (ValidationPhase phase : ValidationPhase.values())
+                {
+                  validationContext.setPhase(phase);
+
+                  // int xxx;
+                  // System.out.println("Validate " + phase);
+
+                  monitor
+                      .setTaskName(EvolutionEditorPlugin.INSTANCE.getString("_UI_ValidatingPhase_message", new Object[] { Integer.toString(phase.ordinal()) }));
+
+                  boolean valid = diagnostician.validate(evolution, modelSetResourceDiagnostic, context);
+                  if (!valid)
+                  {
+                    break;
+                  }
+                }
+
+                if (monitor.isCanceled())
+                {
+                  throw new RuntimeException();
+                }
+
+                monitor.worked(1);
+
+                DiagnosticAdapter.update(resourceSet, rootDiagnostic);
+
+              } ///////////////////////////////////////////////////////////////////////////////
+
+              Display.getDefault().asyncExec(new Runnable()
+              {
+                public void run()
+                {
+                  validationJob = null;
+                  if (!monitor.isCanceled() && !scheduledResources.isEmpty())
+                  {
+                    PhasedLiveValidator.this.scheduleValidation();
+                  }
+                }
+              });
+
+              return Status.OK_STATUS;
+            }
+            catch (RuntimeException exception)
+            {
+              int xxx;
+              exception.printStackTrace();
+
+              validationJob = null;
+              return Status.CANCEL_STATUS;
+            }
+          }
+
+          private int countObjects(Diagnostician diagnostician, EObject eObject, ValidationContext validationContext, Map<Object, Object> context,
+              IProgressMonitor monitor)
+          {
+            if (monitor.isCanceled())
+            {
+              throw new RuntimeException();
+            }
+
+            for (EReference eReference : eObject.eClass().getEAllReferences())
+            {
+              if (monitor.isCanceled())
+              {
+                throw new RuntimeException();
+              }
+
+              if (eReference == EvolutionPackage.Literals.MODEL_SET__CHANGE)
+              {
+                continue;
+              }
+
+              if (eReference.isContainment() || eReference.isContainer())
+              {
+                continue;
+              }
+
+              // Resolve all proxies.
+              if (eReference.isResolveProxies())
+              {
+                Object value = eObject.eGet(eReference, true);
+                if (eReference.isMany())
+                {
+                  @SuppressWarnings("unchecked")
+                  List<EObject> list = (List<EObject>)value;
+
+                  for (@SuppressWarnings("unused")
+                  EObject element : list)
+                  {
+                    if (monitor.isCanceled())
+                    {
+                      throw new RuntimeException();
+                    }
+                  }
+                }
+              }
+            }
+
+            Resource resource = eObject.eResource();
+            if (resource != null)
+            {
+              Map<Resource, BasicDiagnostic> resourceDiagnostics = validationContext.getResourceDiagnostics();
+              if (!resourceDiagnostics.containsKey(resource))
+              {
+                BasicDiagnostic diagnostic = new BasicDiagnostic(EObjectValidator.DIAGNOSTIC_SOURCE, 0,
+                    EMFEditUIPlugin.INSTANCE.getString("_UI_DiagnosisOfNObjects_message", new String[] { "1" }), new Object[] { resource });
+                resourceDiagnostics.put(resource, diagnostic);
+              }
+            }
+
+            Evolution evolution = validationContext.getEvolution();
+            ValidationPhase phase = validationContext.getPhase();
+            int count = 1;
+
+            for (EObject child : phase.getContentsToValidate(diagnostician, evolution, eObject, context))
+            {
+              count += countObjects(diagnostician, child, validationContext, context, monitor);
+            }
+
+            return count;
+          }
+        };
+
+        validationJob.setPriority(Job.DECORATE);
+        validationJob.schedule(500);
+      }
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static class DiagnosticContentProvider implements IStructuredContentProvider
+  {
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+    {
+    }
+
+    public Object[] getElements(Object inputElement)
+    {
+      List<Diagnostic> result = new ArrayList<Diagnostic>();
+
+      @SuppressWarnings("unchecked")
+      List<Diagnostic> diagnostics = (List<Diagnostic>)inputElement;
+      for (Diagnostic diagnostic : diagnostics)
+      {
+        collectDiagnostics(diagnostic, result);
+      }
+
+      return result.toArray(new Diagnostic[result.size()]);
+    }
+
+    private void collectDiagnostics(Diagnostic diagnostic, List<Diagnostic> result)
+    {
+      if (isRelevant(diagnostic))
+      {
+        result.add(diagnostic);
+      }
+
+      for (Diagnostic child : diagnostic.getChildren())
+      {
+        collectDiagnostics(child, result);
+      }
+    }
+
+    private boolean isRelevant(Diagnostic diagnostic)
+    {
+      // if (diagnostic.getSeverity() != Diagnostic.ERROR)
+      // {
+      // return false;
+      // }
+
+      List<?> data = diagnostic.getData();
+      if (data.isEmpty())
+      {
+        return false;
+      }
+
+      if (data.get(0) instanceof Resource)
+      {
+        return false;
+      }
+
+      return true;
+    }
+
+    public void dispose()
+    {
+    }
+  }
+
+  /**
+   * This is the method used by the framework to install your own controls.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public void createPages()
+  {
+    // Creates the model from the editor input
+    //
+    createModel();
+
+    // Only creates the other pages if there is something that can be edited
+    //
+    if (!getEditingDomain().getResourceSet().getResources().isEmpty())
+    {
+      // Create a page for the selection tree view.
+      //
+
+      SashForm mainSash = new SashForm(getContainer(), SWT.VERTICAL);
+      mainSash.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL));
+
+      selectionViewer = createSelectionViewer(mainSash);
+      TableViewer problemViewer = createProblemViewer(mainSash);
+
+      mainSash.setWeights(new int[] { 70, 30 });
+
+      int pageIndex = addPage(mainSash);
+      setPageText(pageIndex, getString("_UI_SelectionPage_label"));
+
+      getSite().getShell().getDisplay().asyncExec(new Runnable()
+      {
+        public void run()
+        {
+          if (!getContainer().isDisposed())
+          {
+            setActivePage(0);
+          }
+        }
+      });
+
+      this.problemViewer = problemViewer;
+    }
+
+    // Ensures that this editor will only display the page's tab
+    // area if there are more than one page
+    //
+    getContainer().addControlListener(new ControlAdapter()
+    {
+      boolean guard = false;
+
+      @Override
+      public void controlResized(ControlEvent event)
+      {
+        if (!guard)
+        {
+          guard = true;
+          hideTabs();
+          guard = false;
+        }
+      }
+    });
+
+    getSite().getShell().getDisplay().asyncExec(new Runnable()
+    {
+      public void run()
+      {
+        updateProblemIndication();
+      }
+    });
+  }
+
+  private TreeViewer createSelectionViewer(Composite parent)
+  {
+    Tree tree = new Tree(parent, SWT.MULTI);
+    TreeViewer selectionViewer = new TreeViewer(tree);
+    setCurrentViewer(selectionViewer);
+
+    DiagnosticDecorator diagnosticDecorator = new DiagnosticDecorator.Styled(editingDomain, selectionViewer,
+        EvolutionEditorPlugin.getPlugin().getDialogSettings())
+    {
+      @Override
+      protected void redecorate()
+      {
+        super.redecorate();
+        handleDiagnostics(diagnostics);
+      }
+
+      @Override
+      protected LiveValidator getLiveValidator()
+      {
+        if (liveValidator == null && editingDomain != null)
+        {
+          Field field = ReflectUtil.getField(DiagnosticDecorator.class, "LIVE_VALIDATORS");
+
+          @SuppressWarnings("unchecked")
+          Map<EditingDomain, LiveValidator> LIVE_VALIDATORS = (Map<EditingDomain, LiveValidator>)ReflectUtil.getValue(field, null);
+
+          liveValidator = LIVE_VALIDATORS.get(editingDomain);
+          if (liveValidator == null)
+          {
+            liveValidator = new PhasedLiveValidator(editingDomain, dialogSettings);
+
+            LIVE_VALIDATORS.put(editingDomain, liveValidator);
+          }
+
+          liveValidator.register(this);
+        }
+
+        return liveValidator;
+      }
+    };
+
+    selectionViewer.setUseHashlookup(true);
+    selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+    selectionViewer.setLabelProvider(new DelegatingStyledCellLabelProvider.FontAndColorProvider(new DecoratingColumLabelProvider.StyledLabelProvider(
+        new AdapterFactoryLabelProvider.StyledLabelProvider(adapterFactory, selectionViewer), diagnosticDecorator)));
+    selectionViewer.setInput(editingDomain.getResourceSet().getResources().get(0));
+    selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+
+    new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);
+    new ColumnViewerInformationControlToolTipSupport(selectionViewer,
+        new DiagnosticDecorator.Styled.EditingDomainLocationListener(editingDomain, selectionViewer));
+
+    createContextMenuFor(selectionViewer);
+    return selectionViewer;
+  }
+
+  private TableViewer createProblemViewer(Composite parent)
+  {
+    final TableViewer problemViewer = new TableViewer(parent, SWT.MULTI);
+    problemViewer.setContentProvider(new DiagnosticContentProvider());
+    problemViewer.setInput(Collections.emptyList());
+
+    Table problemTable = problemViewer.getTable();
+    problemTable.setHeaderVisible(true);
+    problemTable.setLinesVisible(true);
+
+    createDiagnosticMessageColumn(problemViewer);
+    createDiagnosticElementColumn(problemViewer, adapterFactory);
+    createDiagnosticResourceColumn(problemViewer, adapterFactory);
+    // createDiagnosticIDColumn(problemViewer);
+
+    // {
+    // TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    // tableViewerColumn.setLabelProvider(new ColumnLabelProvider()
+    // {
+    // @Override
+    // public String getText(Object element)
+    // {
+    // return ((Diagnostic)element).getSource();
+    // }
+    // });
+    //
+    // TableColumn tableColumn = tableViewerColumn.getColumn();
+    // tableColumn.setResizable(true);
+    // tableColumn.setAlignment(SWT.LEFT);
+    // tableColumn.setWidth(200);
+    // tableColumn.setText("Source");
+    // }
+    //
+    // {
+    // TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    // tableViewerColumn.setLabelProvider(new ColumnLabelProvider()
+    // {
+    //
+    // @Override
+    // public String getText(Object element)
+    // {
+    // return Integer.toString(((Diagnostic)element).getCode());
+    // }
+    // });
+    //
+    // TableColumn tableColumn = tableViewerColumn.getColumn();
+    // tableColumn.setResizable(true);
+    // tableColumn.setAlignment(SWT.LEFT);
+    // tableColumn.setWidth(70);
+    // tableColumn.setText("Code");
+    // }
+    //
+    // {
+    // TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    // tableViewerColumn.setLabelProvider(new ColumnLabelProvider()
+    // {
+    // @Override
+    // public String getText(Object element)
+    // {
+    // StringBuilder builder = new StringBuilder();
+    //
+    // List<?> data = ((Diagnostic)element).getData();
+    // for (Object object : data)
+    // {
+    // if (builder.length() != 0)
+    // {
+    // builder.append(", ");
+    // }
+    //
+    // if (object instanceof Resource)
+    // {
+    // Resource resource = (Resource)object;
+    // builder.append("Resource[");
+    // builder.append(resource.getURI());
+    // builder.append("]");
+    // }
+    // else if (object instanceof ENamedElement)
+    // {
+    // ENamedElement namedElement = (ENamedElement)object;
+    // builder.append(namedElement.getName());
+    // }
+    // else if (object instanceof EObject)
+    // {
+    // EObject eObject = (EObject)object;
+    // builder.append(eObject.eClass().getName());
+    // }
+    // else
+    // {
+    // builder.append(String.valueOf(object));
+    // }
+    // }
+    //
+    // return builder.toString();
+    // }
+    // });
+    //
+    // TableColumn tableColumn = tableViewerColumn.getColumn();
+    // tableColumn.setResizable(true);
+    // tableColumn.setAlignment(SWT.LEFT);
+    // tableColumn.setWidth(400);
+    // tableColumn.setText("Data");
+    // }
+
+    problemTable.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent e)
+      {
+        if (e.stateMask == SWT.CTRL && e.character == '1')
+        {
+          showQuickFixes();
+        }
+      }
+    });
+
+    problemViewer.addOpenListener(new IOpenListener()
+    {
+      public void open(OpenEvent event)
+      {
+        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+        Object element = selection.getFirstElement();
+        if (element instanceof Diagnostic)
+        {
+          List<?> data = ((Diagnostic)element).getData();
+          int size = data.size();
+          if (size != 0)
+          {
+            List<Object> list = new ArrayList<Object>(size);
+            for (Object object : data)
+            {
+              Object wrapper = editingDomain.getWrapper(object);
+              list.add(wrapper);
+            }
+
+            setSelectionToViewer(list);
+          }
+        }
+      }
+    });
+
+    return problemViewer;
+  }
+
+  public static TableViewerColumn createDiagnosticMessageColumn(final TableViewer problemViewer)
+  {
+    TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    tableViewerColumn.setLabelProvider(new ColumnLabelProvider()
+    {
+      @Override
+      public Image getImage(Object element)
+      {
+        switch (((Diagnostic)element).getSeverity())
+        {
+        case Diagnostic.INFO:
+          return SharedIcons.getImage(SharedIcons.OBJ_INFO);
+
+        default:
+          return SharedIcons.getImage(SharedIcons.OBJ_ERROR);
+        }
+      }
+
+      @Override
+      public String getText(Object element)
+      {
+        return ((Diagnostic)element).getMessage();
+      }
+    });
+
+    TableColumn tableColumn = tableViewerColumn.getColumn();
+    tableColumn.setResizable(true);
+    tableColumn.setAlignment(SWT.LEFT);
+    tableColumn.setWidth(400);
+    tableColumn.setText("Message");
+    return tableViewerColumn;
+  }
+
+  public static TableViewerColumn createDiagnosticResourceColumn(TableViewer problemViewer, AdapterFactory adapterFactory)
+  {
+    TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    tableViewerColumn.setLabelProvider(new ResourceColumnLabelProvider(adapterFactory));
+
+    TableColumn tableColumn = tableViewerColumn.getColumn();
+    tableColumn.setResizable(true);
+    tableColumn.setAlignment(SWT.LEFT);
+    tableColumn.setWidth(450);
+    tableColumn.setText("Resource");
+    return tableViewerColumn;
+  }
+
+  public static TableViewerColumn createDiagnosticElementColumn(TableViewer problemViewer, AdapterFactory adapterFactory)
+  {
+    TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    tableViewerColumn.setLabelProvider(new ElementColumnLabelProvider(adapterFactory));
+
+    TableColumn tableColumn = tableViewerColumn.getColumn();
+    tableColumn.setResizable(true);
+    tableColumn.setAlignment(SWT.LEFT);
+    tableColumn.setWidth(200);
+    tableColumn.setText("Element");
+    return tableViewerColumn;
+  }
+
+  public static TableViewerColumn createDiagnosticIDColumn(final TableViewer problemViewer)
+  {
+    TableViewerColumn tableViewerColumn = new TableViewerColumn(problemViewer, SWT.NONE);
+    tableViewerColumn.setLabelProvider(new ColumnLabelProvider()
+    {
+      @Override
+      public String getText(Object element)
+      {
+        DiagnosticID diagnosticID = DiagnosticID.get((Diagnostic)element);
+        if (diagnosticID != null)
+        {
+          return diagnosticID.getValue();
+        }
+
+        return "";
+      }
+    });
+
+    TableColumn tableColumn = tableViewerColumn.getColumn();
+    tableColumn.setResizable(true);
+    tableColumn.setAlignment(SWT.LEFT);
+    tableColumn.setWidth(800);
+    tableColumn.setText("ID");
+    return tableViewerColumn;
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public static class ResourceColumnLabelProvider extends ColumnLabelProvider
+  {
+    protected final AdapterFactory adapterFactory;
+
+    public ResourceColumnLabelProvider(AdapterFactory adapterFactory)
+    {
+      this.adapterFactory = adapterFactory;
+    }
+
+    @Override
+    public Image getImage(Object element)
+    {
+      List<?> data = ((Diagnostic)element).getData();
+      if (!data.isEmpty())
+      {
+        Object object = data.get(0);
+        if (object instanceof EObject)
+        {
+          EObject eObject = (EObject)object;
+          Resource resource = eObject.eResource();
+          if (resource != null)
+          {
+            IItemLabelProvider labelProvider = (IItemLabelProvider)adapterFactory.adapt(resource, IItemLabelProvider.class);
+            if (labelProvider != null)
+            {
+              return ExtendedImageRegistry.getInstance().getImage(labelProvider.getImage(resource));
+            }
+          }
+        }
+      }
+
+      return null;
+    }
+
+    @Override
+    public String getText(Object element)
+    {
+      List<?> data = ((Diagnostic)element).getData();
+      if (!data.isEmpty())
+      {
+        Object object = data.get(0);
+        if (object instanceof EObject)
+        {
+          EObject eObject = (EObject)object;
+          Resource resource = eObject.eResource();
+          if (resource != null)
+          {
+            IItemLabelProvider labelProvider = (IItemLabelProvider)adapterFactory.adapt(resource, IItemLabelProvider.class);
+            if (labelProvider != null)
+            {
+              return labelProvider.getText(resource);
+            }
+          }
+        }
+      }
+
+      return null;
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public static class ElementColumnLabelProvider extends ColumnLabelProvider
+  {
+    protected final AdapterFactory adapterFactory;
+
+    public ElementColumnLabelProvider(AdapterFactory adapterFactory)
+    {
+      this.adapterFactory = adapterFactory;
+    }
+
+    @Override
+    public Image getImage(Object element)
+    {
+      List<?> data = ((Diagnostic)element).getData();
+      if (!data.isEmpty())
+      {
+        Object object = data.get(0);
+        if (object instanceof EObject)
+        {
+          IItemLabelProvider labelProvider = (IItemLabelProvider)adapterFactory.adapt(object, IItemLabelProvider.class);
+          if (labelProvider != null)
+          {
+            return ExtendedImageRegistry.getInstance().getImage(labelProvider.getImage(object));
+          }
+        }
+      }
+
+      return null;
+    }
+
+    @Override
+    public String getText(Object element)
+    {
+      List<?> data = ((Diagnostic)element).getData();
+      if (!data.isEmpty())
+      {
+        Object object = data.get(0);
+        if (object instanceof EModelElement)
+        {
+          EModelElement modelElement = (EModelElement)object;
+          return ElementHandler.getLabel(modelElement);
+        }
+
+        if (object instanceof EObject)
+        {
+
+          IItemLabelProvider labelProvider = (IItemLabelProvider)adapterFactory.adapt(object, IItemLabelProvider.class);
+          if (labelProvider != null)
+          {
+            return labelProvider.getText(object);
+          }
+        }
+      }
+
+      return null;
+    }
+  }
+
+  private Diagnostic[] getSelectedDiagnostics()
+  {
+    IStructuredSelection selection = problemViewer.getStructuredSelection();
+    if (selection.isEmpty())
+    {
+      return DiagnosticResolution.NO_DIAGNOSTICS;
+    }
+
+    List<Diagnostic> result = new ArrayList<Diagnostic>();
+    for (Iterator<?> it = selection.iterator(); it.hasNext();)
+    {
+      result.add((Diagnostic)it.next());
+    }
+
+    return result.toArray(new Diagnostic[result.size()]);
+  }
+
+  private void showQuickFixes()
+  {
+    final Map<DiagnosticResolution, Collection<Diagnostic>> resolutionsMap = new LinkedHashMap<DiagnosticResolution, Collection<Diagnostic>>();
+    final Diagnostic[] selectedDiagnostics = getSelectedDiagnostics();
+    if (selectedDiagnostics == null || selectedDiagnostics.length == 0)
+    {
+      return;
+    }
+
+    final Diagnostic firstSelectedDiagnostic = selectedDiagnostics[0];
+
+    IRunnableWithProgress runnable = new IRunnableWithProgress()
+    {
+      public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
+      {
+        monitor.beginTask("Finding fixes", 100);
+        monitor.worked(20);
+
+        DiagnosticResolution[] resolutions = DiagnosticResolution.getResolutions(firstSelectedDiagnostic, EvolutionEditor.this);
+        int progressCount = 80;
+        if (resolutions.length > 1)
+        {
+          progressCount = progressCount / resolutions.length;
+        }
+
+        for (DiagnosticResolution resolution : resolutions)
+        {
+          Diagnostic[] other = resolution.findOtherDiagnostics(allDiagnostics);
+          if (containsAllButFirst(other, selectedDiagnostics))
+          {
+            Collection<Diagnostic> diagnostics = new LinkedHashSet<Diagnostic>(other.length + 1);
+            diagnostics.add(firstSelectedDiagnostic);
+            diagnostics.addAll(Arrays.asList(other));
+            resolutionsMap.put(resolution, diagnostics);
+          }
+
+          monitor.worked(progressCount);
+        }
+
+        monitor.done();
+      }
+    };
+
+    IWorkbenchPartSite site = getSite();
+    IWorkbenchSiteProgressService service = Adapters.adapt(site, IWorkbenchSiteProgressService.class);
+
+    Shell shell = site.getShell();
+    IRunnableContext context = new ProgressMonitorDialog(shell);
+
+    try
+    {
+      if (service == null)
+      {
+        PlatformUI.getWorkbench().getProgressService().runInUI(context, runnable, null);
+      }
+      else
+      {
+        service.runInUI(context, runnable, null);
+      }
+    }
+    catch (InvocationTargetException ex)
+    {
+      throw WrappedException.wrap(ex);
+    }
+    catch (InterruptedException ex)
+    {
+      throw WrappedException.wrap(ex);
+    }
+
+    String description = StringUtil.safe(firstSelectedDiagnostic.getMessage());
+    if (resolutionsMap.isEmpty())
+    {
+      if (selectedDiagnostics.length == 1)
+      {
+        MessageDialog.openInformation(shell, "Quick Fix", NLS.bind("No fixes available for:\n\n {0}.", new Object[] { description }));
+      }
+      else
+      {
+        MessageDialog.openInformation(shell, "Quick Fix", "The selected problems do not have a common applicable quick fix.");
+      }
+    }
+    else
+    {
+      String problemDescription = NLS.bind("Select the fix for ''{0}''.", description);
+
+      Wizard wizard = new QuickFixWizard(problemDescription, selectedDiagnostics, resolutionsMap, editingDomain);
+      wizard.setWindowTitle("Quick Fix");
+
+      WizardDialog dialog = new QuickFixWizardDialog(shell, wizard);
+      dialog.open();
+    }
+  }
+
+  /**
+   * Checks whether the given extent contains all but the first element from the given members array.
+   *
+   * @param extent the array which should contain the elements
+   * @param members the elements to check
+   * @return <code>true</code> if all but the first element are inside the extent
+   */
+  private static boolean containsAllButFirst(Object[] extent, Object[] members)
+  {
+    outer: for (int i = 1; i < members.length; i++)
+    {
+      for (int j = 0; j < extent.length; j++)
+      {
+        if (members[i] == extent[j])
+        {
+          continue outer;
+        }
+      }
+
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class QuickFixWizardDialog extends WizardDialog
+  {
+    public QuickFixWizardDialog(Shell parentShell, IWizard newWizard)
+    {
+      super(parentShell, newWizard);
+      setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER | SWT.MODELESS | SWT.RESIZE | getDefaultOrientation());
+    }
+  }
+
+  protected void handleDiagnostics(List<Diagnostic> diagnostics)
+  {
+    List<Diagnostic> result = new ArrayList<Diagnostic>();
+    flattenDiagnostics(diagnostics, result);
+    allDiagnostics = result.toArray(new Diagnostic[result.size()]);
+
+    if (problemViewer != null && !problemViewer.getControl().isDisposed())
+    {
+      problemViewer.setInput(diagnostics);
+    }
+  }
+
+  private void flattenDiagnostics(List<Diagnostic> diagnostics, List<Diagnostic> result)
+  {
+    for (Diagnostic diagnostic : diagnostics)
+    {
+      result.add(diagnostic);
+      flattenDiagnostics(diagnostic.getChildren(), result);
+    }
+  }
+
+  /**
+   * If there is just one page in the multi-page editor part,
+   * this hides the single tab at the bottom.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void hideTabs()
+  {
+    if (getPageCount() <= 1)
+    {
+      setPageText(0, "");
+      if (getContainer() instanceof CTabFolder)
+      {
+        Point point = getContainer().getSize();
+        Rectangle clientArea = getContainer().getClientArea();
+        getContainer().setSize(point.x, 2 * point.y - clientArea.height - clientArea.y);
+      }
+    }
+  }
+
+  /**
+   * If there is more than one page in the multi-page editor part,
+   * this shows the tabs at the bottom.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void showTabs()
+  {
+    if (getPageCount() > 1)
+    {
+      setPageText(0, getString("_UI_SelectionPage_label"));
+      if (getContainer() instanceof CTabFolder)
+      {
+        Point point = getContainer().getSize();
+        Rectangle clientArea = getContainer().getClientArea();
+        getContainer().setSize(point.x, clientArea.height + clientArea.y);
+      }
+    }
+  }
+
+  /**
+   * This is used to track the active viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void pageChange(int pageIndex)
+  {
+    super.pageChange(pageIndex);
+
+    if (contentOutlinePage != null)
+    {
+      handleContentOutlineSelection(contentOutlinePage.getSelection());
+    }
+  }
+
+  /**
+   * This is how the framework determines which interfaces we implement.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public <T> T getAdapter(Class<T> key)
+  {
+    if (key.equals(IContentOutlinePage.class))
+    {
+      return showOutlineView() ? key.cast(getContentOutlinePage()) : null;
+    }
+    else if (key.equals(IPropertySheetPage.class))
+    {
+      return key.cast(getPropertySheetPage());
+    }
+    else if (key.equals(IGotoMarker.class))
+    {
+      return key.cast(this);
+    }
+    else if (key.equals(IFindReplaceTarget.class))
+    {
+      return FindAndReplaceTarget.getAdapter(key, this, EvolutionEditorPlugin.getPlugin());
+    }
+    else
+    {
+      return super.getAdapter(key);
+    }
+  }
+
+  /**
+   * This accesses a cached version of the content outliner.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IContentOutlinePage getContentOutlinePage()
+  {
+    if (contentOutlinePage == null)
+    {
+      // The content outline is just a tree.
+      //
+      class MyContentOutlinePage extends ContentOutlinePage
+      {
+        @Override
+        public void createControl(Composite parent)
+        {
+          super.createControl(parent);
+          contentOutlineViewer = getTreeViewer();
+          contentOutlineViewer.addSelectionChangedListener(this);
+
+          // Set up the tree viewer.
+          //
+          contentOutlineViewer.setUseHashlookup(true);
+          contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+          contentOutlineViewer.setLabelProvider(new DelegatingStyledCellLabelProvider.FontAndColorProvider(
+              new DecoratingColumLabelProvider.StyledLabelProvider(new AdapterFactoryLabelProvider.StyledLabelProvider(adapterFactory, contentOutlineViewer),
+                  new DiagnosticDecorator.Styled(editingDomain, contentOutlineViewer, EvolutionEditorPlugin.getPlugin().getDialogSettings()))));
+          contentOutlineViewer.setInput(editingDomain.getResourceSet());
+
+          new ColumnViewerInformationControlToolTipSupport(contentOutlineViewer,
+              new DiagnosticDecorator.Styled.EditingDomainLocationListener(editingDomain, contentOutlineViewer));
+
+          // Make sure our popups work.
+          //
+          createContextMenuFor(contentOutlineViewer);
+
+          if (!editingDomain.getResourceSet().getResources().isEmpty())
+          {
+            // Select the root object in the view.
+            //
+            contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+          }
+        }
+
+        @Override
+        public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager)
+        {
+          super.makeContributions(menuManager, toolBarManager, statusLineManager);
+          contentOutlineStatusLineManager = statusLineManager;
+        }
+
+        @Override
+        public void setActionBars(IActionBars actionBars)
+        {
+          super.setActionBars(actionBars);
+          getActionBarContributor().shareGlobalActions(this, actionBars);
+        }
+      }
+
+      contentOutlinePage = new MyContentOutlinePage();
+
+      // Listen to selection so that we can handle it is a special way.
+      //
+      contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener()
+      {
+        // This ensures that we handle selections correctly.
+        //
+        public void selectionChanged(SelectionChangedEvent event)
+        {
+          handleContentOutlineSelection(event.getSelection());
+        }
+      });
+    }
+
+    return contentOutlinePage;
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static class DelegatingItemPropertyDescriptor implements IItemPropertyDescriptor
+  {
+    private final IItemPropertyDescriptor itemPropertyDescriptor;
+
+    private DelegatingItemPropertyDescriptor(IItemPropertyDescriptor itemPropertyDescriptor)
+    {
+      this.itemPropertyDescriptor = itemPropertyDescriptor;
+    }
+
+    public Object getPropertyValue(Object object)
+    {
+      return itemPropertyDescriptor.getPropertyValue(object);
+    }
+
+    public boolean isPropertySet(Object object)
+    {
+      return itemPropertyDescriptor.isPropertySet(object);
+    }
+
+    public boolean canSetProperty(Object object)
+    {
+      return itemPropertyDescriptor.canSetProperty(object);
+    }
+
+    public void resetPropertyValue(Object object)
+    {
+      itemPropertyDescriptor.resetPropertyValue(object);
+    }
+
+    public void setPropertyValue(Object object, Object value)
+    {
+      itemPropertyDescriptor.setPropertyValue(object, value);
+    }
+
+    public String getCategory(Object object)
+    {
+      return itemPropertyDescriptor.getCategory(object);
+    }
+
+    public String getDescription(Object object)
+    {
+      return itemPropertyDescriptor.getDescription(object);
+    }
+
+    public String getDisplayName(Object object)
+    {
+      return itemPropertyDescriptor.getDisplayName(object);
+    }
+
+    public String[] getFilterFlags(Object object)
+    {
+      return itemPropertyDescriptor.getFilterFlags(object);
+    }
+
+    public Object getHelpContextIds(Object object)
+    {
+      return itemPropertyDescriptor.getHelpContextIds(object);
+    }
+
+    public String getId(Object object)
+    {
+      return itemPropertyDescriptor.getId(object);
+    }
+
+    public IItemLabelProvider getLabelProvider(Object object)
+    {
+      return itemPropertyDescriptor.getLabelProvider(object);
+    }
+
+    public boolean isCompatibleWith(Object object, Object anotherObject, IItemPropertyDescriptor anotherPropertyDescriptor)
+    {
+      return itemPropertyDescriptor.isCompatibleWith(object, anotherObject, anotherPropertyDescriptor);
+    }
+
+    public Object getFeature(Object object)
+    {
+      return itemPropertyDescriptor.getFeature(object);
+    }
+
+    public boolean isMany(Object object)
+    {
+      return itemPropertyDescriptor.isMany(object);
+    }
+
+    public Collection<?> getChoiceOfValues(Object object)
+    {
+      return itemPropertyDescriptor.getChoiceOfValues(object);
+    }
+
+    public boolean isMultiLine(Object object)
+    {
+      return itemPropertyDescriptor.isMultiLine(object);
+    }
+
+    public boolean isSortChoices(Object object)
+    {
+      return itemPropertyDescriptor.isSortChoices(object);
+    }
+  }
+
+  /**
+   * This accesses a cached version of the property sheet.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public IPropertySheetPage getPropertySheetPage()
+  {
+    PropertySheetPage propertySheetPage = new ExtendedPropertySheetPage(editingDomain, ExtendedPropertySheetPage.Decoration.LIVE,
+        EvolutionEditorPlugin.getPlugin().getDialogSettings(), 0, true)
+    {
+      {
+        setSorter(new PropertySheetSorter()
+        {
+          @Override
+          public void sort(IPropertySheetEntry[] entries)
+          {
+            // Intentionally left empty
+          }
+        });
+      }
+
+      @Override
+      public void setSelectionToViewer(List<?> selection)
+      {
+        EvolutionEditor.this.setSelectionToViewer(selection);
+        EvolutionEditor.this.setFocus();
+      }
+
+      @Override
+      public void setActionBars(IActionBars actionBars)
+      {
+        super.setActionBars(actionBars);
+        getActionBarContributor().shareGlobalActions(this, actionBars);
+      }
+    };
+
+    propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory)
+    {
+      @Override
+      protected IPropertySource createPropertySource(Object object, IItemPropertySource itemPropertySource)
+      {
+        if (isReadOnlyObject(object))
+        {
+          /**
+           * Create no cell editor for read-only objects.
+           */
+          return new PropertySource(object, itemPropertySource)
+          {
+            @Override
+            protected IPropertyDescriptor createPropertyDescriptor(final IItemPropertyDescriptor itemPropertyDescriptor)
+            {
+              return super.createPropertyDescriptor(new DelegatingItemPropertyDescriptor(itemPropertyDescriptor)
+              {
+                @Override
+                public boolean canSetProperty(Object object)
+                {
+                  return false;
+                }
+              });
+            }
+          };
+        }
+        else if (object instanceof EModelElement && evolution.containsElement((EModelElement)object))
+        {
+          /**
+           * Eliminate released elements from selection choices.
+           */
+          return new PropertySource(object, itemPropertySource)
+          {
+            @Override
+            protected IPropertyDescriptor createPropertyDescriptor(final IItemPropertyDescriptor itemPropertyDescriptor)
+            {
+              return super.createPropertyDescriptor(new DelegatingItemPropertyDescriptor(itemPropertyDescriptor)
+              {
+                @Override
+                public Collection<?> getChoiceOfValues(Object object)
+                {
+                  Collection<?> values = super.getChoiceOfValues(object);
+                  if (values != null)
+                  {
+                    for (Iterator<?> it = values.iterator(); it.hasNext();)
+                    {
+                      Object value = it.next();
+                      if (value instanceof EModelElement)
+                      {
+                        EModelElement modelElement = (EModelElement)value;
+                        if (!evolution.containsElement(modelElement))
+                        {
+                          it.remove();
+                        }
+                      }
+                    }
+                  }
+
+                  return values;
+                }
+              });
+            }
+          };
+        }
+
+        return super.createPropertySource(object, itemPropertySource);
+      }
+    });
+
+    propertySheetPages.add(propertySheetPage);
+
+    return propertySheetPage;
+  }
+
+  /**
+   * This deals with how we want selection in the outliner to affect the other views.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void handleContentOutlineSelection(ISelection selection)
+  {
+    if (selectionViewer != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
+    {
+      Iterator<?> selectedElements = ((IStructuredSelection)selection).iterator();
+      if (selectedElements.hasNext())
+      {
+        // Get the first selected element.
+        //
+        Object selectedElement = selectedElements.next();
+
+        ArrayList<Object> selectionList = new ArrayList<Object>();
+        selectionList.add(selectedElement);
+        while (selectedElements.hasNext())
+        {
+          selectionList.add(selectedElements.next());
+        }
+
+        // Set the selection to the widget.
+        //
+        selectionViewer.setSelection(new StructuredSelection(selectionList));
+      }
+    }
+  }
+
+  /**
+   * This is for implementing {@link IEditorPart} and simply tests the command stack.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isDirty()
+  {
+    return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();
+  }
+
+  /**
+   * This is for implementing {@link IEditorPart} and simply saves the model file.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void doSave(IProgressMonitor progressMonitor)
+  {
+    // Save only resources that have actually changed.
+    //
+    final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+    saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+    saveOptions.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);
+
+    // Do the work within an operation because this is a long running activity that modifies the workbench.
+    //
+    WorkspaceModifyOperation operation = new WorkspaceModifyOperation()
+    {
+      // This is the method that gets invoked when the operation runs.
+      //
+      @Override
+      public void execute(IProgressMonitor monitor)
+      {
+        // Save the resources to the file system.
+        //
+        boolean first = true;
+        List<Resource> resources = editingDomain.getResourceSet().getResources();
+        for (int i = 0; i < resources.size(); ++i)
+        {
+          Resource resource = resources.get(i);
+          if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource))
+          {
+            try
+            {
+              long timeStamp = resource.getTimeStamp();
+              resource.save(saveOptions);
+              if (resource.getTimeStamp() != timeStamp)
+              {
+                savedResources.add(resource);
+              }
+            }
+            catch (Exception exception)
+            {
+              resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+            }
+            first = false;
+          }
+        }
+      }
+    };
+
+    updateProblemIndication = false;
+    try
+    {
+      // This runs the options, and shows progress.
+      //
+      new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);
+
+      // Refresh the necessary state.
+      //
+      ((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone();
+      firePropertyChange(IEditorPart.PROP_DIRTY);
+    }
+    catch (Exception exception)
+    {
+      // Something went wrong that shouldn't.
+      //
+      EvolutionEditorPlugin.INSTANCE.log(exception);
+    }
+    updateProblemIndication = true;
+    updateProblemIndication();
+  }
+
+  /**
+   * This returns whether something has been persisted to the URI of the specified resource.
+   * The implementation uses the URI converter from the editor's resource set to try to open an input stream.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean isPersisted(Resource resource)
+  {
+    boolean result = false;
+    try
+    {
+      InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());
+      if (stream != null)
+      {
+        result = true;
+        stream.close();
+      }
+    }
+    catch (IOException e)
+    {
+      // Ignore
+    }
+    return result;
+  }
+
+  /**
+   * This always returns true because it is not currently supported.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isSaveAsAllowed()
+  {
+    return true;
+  }
+
+  /**
+   * This also changes the editor's input.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void doSaveAs()
+  {
+    SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
+    saveAsDialog.open();
+    IPath path = saveAsDialog.getResult();
+    if (path != null)
+    {
+      IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+      if (file != null)
+      {
+        doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));
+      }
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void doSaveAs(URI uri, IEditorInput editorInput)
+  {
+    editingDomain.getResourceSet().getResources().get(0).setURI(uri);
+    setInputWithNotify(editorInput);
+    setPartName(editorInput.getName());
+    IProgressMonitor progressMonitor = getActionBars().getStatusLineManager() != null ? getActionBars().getStatusLineManager().getProgressMonitor()
+        : new NullProgressMonitor();
+    doSave(progressMonitor);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void gotoMarker(IMarker marker)
+  {
+    List<?> targetObjects = markerHelper.getTargetObjects(editingDomain, marker);
+    if (!targetObjects.isEmpty())
+    {
+      setSelectionToViewer(targetObjects);
+    }
+  }
+
+  /**
+   * This is called during startup.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void init(IEditorSite site, IEditorInput editorInput)
+  {
+    setSite(site);
+    setInputWithNotify(editorInput);
+    setPartName(editorInput.getName());
+    site.setSelectionProvider(this);
+    site.getPage().addPartListener(partListener);
+    ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setFocus()
+  {
+    getControl(getActivePage()).setFocus();
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void addSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    selectionChangedListeners.add(listener);
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void removeSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    selectionChangedListeners.remove(listener);
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ISelection getSelection()
+  {
+    return editorSelection;
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection.
+   * Calling this result will notify the listeners.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setSelection(ISelection selection)
+  {
+    editorSelection = selection;
+
+    for (ISelectionChangedListener listener : selectionChangedListeners)
+    {
+      listener.selectionChanged(new SelectionChangedEvent(this, selection));
+    }
+    setStatusLineManager(selection);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setStatusLineManager(ISelection selection)
+  {
+    IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ? contentOutlineStatusLineManager
+        : getActionBars().getStatusLineManager();
+
+    if (statusLineManager != null)
+    {
+      if (selection instanceof IStructuredSelection)
+      {
+        Collection<?> collection = ((IStructuredSelection)selection).toList();
+        switch (collection.size())
+        {
+        case 0:
+        {
+          statusLineManager.setMessage(getString("_UI_NoObjectSelected"));
+          break;
+        }
+        case 1:
+        {
+          String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());
+          statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));
+          break;
+        }
+        default:
+        {
+          statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size())));
+          break;
+        }
+        }
+      }
+      else
+      {
+        statusLineManager.setMessage("");
+      }
+    }
+  }
+
+  /**
+   * This looks up a string in the plugin's plugin.properties file.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static String getString(String key)
+  {
+    return EvolutionEditorPlugin.INSTANCE.getString(key);
+  }
+
+  /**
+   * This looks up a string in plugin.properties, making a substitution.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static String getString(String key, Object s1)
+  {
+    return EvolutionEditorPlugin.INSTANCE.getString(key, new Object[] { s1 });
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void menuAboutToShow(IMenuManager menuManager)
+  {
+    ((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EditingDomainActionBarContributor getActionBarContributor()
+  {
+    return (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IActionBars getActionBars()
+  {
+    return getActionBarContributor().getActionBars();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public AdapterFactory getAdapterFactory()
+  {
+    return adapterFactory;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void dispose()
+  {
+    updateProblemIndication = false;
+
+    ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
+
+    getSite().getPage().removePartListener(partListener);
+
+    adapterFactory.dispose();
+
+    if (getActionBarContributor().getActiveEditor() == this)
+    {
+      getActionBarContributor().setActiveEditor(null);
+    }
+
+    for (PropertySheetPage propertySheetPage : propertySheetPages)
+    {
+      propertySheetPage.dispose();
+    }
+
+    if (contentOutlinePage != null)
+    {
+      contentOutlinePage.dispose();
+    }
+
+    super.dispose();
+  }
+
+  /**
+   * Returns whether the outline view should be presented to the user.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean showOutlineView()
+  {
+    return false;
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditorPlugin.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditorPlugin.java
new file mode 100644
index 0000000..8aa42e9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionEditorPlugin.java
@@ -0,0 +1,96 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.presentation;
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.ui.EclipseUIPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.provider.EcoreEditPlugin;
+
+/**
+ * This is the central singleton for the Evolution editor plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class EvolutionEditorPlugin extends EMFPlugin
+{
+  public static final String PLUGIN_ID = "org.eclipse.emf.cdo.evolution.editor";
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final EvolutionEditorPlugin INSTANCE = new EvolutionEditorPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionEditorPlugin()
+  {
+    super(new ResourceLocator[] { EcoreEditPlugin.INSTANCE, });
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipseUIPlugin
+  {
+    /**
+     * Creates an instance.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionModelWizard.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionModelWizard.java
new file mode 100644
index 0000000..1e7b23d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/EvolutionModelWizard.java
@@ -0,0 +1,657 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.presentation;
+
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.provider.EvolutionEditPlugin;
+
+import org.eclipse.emf.common.CommonPlugin;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.ISetSelectionTarget;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.StringTokenizer;
+
+/**
+ * This is a simple wizard for creating a new model file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionModelWizard extends Wizard implements INewWizard
+{
+  /**
+   * The supported extensions for created files.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final List<String> FILE_EXTENSIONS = Collections
+      .unmodifiableList(Arrays.asList(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionEditorFilenameExtensions").split("\\s*,\\s*")));
+
+  /**
+   * A formatted list of supported file extensions, suitable for display.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final String FORMATTED_FILE_EXTENSIONS = EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionEditorFilenameExtensions")
+      .replaceAll("\\s*,\\s*", ", ");
+
+  /**
+   * This caches an instance of the model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionPackage evolutionPackage = EvolutionPackage.eINSTANCE;
+
+  /**
+   * This caches an instance of the model factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionFactory evolutionFactory = evolutionPackage.getEvolutionFactory();
+
+  /**
+   * This is the file creation page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionModelWizardNewFileCreationPage newFileCreationPage;
+
+  /**
+   * This is the initial object creation page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionModelWizardInitialObjectCreationPage initialObjectCreationPage;
+
+  /**
+   * Remember the selection during initialization for populating the default container.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IStructuredSelection selection;
+
+  /**
+   * Remember the workbench during initialization.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IWorkbench workbench;
+
+  /**
+   * Caches the names of the types that can be created as the root object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected List<String> initialObjectNames;
+
+  /**
+   * This just records the information.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void init(IWorkbench workbench, IStructuredSelection selection)
+  {
+    this.workbench = workbench;
+    this.selection = selection;
+    setWindowTitle(EvolutionEditorPlugin.INSTANCE.getString("_UI_Wizard_label"));
+    setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(EvolutionEditorPlugin.INSTANCE.getImage("full/wizban/NewEvolution")));
+  }
+
+  /**
+   * Returns the names of the types that can be created as the root object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<String> getInitialObjectNames()
+  {
+    if (initialObjectNames == null)
+    {
+      initialObjectNames = new ArrayList<String>();
+      for (EClassifier eClassifier : evolutionPackage.getEClassifiers())
+      {
+        if (eClassifier instanceof EClass)
+        {
+          EClass eClass = (EClass)eClassifier;
+          if (!eClass.isAbstract())
+          {
+            initialObjectNames.add(eClass.getName());
+          }
+        }
+      }
+      Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator());
+    }
+    return initialObjectNames;
+  }
+
+  /**
+   * Create a new model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EObject createInitialModel()
+  {
+    EClass eClass = (EClass)evolutionPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());
+    EObject rootObject = evolutionFactory.create(eClass);
+    return rootObject;
+  }
+
+  /**
+   * Do the work after everything is specified.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean performFinish()
+  {
+    try
+    {
+      // Remember the file.
+      //
+      final IFile modelFile = getModelFile();
+
+      // Do the work within an operation.
+      //
+      WorkspaceModifyOperation operation = new WorkspaceModifyOperation()
+      {
+        @Override
+        protected void execute(IProgressMonitor progressMonitor)
+        {
+          try
+          {
+            // Create a resource set
+            //
+            ResourceSet resourceSet = new ResourceSetImpl();
+
+            // Get the URI of the model file.
+            //
+            URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
+
+            // Create a resource for this file.
+            //
+            Resource resource = resourceSet.createResource(fileURI);
+
+            // Add the initial model object to the contents.
+            //
+            EObject rootObject = createInitialModel();
+            if (rootObject != null)
+            {
+              resource.getContents().add(rootObject);
+            }
+
+            // Save the contents of the resource to the file system.
+            //
+            Map<Object, Object> options = new HashMap<Object, Object>();
+            options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());
+            resource.save(options);
+          }
+          catch (Exception exception)
+          {
+            EvolutionEditorPlugin.INSTANCE.log(exception);
+          }
+          finally
+          {
+            progressMonitor.done();
+          }
+        }
+      };
+
+      getContainer().run(false, false, operation);
+
+      // Select the new file resource in the current view.
+      //
+      IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+      IWorkbenchPage page = workbenchWindow.getActivePage();
+      final IWorkbenchPart activePart = page.getActivePart();
+      if (activePart instanceof ISetSelectionTarget)
+      {
+        final ISelection targetSelection = new StructuredSelection(modelFile);
+        getShell().getDisplay().asyncExec(new Runnable()
+        {
+          public void run()
+          {
+            ((ISetSelectionTarget)activePart).selectReveal(targetSelection);
+          }
+        });
+      }
+
+      // Open an editor on the new file.
+      //
+      try
+      {
+        page.openEditor(new FileEditorInput(modelFile), workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId());
+      }
+      catch (PartInitException exception)
+      {
+        MessageDialog.openError(workbenchWindow.getShell(), EvolutionEditorPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());
+        return false;
+      }
+
+      return true;
+    }
+    catch (Exception exception)
+    {
+      EvolutionEditorPlugin.INSTANCE.log(exception);
+      return false;
+    }
+  }
+
+  /**
+   * This is the one page of the wizard.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class EvolutionModelWizardNewFileCreationPage extends WizardNewFileCreationPage
+  {
+    /**
+     * Pass in the selection.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EvolutionModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection)
+    {
+      super(pageId, selection);
+    }
+
+    /**
+     * The framework calls this to see if the file is correct.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected boolean validatePage()
+    {
+      if (super.validatePage())
+      {
+        String extension = new Path(getFileName()).getFileExtension();
+        if (extension == null || !FILE_EXTENSIONS.contains(extension))
+        {
+          String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";
+          setErrorMessage(EvolutionEditorPlugin.INSTANCE.getString(key, new Object[] { FORMATTED_FILE_EXTENSIONS }));
+          return false;
+        }
+        return true;
+      }
+      return false;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public IFile getModelFile()
+    {
+      return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
+    }
+  }
+
+  /**
+   * This is the page where the type of object to create is selected.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class EvolutionModelWizardInitialObjectCreationPage extends WizardPage
+  {
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected Combo initialObjectField;
+
+    /**
+     * @generated
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     */
+    protected List<String> encodings;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected Combo encodingField;
+
+    /**
+     * Pass in the selection.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EvolutionModelWizardInitialObjectCreationPage(String pageId)
+    {
+      super(pageId);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void createControl(Composite parent)
+    {
+      Composite composite = new Composite(parent, SWT.NONE);
+      {
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 1;
+        layout.verticalSpacing = 12;
+        composite.setLayout(layout);
+
+        GridData data = new GridData();
+        data.verticalAlignment = GridData.FILL;
+        data.grabExcessVerticalSpace = true;
+        data.horizontalAlignment = GridData.FILL;
+        composite.setLayoutData(data);
+      }
+
+      Label containerLabel = new Label(composite, SWT.LEFT);
+      {
+        containerLabel.setText(EvolutionEditorPlugin.INSTANCE.getString("_UI_ModelObject"));
+
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        containerLabel.setLayoutData(data);
+      }
+
+      initialObjectField = new Combo(composite, SWT.BORDER);
+      {
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        data.grabExcessHorizontalSpace = true;
+        initialObjectField.setLayoutData(data);
+      }
+
+      for (String objectName : getInitialObjectNames())
+      {
+        initialObjectField.add(getLabel(objectName));
+      }
+
+      if (initialObjectField.getItemCount() == 1)
+      {
+        initialObjectField.select(0);
+      }
+      initialObjectField.addModifyListener(validator);
+
+      Label encodingLabel = new Label(composite, SWT.LEFT);
+      {
+        encodingLabel.setText(EvolutionEditorPlugin.INSTANCE.getString("_UI_XMLEncoding"));
+
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        encodingLabel.setLayoutData(data);
+      }
+      encodingField = new Combo(composite, SWT.BORDER);
+      {
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        data.grabExcessHorizontalSpace = true;
+        encodingField.setLayoutData(data);
+      }
+
+      for (String encoding : getEncodings())
+      {
+        encodingField.add(encoding);
+      }
+
+      encodingField.select(0);
+      encodingField.addModifyListener(validator);
+
+      setPageComplete(validatePage());
+      setControl(composite);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ModifyListener validator = new ModifyListener()
+    {
+      public void modifyText(ModifyEvent e)
+      {
+        setPageComplete(validatePage());
+      }
+    };
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected boolean validatePage()
+    {
+      return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void setVisible(boolean visible)
+    {
+      super.setVisible(visible);
+      if (visible)
+      {
+        if (initialObjectField.getItemCount() == 1)
+        {
+          initialObjectField.clearSelection();
+          encodingField.setFocus();
+        }
+        else
+        {
+          encodingField.clearSelection();
+          initialObjectField.setFocus();
+        }
+      }
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getInitialObjectName()
+    {
+      String label = initialObjectField.getText();
+
+      for (String name : getInitialObjectNames())
+      {
+        if (getLabel(name).equals(label))
+        {
+          return name;
+        }
+      }
+      return null;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getEncoding()
+    {
+      return encodingField.getText();
+    }
+
+    /**
+     * Returns the label for the specified type name.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected String getLabel(String typeName)
+    {
+      try
+      {
+        return EvolutionEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type");
+      }
+      catch (MissingResourceException mre)
+      {
+        EvolutionEditorPlugin.INSTANCE.log(mre);
+      }
+      return typeName;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected Collection<String> getEncodings()
+    {
+      if (encodings == null)
+      {
+        encodings = new ArrayList<String>();
+        for (StringTokenizer stringTokenizer = new StringTokenizer(EvolutionEditorPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer
+            .hasMoreTokens();)
+        {
+          encodings.add(stringTokenizer.nextToken());
+        }
+      }
+      return encodings;
+    }
+  }
+
+  /**
+   * The framework calls this to create the contents of the wizard.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void addPages()
+  {
+    // Create a page, set the title, and the initial model file name.
+    //
+    newFileCreationPage = new EvolutionModelWizardNewFileCreationPage("Whatever", selection);
+    newFileCreationPage.setTitle(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionModelWizard_label"));
+    newFileCreationPage.setDescription(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionModelWizard_description"));
+    newFileCreationPage.setFileName(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionEditorFilenameDefaultBase") + "." + FILE_EXTENSIONS.get(0));
+    addPage(newFileCreationPage);
+
+    // Try and get the resource selection to determine a current directory for the file dialog.
+    //
+    if (selection != null && !selection.isEmpty())
+    {
+      // Get the resource...
+      //
+      Object selectedElement = selection.iterator().next();
+      if (selectedElement instanceof IResource)
+      {
+        // Get the resource parent, if its a file.
+        //
+        IResource selectedResource = (IResource)selectedElement;
+        if (selectedResource.getType() == IResource.FILE)
+        {
+          selectedResource = selectedResource.getParent();
+        }
+
+        // This gives us a directory...
+        //
+        if (selectedResource instanceof IFolder || selectedResource instanceof IProject)
+        {
+          // Set this for the container.
+          //
+          newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
+
+          // Make up a unique new name here.
+          //
+          String defaultModelBaseFilename = EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionEditorFilenameDefaultBase");
+          String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0);
+          String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;
+          for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i)
+          {
+            modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;
+          }
+          newFileCreationPage.setFileName(modelFilename);
+        }
+      }
+    }
+    initialObjectCreationPage = new EvolutionModelWizardInitialObjectCreationPage("Whatever2");
+    initialObjectCreationPage.setTitle(EvolutionEditorPlugin.INSTANCE.getString("_UI_EvolutionModelWizard_label"));
+    initialObjectCreationPage.setDescription(EvolutionEditorPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description"));
+    addPage(initialObjectCreationPage);
+  }
+
+  /**
+   * Get the file from the page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IFile getModelFile()
+  {
+    return newFileCreationPage.getModelFile();
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolution.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolution.java
new file mode 100644
index 0000000..91cbd8a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolution.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.util.DiagnosticType;
+
+import org.eclipse.emf.common.util.Diagnostic;
+
+import org.eclipse.swt.graphics.Image;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class BasicDiagnosticResolution extends DiagnosticResolution implements DiagnosticResolutionRelevance
+{
+  private final Image image;
+
+  private final String text;
+
+  private final String description;
+
+  private final boolean multi;
+
+  public BasicDiagnosticResolution(Image image, String text, String description, boolean multi)
+  {
+    this.image = image;
+    this.text = text;
+    this.description = description;
+    this.multi = multi;
+  }
+
+  @Override
+  public Image getImage()
+  {
+    return image;
+  }
+
+  @Override
+  public String getText()
+  {
+    return text;
+  }
+
+  @Override
+  public String getDescription()
+  {
+    return description;
+  }
+
+  public boolean isMulti()
+  {
+    return multi;
+  }
+
+  @Override
+  public Diagnostic[] findOtherDiagnostics(Diagnostic[] diagnostics)
+  {
+    if (multi && diagnostics != null && diagnostics.length != 0)
+    {
+      List<Diagnostic> result = new ArrayList<Diagnostic>();
+      for (int i = 0; i < diagnostics.length; i++)
+      {
+        Diagnostic diagnostic = diagnostics[i];
+        if (isCompatibleDiagnostic(diagnostic))
+        {
+          result.add(diagnostic);
+        }
+      }
+
+      return result.toArray(new Diagnostic[result.size()]);
+    }
+
+    return super.findOtherDiagnostics(diagnostics);
+  }
+
+  protected boolean isCompatibleDiagnostic(Diagnostic diagnostic)
+  {
+    return false;
+  }
+
+  public int getRelevanceForResolution()
+  {
+    return 0;
+  }
+
+  @Override
+  public abstract void run(Diagnostic diagnostic);
+
+  /**
+   * @author Eike Stepper
+   */
+  public static abstract class TypedDiagnosticResolution extends BasicDiagnosticResolution
+  {
+    private final DiagnosticType type;
+
+    public TypedDiagnosticResolution(Image image, String text, String description, boolean multi, String source, int code)
+    {
+      super(image, text, description, multi);
+      type = new DiagnosticType(source, code);
+    }
+
+    public DiagnosticType getType()
+    {
+      return type;
+    }
+
+    protected DiagnosticType[] getCompatibleTypes()
+    {
+      return new DiagnosticType[] { type };
+    }
+
+    @Override
+    protected boolean isCompatibleDiagnostic(Diagnostic diagnostic)
+    {
+      for (int i = 0; i < getCompatibleTypes().length; i++)
+      {
+        DiagnosticType type = getCompatibleTypes()[i];
+        if (type.appliesTo(diagnostic))
+        {
+          return true;
+        }
+      }
+
+      return super.isCompatibleDiagnostic(diagnostic);
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolutionGenerator.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolutionGenerator.java
new file mode 100644
index 0000000..60a5bc7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/BasicDiagnosticResolutionGenerator.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.presentation.EvolutionEditorPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class BasicDiagnosticResolutionGenerator implements DiagnosticResolution.Generator
+{
+  protected ResourceLocator getResourceLocator()
+  {
+    return EvolutionEditorPlugin.INSTANCE;
+  }
+
+  protected String getString(String key, Object... substitutions)
+  {
+    return getString(getResourceLocator(), key, substitutions);
+  }
+
+  private String getString(ResourceLocator resourceLocator, String key, Object[] substitutions)
+  {
+    return substitutions == null || substitutions.length == 0 ? resourceLocator.getString(key) : resourceLocator.getString(key, substitutions);
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DefaultDiagnosticResolutionGenerator.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DefaultDiagnosticResolutionGenerator.java
new file mode 100644
index 0000000..75fd4aa
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DefaultDiagnosticResolutionGenerator.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.impl.EvolutionImpl;
+import org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl;
+import org.eclipse.emf.cdo.evolution.presentation.quickfix.DiagnosticResolution.Generator;
+import org.eclipse.emf.cdo.evolution.util.DiagnosticID;
+import org.eclipse.emf.cdo.evolution.util.DiagnosticType;
+import org.eclipse.emf.cdo.evolution.util.ElementHandler;
+import org.eclipse.emf.cdo.evolution.util.ElementRunnable;
+import org.eclipse.emf.cdo.evolution.util.EvolutionValidator;
+import org.eclipse.emf.cdo.evolution.util.IDAnnotation;
+
+import org.eclipse.net4j.util.factory.ProductCreationException;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eike Stepper
+ */
+public class DefaultDiagnosticResolutionGenerator extends BasicDiagnosticResolutionGenerator
+{
+  public DefaultDiagnosticResolutionGenerator()
+  {
+  }
+
+  public void getResolutions(Diagnostic diagnostic, final Context context)
+  {
+    if (EvolutionValidator.DIAGNOSTIC_SOURCE.equals(diagnostic.getSource()))
+    {
+      int code = diagnostic.getCode();
+      switch (code)
+      {
+      case EvolutionValidator.CODE_NO_MODEL:
+        handleNoModel(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_NO_URI:
+        handleNoURI(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_NO_RESOURCE_SET:
+        break;
+
+      case EvolutionValidator.CODE_RESOURCE_NOT_FOUND:
+        break;
+
+      case EvolutionValidator.CODE_LOAD_PROBLEM:
+        break;
+
+      case EvolutionValidator.CODE_CONTENT_PROBLEM:
+        break;
+
+      case EvolutionValidator.CODE_PACKAGE_MISSING:
+        handlePackageMissing(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_PACKAGE_NOT_UNIQUE:
+        break;
+
+      case EvolutionValidator.CODE_NSURI_NOT_UNIQUE:
+        break;
+
+      case EvolutionValidator.CODE_NSURI_NOT_CHANGED:
+        handleNSURINotChanged(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_ID_ANNOTATION_MISSING:
+      case EvolutionValidator.CODE_ID_WITHOUT_VALUE:
+        handleNoID(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_ID_NOT_UNIQUE:
+        handleIDNotUnique(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_FEATURE_PATH_UNKNOWN:
+        handleFeaturePathUnknown(diagnostic, context);
+        break;
+
+      case EvolutionValidator.CODE_RELEASE:
+        handleRelease(diagnostic, context);
+        break;
+      }
+    }
+  }
+
+  protected void handleNoModel(Diagnostic diagnostic, final Context context)
+  {
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_SelectModelsFromWorkspace"), null, false, diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        Shell shell = context.getEditor().getSite().getShell();
+
+        FilteredResourcesSelectionDialog dialog = new FilteredResourcesSelectionDialog(shell, true, ResourcesPlugin.getWorkspace().getRoot(), IResource.FILE);
+        dialog.setInitialPattern("*.ecore");
+        dialog.open();
+
+        Object[] result = dialog.getResult();
+        if (result == null || result.length == 0)
+        {
+          return;
+        }
+
+        Evolution evolution = (Evolution)diagnostic.getData().get(0);
+        for (Object object : result)
+        {
+          if (object instanceof IFile)
+          {
+            IFile file = (IFile)object;
+
+            Model model = EvolutionFactory.eINSTANCE.createModel(URI.createPlatformResourceURI(file.getFullPath().toString(), true));
+            evolution.getModels().add(model);
+          }
+        }
+      }
+    });
+  }
+
+  protected void handleNoURI(Diagnostic diagnostic, final Context context)
+  {
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_SelectModelFromWorkspace"), null, false, diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        Shell shell = context.getEditor().getSite().getShell();
+
+        FilteredResourcesSelectionDialog dialog = new FilteredResourcesSelectionDialog(shell, false, ResourcesPlugin.getWorkspace().getRoot(), IResource.FILE);
+        dialog.setInitialPattern("*.ecore");
+        dialog.open();
+
+        Object[] result = dialog.getResult();
+        if (result == null || result.length == 0 || !(result[0] instanceof IFile))
+        {
+          return;
+        }
+
+        IFile file = (IFile)result[0];
+        Model model = (Model)diagnostic.getData().get(0);
+        model.setURI(URI.createPlatformResourceURI(file.getFullPath().toString(), true));
+      }
+    });
+  }
+
+  protected void handlePackageMissing(Diagnostic diagnostic, final Context context)
+  {
+    final List<?> data = diagnostic.getData();
+
+    Resource resource = ((EPackage)data.get(2)).eResource();
+    if (resource != null)
+    {
+      final URI uri = resource.getURI();
+      if (uri != null)
+      {
+        context.add(new EvolutionDiagnosticResolution(null, getString("_QF_PackageMissing", uri), null, true, diagnostic.getCode())
+        {
+          @Override
+          public void run(Diagnostic diagnostic)
+          {
+            Model model = EvolutionFactory.eINSTANCE.createModel(uri);
+
+            Evolution evolution = (Evolution)data.get(0);
+            evolution.getModels().add(model);
+          }
+        });
+      }
+    }
+  }
+
+  protected void handleNSURINotChanged(Diagnostic diagnostic, Context context)
+  {
+    Evolution evolution = (Evolution)diagnostic.getData().get(3);
+    final int nextVersion = evolution.getNextReleaseVersion();
+
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_SetVersionIntoNamespace", nextVersion), null, true, diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        EPackage ePackage = (EPackage)diagnostic.getData().get(0);
+        String nsURI = ePackage.getNsURI();
+        if (!nsURI.endsWith("/"))
+        {
+          nsURI += "/";
+        }
+
+        Pattern pattern = Pattern.compile("/v[0-9]+/");
+        Matcher matcher = pattern.matcher(nsURI);
+        if (matcher.find())
+        {
+          int start = matcher.start();
+          int end = matcher.end();
+          String prefix = nsURI.substring(0, start);
+          String suffix = nsURI.substring(end, nsURI.length() - 1);
+
+          nsURI = prefix + "/v" + nextVersion + "/" + suffix;
+        }
+        else
+        {
+          nsURI += "v" + nextVersion;
+        }
+
+        ePackage.setNsURI(nsURI);
+      }
+    });
+
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_DisableUniqueNamespaceEnforcement"), null, false, diagnostic.getCode())
+    {
+      @Override
+      public int getRelevanceForResolution()
+      {
+        return -100;
+      }
+
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        Evolution evolution = (Evolution)diagnostic.getData().get(3);
+        evolution.setUniqueNamespaces(false);
+      }
+    });
+  }
+
+  protected void handleNoID(Diagnostic diagnostic, final Context context)
+  {
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_AssignID"), null, true, diagnostic.getCode())
+    {
+      @Override
+      protected DiagnosticType[] getCompatibleTypes()
+      {
+        return new DiagnosticType[] { getType(), new DiagnosticType(EvolutionValidator.DIAGNOSTIC_SOURCE, EvolutionValidator.CODE_ID_WITHOUT_VALUE) };
+      }
+
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        EModelElement modelElement = (EModelElement)diagnostic.getData().get(0);
+        IDAnnotation.ensureValue(modelElement);
+      }
+    });
+  }
+
+  protected void handleIDNotUnique(Diagnostic diagnostic, final Context context)
+  {
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_RememberID"), null, true, diagnostic.getCode())
+    {
+      @Override
+      public int getRelevanceForResolution()
+      {
+        return 100;
+      }
+
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        EModelElement modelElement = (EModelElement)diagnostic.getData().get(0);
+        String oldValue = IDAnnotation.getValue(modelElement);
+        IDAnnotation.setOldValue(modelElement, oldValue);
+        IDAnnotation.setValue(modelElement, null);
+        IDAnnotation.ensureValue(modelElement);
+      }
+    });
+
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_ReplaceID"), null, true, diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        EModelElement modelElement = (EModelElement)diagnostic.getData().get(0);
+        IDAnnotation.setValue(modelElement, null);
+        IDAnnotation.ensureValue(modelElement);
+      }
+    });
+  }
+
+  protected void handleFeaturePathUnknown(Diagnostic diagnostic, Context context)
+  {
+    final ElementChange elementChange = (ElementChange)diagnostic.getData().get(0);
+    final ChangeKind kind = elementChange.getKind();
+
+    context.add(new EvolutionDiagnosticResolution(null,
+        getString("_QF_SpecifyFeaturePath", kind.getName().toLowerCase(), ElementHandler.getLabel(elementChange.getNewElement())), null, false,
+        diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        FeaturePathMigration migration = EvolutionFactory.eINSTANCE.createFeaturePathMigration();
+        migration.setDiagnosticID(DiagnosticID.get(diagnostic).getValue());
+        migration.setFromClass(((EStructuralFeature)elementChange.getOldElement()).getEContainingClass());
+        migration.setToClass(((EStructuralFeature)elementChange.getNewElement()).getEContainingClass());
+
+        Evolution evolution = (Evolution)elementChange.getNewModelSet();
+        evolution.getMigrations().add(migration);
+      }
+    });
+  }
+
+  protected void handleRelease(Diagnostic diagnostic, final Context context)
+  {
+    final EvolutionImpl evolution = (EvolutionImpl)diagnostic.getData().get(0);
+    final int nextVersion = evolution.getNextReleaseVersion();
+
+    context.add(new EvolutionDiagnosticResolution(null, getString("_QF_CreateRelease", nextVersion), null, false, diagnostic.getCode())
+    {
+      @Override
+      public void run(Diagnostic diagnostic)
+      {
+        Release release = EvolutionFactory.eINSTANCE.createRelease();
+        release.setDate(new Date());
+        release.setVersion(nextVersion);
+
+        evolution.getReleases().add(release);
+
+        Collection<EPackage> rootPackages = EcoreUtil.copyAll(evolution.getRootPackages());
+        release.getRootPackages().addAll(rootPackages);
+
+        for (EPackage rootPackage : evolution.getRootPackages())
+        {
+          ElementHandler.execute(rootPackage, new ElementRunnable()
+          {
+            public void run(EModelElement modelElement)
+            {
+              IDAnnotation.setOldValue(modelElement, null);
+            }
+          });
+        }
+
+        ModelSetChangeImpl change = (ModelSetChangeImpl)evolution.getChange();
+        if (change != null)
+        {
+          change.reset();
+          evolution.setChange(null);
+        }
+      }
+    });
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  protected static abstract class EvolutionDiagnosticResolution extends BasicDiagnosticResolution.TypedDiagnosticResolution
+  {
+    protected EvolutionDiagnosticResolution(Image image, String text, String description, boolean multi, int code)
+    {
+      super(image, text, description, multi, EvolutionValidator.DIAGNOSTIC_SOURCE, code);
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public static class Factory extends DiagnosticResolution.Generator.Factory
+  {
+    public Factory()
+    {
+    }
+
+    @Override
+    public Generator create(String description) throws ProductCreationException
+    {
+      return new DefaultDiagnosticResolutionGenerator();
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolution.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolution.java
new file mode 100644
index 0000000..603b746
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolution.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.presentation.EvolutionEditor;
+import org.eclipse.emf.cdo.evolution.presentation.quickfix.DiagnosticResolution.Generator.Context;
+
+import org.eclipse.net4j.util.container.IPluginContainer;
+import org.eclipse.net4j.util.factory.ProductCreationException;
+
+import org.eclipse.emf.common.util.Diagnostic;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.graphics.Image;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class DiagnosticResolution
+{
+  public static final Diagnostic[] NO_DIAGNOSTICS = {};
+
+  public abstract Image getImage();
+
+  public abstract String getText();
+
+  public abstract String getDescription();
+
+  public abstract void run(Diagnostic diagnostic);
+
+  public void run(Diagnostic[] diagnostics, IProgressMonitor monitor)
+  {
+    for (Diagnostic diagnostic : diagnostics)
+    {
+      monitor.subTask(diagnostic.getMessage());
+      run(diagnostic);
+    }
+  }
+
+  public Diagnostic[] findOtherDiagnostics(Diagnostic[] diagnostics)
+  {
+    return NO_DIAGNOSTICS;
+  }
+
+  public static DiagnosticResolution[] getResolutions(Diagnostic diagnostic, final EvolutionEditor editor)
+  {
+    final List<DiagnosticResolution> result = new ArrayList<DiagnosticResolution>();
+    Context context = new Generator.Context()
+    {
+      public EvolutionEditor getEditor()
+      {
+        return editor;
+      }
+
+      public void add(DiagnosticResolution resolution)
+      {
+        result.add(resolution);
+      }
+    };
+
+    for (String factoryType : IPluginContainer.INSTANCE.getFactoryTypes(Generator.Factory.PRODUCT_GROUP))
+    {
+      Generator generator = (Generator)IPluginContainer.INSTANCE.getElement(Generator.Factory.PRODUCT_GROUP, factoryType, null);
+      generator.getResolutions(diagnostic, context);
+    }
+
+    return result.toArray(new DiagnosticResolution[result.size()]);
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public interface Generator
+  {
+    public void getResolutions(Diagnostic diagnostic, Context context);
+
+    /**
+     * @author Eike Stepper
+     */
+    public interface Context
+    {
+      public EvolutionEditor getEditor();
+
+      public void add(DiagnosticResolution resolution);
+    }
+
+    /**
+     * @author Eike Stepper
+     */
+    public static abstract class Factory extends org.eclipse.net4j.util.factory.Factory
+    {
+      public static final String PRODUCT_GROUP = "org.eclipse.emf.cdo.evolution.diagnosticResolutionGenerators";
+
+      public static final String DEFAULT_TYPE = "default";
+
+      public Factory()
+      {
+        this(DEFAULT_TYPE);
+      }
+
+      public Factory(String type)
+      {
+        super(PRODUCT_GROUP, type);
+      }
+
+      public abstract Generator create(String description) throws ProductCreationException;
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolutionRelevance.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolutionRelevance.java
new file mode 100644
index 0000000..88f67d4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/DiagnosticResolutionRelevance.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+/**
+ * @author Eike Stepper
+ */
+public interface DiagnosticResolutionRelevance
+{
+  public int getRelevanceForResolution();
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixPage.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixPage.java
new file mode 100644
index 0000000..fb48612
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixPage.java
@@ -0,0 +1,408 @@
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.presentation.EvolutionEditor;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.edit.command.ChangeCommand;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * QuickFixPage is a page for the quick fixes of a marker.
+ *
+ * @since 3.4
+ *
+ */
+public class QuickFixPage extends WizardPage
+{
+  private Map<DiagnosticResolution, Collection<Diagnostic>> resolutionsMap;
+
+  private TableViewer resolutionsViewer;
+
+  private CheckboxTableViewer diagnosticsViewer;
+
+  private final Diagnostic[] selectedDiagnostics;
+
+  private AdapterFactoryEditingDomain editingDomain;
+
+  public QuickFixPage(String problemDescription, Diagnostic[] selectedDiagnostics, Map<DiagnosticResolution, Collection<Diagnostic>> resolutionsMap,
+      AdapterFactoryEditingDomain editingDomain)
+  {
+    super("QuickFixPage");
+    this.selectedDiagnostics = selectedDiagnostics;
+    this.resolutionsMap = resolutionsMap;
+    this.editingDomain = editingDomain;
+
+    setTitle("Quick Fix");
+    setMessage(problemDescription);
+  }
+
+  public void createControl(Composite parent)
+  {
+    initializeDialogUnits(parent);
+
+    // Create a new composite as there is the title bar separator to deal with
+    Composite control = new Composite(parent, SWT.NONE);
+    control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+    setControl(control);
+
+    // PlatformUI.getWorkbench().getHelpSystem().setHelp(control, IWorkbenchHelpContextIds.PROBLEMS_VIEW);
+
+    FormLayout layout = new FormLayout();
+    layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+    layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+    layout.spacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+    control.setLayout(layout);
+
+    Label resolutionsLabel = new Label(control, SWT.NONE);
+    resolutionsLabel.setText("&Select a fix:");
+    resolutionsLabel.setLayoutData(new FormData());
+
+    createResolutionsList(control);
+
+    FormData listData = new FormData();
+    listData.top = new FormAttachment(resolutionsLabel, 0);
+    listData.left = new FormAttachment(0);
+    listData.right = new FormAttachment(100, 0);
+    listData.height = convertHeightInCharsToPixels(10);
+    resolutionsViewer.getControl().setLayoutData(listData);
+
+    Label title = new Label(control, SWT.NONE);
+    title.setText("&Problems:");
+    FormData labelData = new FormData();
+    labelData.top = new FormAttachment(resolutionsViewer.getControl(), 0);
+    labelData.left = new FormAttachment(0);
+    title.setLayoutData(labelData);
+
+    createDiagnosticsViewer(control);
+
+    Composite buttons = createTableButtons(control);
+    FormData buttonData = new FormData();
+    buttonData.top = new FormAttachment(title, 0);
+    buttonData.right = new FormAttachment(100);
+    buttonData.height = convertHeightInCharsToPixels(10);
+    buttons.setLayoutData(buttonData);
+
+    FormData tableData = new FormData();
+    tableData.top = new FormAttachment(buttons, 0, SWT.TOP);
+    tableData.left = new FormAttachment(0);
+    tableData.bottom = new FormAttachment(100);
+    tableData.right = new FormAttachment(buttons, 0);
+    tableData.height = convertHeightInCharsToPixels(10);
+    diagnosticsViewer.getControl().setLayoutData(tableData);
+
+    Dialog.applyDialogFont(control);
+
+    resolutionsViewer.setSelection(new StructuredSelection(resolutionsViewer.getElementAt(0)));
+
+    diagnosticsViewer.setCheckedElements(selectedDiagnostics);
+
+    setPageComplete(diagnosticsViewer.getCheckedElements().length > 0);
+  }
+
+  private Composite createTableButtons(Composite control)
+  {
+    Composite buttonComposite = new Composite(control, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+    layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+    buttonComposite.setLayout(layout);
+
+    Button selectAll = new Button(buttonComposite, SWT.PUSH);
+    selectAll.setText("Select &All");
+    selectAll.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
+    selectAll.addSelectionListener(new SelectionAdapter()
+    {
+      @Override
+      public void widgetSelected(SelectionEvent arg0)
+      {
+        diagnosticsViewer.setAllChecked(true);
+        setPageComplete(!resolutionsViewer.getStructuredSelection().isEmpty());
+      }
+    });
+
+    Button deselectAll = new Button(buttonComposite, SWT.PUSH);
+    deselectAll.setText("&Deselect All");
+    deselectAll.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
+    deselectAll.addSelectionListener(new SelectionAdapter()
+    {
+      @Override
+      public void widgetSelected(SelectionEvent arg0)
+      {
+        diagnosticsViewer.setAllChecked(false);
+        setPageComplete(false);
+      }
+    });
+
+    return buttonComposite;
+  }
+
+  private void createResolutionsList(Composite control)
+  {
+    resolutionsViewer = new TableViewer(control, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
+    resolutionsViewer.setContentProvider(new IStructuredContentProvider()
+    {
+      public Object[] getElements(Object inputElement)
+      {
+        return resolutionsMap.keySet().toArray();
+      }
+
+      public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+      {
+      }
+
+      public void dispose()
+      {
+      }
+    });
+
+    resolutionsViewer.setLabelProvider(new LabelProvider()
+    {
+      @Override
+      public String getText(Object element)
+      {
+        return ((DiagnosticResolution)element).getText();
+      }
+
+      @Override
+      public Image getImage(Object element)
+      {
+        return ((DiagnosticResolution)element).getImage();
+      }
+    });
+
+    resolutionsViewer.setComparator(new ViewerComparator()
+    {
+      /**
+       * This comparator compares the resolutions based on the relevance of the
+       * resolutions. Any resolution that doesn't implement DiagnosticResolutionRelevance
+       * will be deemed to have relevance 0 (default value for relevance). If both
+       * resolutions have the same relevance, then marker resolution label string will
+       * be used for comparing the resolutions.
+       *
+       * @see DiagnosticResolutionRelevance#getRelevanceForResolution()
+       */
+      @Override
+      public int compare(Viewer viewer, Object e1, Object e2)
+      {
+        int relevanceMarker1 = e1 instanceof DiagnosticResolutionRelevance ? ((DiagnosticResolutionRelevance)e1).getRelevanceForResolution() : 0;
+        int relevanceMarker2 = e2 instanceof DiagnosticResolutionRelevance ? ((DiagnosticResolutionRelevance)e2).getRelevanceForResolution() : 0;
+        if (relevanceMarker1 != relevanceMarker2)
+        {
+          return Integer.valueOf(relevanceMarker2).compareTo(Integer.valueOf(relevanceMarker1));
+        }
+
+        return ((DiagnosticResolution)e1).getText().compareTo(((DiagnosticResolution)e2).getText());
+      }
+    });
+
+    resolutionsViewer.addSelectionChangedListener(new ISelectionChangedListener()
+    {
+      public void selectionChanged(SelectionChangedEvent event)
+      {
+        diagnosticsViewer.refresh();
+        setPageComplete(diagnosticsViewer.getCheckedElements().length > 0);
+      }
+    });
+
+    resolutionsViewer.setInput(this);
+  }
+
+  private void createDiagnosticsViewer(Composite parent)
+  {
+    diagnosticsViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);
+    diagnosticsViewer.setContentProvider(new DiagnosticsContentProvider());
+    diagnosticsViewer.setInput(this);
+
+    Table table = diagnosticsViewer.getTable();
+    table.setHeaderVisible(true);
+    table.setLinesVisible(true);
+
+    EvolutionEditor.createDiagnosticElementColumn(diagnosticsViewer, editingDomain.getAdapterFactory());
+    EvolutionEditor.createDiagnosticResourceColumn(diagnosticsViewer, editingDomain.getAdapterFactory());
+
+    diagnosticsViewer.addCheckStateListener(new ICheckStateListener()
+    {
+      public void checkStateChanged(CheckStateChangedEvent event)
+      {
+        if (event.getChecked() == true)
+        {
+          setPageComplete(true);
+        }
+        else
+        {
+          setPageComplete(diagnosticsViewer.getCheckedElements().length > 0);
+        }
+      }
+    });
+
+    // new OpenAndLinkWithEditorHelper(markersTable)
+    // {
+    // {
+    // setLinkWithEditor(false);
+    // }
+    //
+    // @Override
+    // protected void activate(ISelection selection)
+    // {
+    // open(selection, true);
+    // }
+    //
+    // /** Not supported*/
+    //
+    // @Override
+    // protected void linkToEditor(ISelection selection)
+    // {
+    // }
+    //
+    // @Override
+    // protected void open(ISelection selection, boolean activate)
+    // {
+    // if (selection.isEmpty())
+    // {
+    // return;
+    // }
+    // Diagnostic marker = (Diagnostic)((IStructuredSelection)selection).getFirstElement();
+    // if (marker != null && marker.getResource() instanceof IFile)
+    // {
+    // try
+    // {
+    // IDE.openEditor(site.getPage(), marker, activate);
+    // }
+    // catch (PartInitException e)
+    // {
+    // MarkerSupportInternalUtilities.showViewError(e);
+    // }
+    // }
+    // }
+    // };
+  }
+
+  public Diagnostic getSelectedDiagnostic()
+  {
+    IStructuredSelection selection = diagnosticsViewer.getStructuredSelection();
+    if (!selection.isEmpty())
+    {
+      if (selection.size() == 1)
+      {
+        return (Diagnostic)selection.getFirstElement();
+      }
+    }
+
+    return null;
+  }
+
+  void performFinish(IProgressMonitor monitor)
+  {
+    final DiagnosticResolution resolution = getSelectedResolution();
+    if (resolution == null)
+    {
+      return;
+    }
+
+    final Object[] checked = diagnosticsViewer.getCheckedElements();
+    if (checked.length == 0)
+    {
+      return;
+    }
+
+    try
+    {
+      getWizard().getContainer().run(false, true, new IRunnableWithProgress()
+      {
+        public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
+        {
+          final Diagnostic[] diagnostics = new Diagnostic[checked.length];
+          System.arraycopy(checked, 0, diagnostics, 0, checked.length);
+
+          ChangeCommand command = new ChangeCommand(editingDomain.getResourceSet())
+          {
+            @Override
+            protected void doExecute()
+            {
+              resolution.run(diagnostics, monitor);
+            }
+          };
+
+          editingDomain.getCommandStack().execute(command);
+        }
+      });
+    }
+    catch (InvocationTargetException e)
+    {
+      StatusManager.getManager().handle(QuickFixWizard.newStatus(IStatus.ERROR, e.getLocalizedMessage(), e));
+    }
+    catch (InterruptedException e)
+    {
+      StatusManager.getManager().handle(QuickFixWizard.newStatus(IStatus.ERROR, e.getLocalizedMessage(), e));
+    }
+  }
+
+  private DiagnosticResolution getSelectedResolution()
+  {
+    return (DiagnosticResolution)resolutionsViewer.getStructuredSelection().getFirstElement();
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private final class DiagnosticsContentProvider implements IStructuredContentProvider
+  {
+    public Object[] getElements(Object inputElement)
+    {
+      DiagnosticResolution selected = getSelectedResolution();
+      if (selected != null && resolutionsMap.containsKey(selected))
+      {
+        return resolutionsMap.get(selected).toArray();
+      }
+
+      return DiagnosticResolution.NO_DIAGNOSTICS;
+    }
+
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+    {
+    }
+
+    public void dispose()
+    {
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixWizard.java b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixWizard.java
new file mode 100644
index 0000000..d9a6778
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution.editor/src/org/eclipse/emf/cdo/evolution/presentation/quickfix/QuickFixWizard.java
@@ -0,0 +1,115 @@
+package org.eclipse.emf.cdo.evolution.presentation.quickfix;
+
+import org.eclipse.emf.cdo.evolution.presentation.EvolutionEditorPlugin;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * The wizard for quick fixes.
+ */
+public class QuickFixWizard extends Wizard
+{
+  private Diagnostic[] selectedDiagnostics;
+
+  private Map<DiagnosticResolution, Collection<Diagnostic>> resolutionsMap;
+
+  private String description;
+
+  private AdapterFactoryEditingDomain editingDomain;
+
+  public QuickFixWizard(String description, Diagnostic[] selectedDiagnostics, Map<DiagnosticResolution, Collection<Diagnostic>> resolutionsMap,
+      AdapterFactoryEditingDomain editingDomain)
+  {
+    this.selectedDiagnostics = selectedDiagnostics;
+    this.resolutionsMap = resolutionsMap;
+    this.description = description;
+    this.editingDomain = editingDomain;
+
+    setNeedsProgressMonitor(true);
+    setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE
+        .getImageDescriptor(URI.createPlatformPluginURI(EvolutionEditorPlugin.PLUGIN_ID + "/icons/full/wizban/quick_fix.png", true)));
+  }
+
+  @Override
+  public void addPages()
+  {
+    super.addPages();
+    addPage(new QuickFixPage(description, selectedDiagnostics, resolutionsMap, editingDomain));
+  }
+
+  @Override
+  public boolean performFinish()
+  {
+    IRunnableWithProgress finishRunnable = new IRunnableWithProgress()
+    {
+      public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
+      {
+        IWizardPage[] pages = getPages();
+        SubMonitor subMonitor = SubMonitor.convert(monitor, "Fixing", 10 * pages.length + 1);
+        subMonitor.worked(1);
+        for (IWizardPage page : pages)
+        {
+          // Allow for cancel event processing
+          getShell().getDisplay().readAndDispatch();
+          QuickFixPage wizardPage = (QuickFixPage)page;
+          wizardPage.performFinish(subMonitor.split(10));
+        }
+      }
+    };
+
+    try
+    {
+      getContainer().run(false, true, finishRunnable);
+    }
+    catch (InvocationTargetException e)
+    {
+      StatusManager.getManager().handle(newStatus(IStatus.ERROR, e.getLocalizedMessage(), e));
+      return false;
+    }
+    catch (InterruptedException e)
+    {
+      StatusManager.getManager().handle(newStatus(IStatus.ERROR, e.getLocalizedMessage(), e));
+      return false;
+    }
+
+    return true;
+  }
+
+  public static IStatus newStatus(int severity, String message, Throwable exception)
+  {
+    String statusMessage = message;
+    if (message == null || message.trim().length() == 0)
+    {
+      if (exception == null)
+      {
+        throw new IllegalArgumentException();
+      }
+      else if (exception.getMessage() == null)
+      {
+        statusMessage = exception.toString();
+      }
+      else
+      {
+        statusMessage = exception.getMessage();
+      }
+    }
+
+    return new Status(severity, EvolutionEditorPlugin.PLUGIN_ID, severity, statusMessage, exception);
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.classpath b/plugins/org.eclipse.emf.cdo.evolution/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.options b/plugins/org.eclipse.emf.cdo.evolution/.options
new file mode 100644
index 0000000..1ce0cff
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.options
@@ -0,0 +1,3 @@
+# Debugging and tracing options
+
+org.eclipse.emf.cdo.evolution/debug = true
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.project b/plugins/org.eclipse.emf.cdo.evolution/.project
new file mode 100644
index 0000000..ab2b2d6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.project
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.cdo.evolution</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.oomph.version.VersionBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>check.maven.pom</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>ignore.lower.bound.dependency.ranges</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>release.path</key>
+					<value>/org.eclipse.emf.cdo.releng/versions/release.xml</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+		<nature>org.eclipse.oomph.version.VersionNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.evolution/.settings/.api_filters
new file mode 100644
index 0000000..ceab799
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/.api_filters
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.emf.cdo.evolution" version="2">
+    <resource path="src/org/eclipse/emf/cdo/evolution/Release.java" type="org.eclipse.emf.cdo.evolution.Release">
+        <filter id="574619656">
+            <message_arguments>
+                <message_argument value="CDOObject"/>
+                <message_argument value="Release"/>
+            </message_arguments>
+        </filter>
+        <filter id="574668824">
+            <message_arguments>
+                <message_argument value="Migratable"/>
+                <message_argument value="Release"/>
+                <message_argument value="CDOObject"/>
+            </message_arguments>
+        </filter>
+        <filter id="574668824">
+            <message_arguments>
+                <message_argument value="ModelSet"/>
+                <message_argument value="Release"/>
+                <message_argument value="CDOObject"/>
+            </message_arguments>
+        </filter>
+    </resource>
+</component>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..e9c6dcb
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/.project=UTF-8
+encoding//model/evolution.ecore=UTF-8
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ff3d8e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,412 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,*.ucls,doc-files/,package.html,package-info.java
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=2
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=160
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.launching.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 0000000..556ed07
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+#Fri Sep 02 05:38:34 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=ignore
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..222aec0
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,119 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_EMFT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_EMFT
+formatter_settings_version=12
+org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=org.eclipse.emf.cdo;org.eclipse.emf.internal.cdo;org.eclipse.net4j;org.eclipse.internal.net4j;org.eclipse.emf;org.eclipse;com;org;javax;java;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment"/><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment"/><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment"/><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\r\n * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *    Eike Stepper - initial API and implementation\r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author Eike Stepper\r\n */</template><template autoinsert\="false" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment"/><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment"/><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment"/><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=true
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.ltk.core.refactoring.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..864e30f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.tasks.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..b050639
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.team.ui.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644
index 0000000..97c11e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.mylyn.team.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+commit.comment.template=[${task.id}] ${task.description}\r\n\r\n${task.url}
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.api.tools.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..0c17d59
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,95 @@
+#Thu Feb 04 09:44:24 CET 2010
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+MISSING_EE_DESCRIPTIONS=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Ignore
+automatically_removed_unused_problem_filters=Disabled
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..fe01bb7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,31 @@
+#Thu Feb 04 09:44:24 CET 2010
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=2
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=1
+compilers.p.missing-version-import-package=1
+compilers.p.missing-version-require-bundle=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.evolution/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.evolution/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3ed48d3
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.emf.cdo.evolution;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.emf.cdo.evolution.impl.EvolutionPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.emf.cdo.evolution;version="1.0.0",
+ org.eclipse.emf.cdo.evolution.impl;version="1.0.0",
+ org.eclipse.emf.cdo.evolution.util;version="1.0.0"
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
+Bundle-ActivationPolicy: lazy
+Automatic-Module-Name: org.eclipse.emf.cdo.evolution
diff --git a/plugins/org.eclipse.emf.cdo.evolution/about.html b/plugins/org.eclipse.emf.cdo.evolution/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/build.properties b/plugins/org.eclipse.emf.cdo.evolution/build.properties
new file mode 100644
index 0000000..310af6c
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/build.properties
@@ -0,0 +1,27 @@
+# Copyright (c) 2013, 2017 Eike Stepper (Loehne, Germany) and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Eike Stepper - initial API and implementation
+
+# NLS_MESSAGEFORMAT_VAR
+
+bin.includes = .,\
+               model/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html
+jars.compile.order = .
+source.. = src/
+output.. = bin/
+src.includes = about.html,\
+               pom.xml
+
+doc.project = org.eclipse.emf.cdo.doc
+
+generateSourceReferences = true
+               
diff --git a/plugins/org.eclipse.emf.cdo.evolution/model/evolution.ecore b/plugins/org.eclipse.emf.cdo.evolution/model/evolution.ecore
new file mode 100644
index 0000000..b407812
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/model/evolution.ecore
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="evolution" nsURI="http://www.eclipse.org/emf/CDO/evolution/1.0.0"
+    nsPrefix="evolution">
+  <eClassifiers xsi:type="ecore:EClass" name="ModelSet" abstract="true">
+    <eOperations name="getEvolution" eType="#//Evolution"/>
+    <eOperations name="getVersion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    <eOperations name="getPreviousRelease" eType="#//Release"/>
+    <eOperations name="getRootPackages" upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EPackage"/>
+    <eOperations name="getAllPackages" upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EPackage"/>
+    <eOperations name="containsElement" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
+      <eParameters name="modelElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+    </eOperations>
+    <eOperations name="getElement">
+      <eGenericType eTypeParameter="#//ModelSet/getElement/T"/>
+      <eTypeParameters name="T">
+        <eBounds eClassifier="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+      </eTypeParameters>
+      <eParameters name="id" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    </eOperations>
+    <eOperations name="getElementID" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString">
+      <eParameters name="modelElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+    </eOperations>
+    <eOperations name="getElementID" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString">
+      <eParameters name="modelElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+      <eParameters name="considerOldIDs" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    </eOperations>
+    <eOperations name="compare" eType="#//ModelSetChange">
+      <eParameters name="other" eType="#//ModelSet"/>
+    </eOperations>
+    <eOperations name="getMigration" eType="#//Migration">
+      <eParameters name="diagnosticID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="change" eType="#//ModelSetChange"
+        transient="true" unsettable="true" derived="true" containment="true" resolveProxies="false">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+        <details key="suppressedUnsetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="migrations" upperBound="-1"
+        eType="#//Migration" containment="true" eOpposite="#//Migration/modelSet"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Model">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
+      <details key="constraints" value="ModelLoaded IDs_Exist NamespaceReflectsChange"/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="evolution" lowerBound="1"
+        eType="#//Evolution" eOpposite="#//Evolution/models"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uRI" eType="#//URI">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="attribute"/>
+        <details key="name" value="uri"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="rootPackage" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="allPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="missingPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Evolution" eSuperTypes="#//ModelSet">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
+      <details key="constraints" value="NotEmpty PackagesUnique NoMissingPackages IDsUnique"/>
+    </eAnnotations>
+    <eOperations name="getRelease" eType="#//Release">
+      <eParameters name="version" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="useEcorePackage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+        defaultValueLiteral="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="useEresourcePackage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="useEtypesPackage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uniqueNamespaces" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+        defaultValueLiteral="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="models" upperBound="-1"
+        eType="#//Model" containment="true" eOpposite="#//Model/evolution"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="rootPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="allPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="missingPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="releases" upperBound="-1"
+        eType="#//Release" containment="true" eOpposite="#//Release/evolution"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="orderedReleases" upperBound="-1"
+        eType="#//Release" changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="latestRelease" eType="#//Release"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nextReleaseVersion" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Release" eSuperTypes="#//ModelSet">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="evolution" lowerBound="1"
+        eType="#//Evolution" eOpposite="#//Evolution/releases"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="date" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="nextRelease" eType="#//Release"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="previousRelease" eType="#//Release"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="rootPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="allPackages" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Change" abstract="true">
+    <eOperations name="getModelSetChange" eType="#//ModelSetChange"/>
+    <eOperations name="getOldElementFor" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement">
+      <eParameters name="newElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+    </eOperations>
+    <eOperations name="getNewElementsFor" upperBound="-1" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement">
+      <eParameters name="oldElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+    </eOperations>
+    <eOperations name="getOldModelSet" eType="#//ModelSet"/>
+    <eOperations name="getNewModelSet" eType="#//ModelSet"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//Change"
+        resolveProxies="false" eOpposite="#//Change/children"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="children" upperBound="-1"
+        eType="#//Change" containment="true" resolveProxies="false" eOpposite="#//Change/parent"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ModelSetChange" eSuperTypes="#//Change">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="oldModelSet" eType="#//ModelSet">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="newModelSet" eType="#//ModelSet">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ElementChange" eSuperTypes="#//Change">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
+      <details key="constraints" value="FeaturePathIsKnown"/>
+    </eAnnotations>
+    <eOperations name="getElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="oldElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="newElement" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ChangeKind">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="PropertyChange" eSuperTypes="#//Change">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="feature" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="oldValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="suppressedSetVisibility" value="true"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ChangeKind"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Migration" abstract="true">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
+      <details key="constraints" value="NotObsolete"/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="modelSet" eType="#//ModelSet"
+        eOpposite="#//ModelSet/migrations"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="diagnosticID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeaturePathMigration" eSuperTypes="#//Migration">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
+      <details key="constraints" value="NewFeatureReachable"/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="fromClass" lowerBound="1"
+        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EClass"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="toClass" lowerBound="1"
+        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EClass"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="featurePath" upperBound="-1"
+        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EDataType" name="URI" instanceClassName="org.eclipse.emf.common.util.URI"/>
+  <eClassifiers xsi:type="ecore:EEnum" name="ChangeKind">
+    <eLiterals name="NONE"/>
+    <eLiterals name="CHANGED" value="1"/>
+    <eLiterals name="REMOVED" value="2"/>
+    <eLiterals name="ADDED" value="3"/>
+    <eLiterals name="COPIED" value="4"/>
+    <eLiterals name="MOVED" value="5"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/model/evolution.genmodel b/plugins/org.eclipse.emf.cdo.evolution/model/evolution.genmodel
new file mode 100644
index 0000000..ae03a8a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/model/evolution.genmodel
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.emf.cdo.evolution/src" creationIcons="false"
+    modelPluginID="org.eclipse.emf.cdo.evolution" modelName="Evolution" modelPluginClass="org.eclipse.emf.cdo.evolution.impl.EvolutionPlugin"
+    rootExtendsInterface="org.eclipse.emf.cdo.CDOObject" rootExtendsClass="org.eclipse.emf.internal.cdo.CDOObjectImpl"
+    testsDirectory="" importerID="org.eclipse.emf.importer.cdo" featureDelegation="Dynamic"
+    complianceLevel="5.0" copyrightFields="false" optimizedHasChildren="true" colorProviders="true"
+    fontProviders="true" usedGenPackages="../../org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"
+    operationReflection="true" importOrganizing="true" decoration="Live" styleProviders="true"
+    cleanup="true" autoResizeProperties="true" findAction="true" collapseAllAction="true">
+  <foreignModel>evolution.ecore</foreignModel>
+  <modelPluginVariables>CDO=org.eclipse.emf.cdo</modelPluginVariables>
+  <genPackages prefix="Evolution" basePackage="org.eclipse.emf.cdo" disposableProviderFactory="true"
+      dataTypeConverters="true" multipleEditorPages="false" extensibleProviderFactory="true"
+      childCreationExtenders="true" ecorePackage="evolution.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="evolution.ecore#//ChangeKind">
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/NONE"/>
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/CHANGED"/>
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/REMOVED"/>
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/ADDED"/>
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/COPIED"/>
+      <genEnumLiterals ecoreEnumLiteral="evolution.ecore#//ChangeKind/MOVED"/>
+    </genEnums>
+    <genDataTypes ecoreDataType="evolution.ecore#//URI"/>
+    <genClasses image="false" ecoreClass="evolution.ecore#//ModelSet">
+      <genFeatures property="None" children="true" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//ModelSet/change"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference evolution.ecore#//ModelSet/migrations"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getEvolution"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getVersion"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getPreviousRelease"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getRootPackages"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getAllPackages"/>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/containsElement">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/containsElement/modelElement"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getElement">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/getElement/id"/>
+        <genTypeParameters ecoreTypeParameter="evolution.ecore#//ModelSet/getElement/T"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getElementID">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/getElementID/modelElement"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getElementID.1">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/getElementID.1/modelElement"/>
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/getElementID.1/considerOldIDs"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/compare">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/compare/other"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//ModelSet/getMigration">
+        <genParameters ecoreParameter="evolution.ecore#//ModelSet/getMigration/diagnosticID"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//Model">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Model/evolution"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Model/uRI"/>
+      <genFeatures property="Readonly" children="true" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Model/rootPackage"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Model/allPackages"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Model/referencedPackages"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Model/missingPackages"/>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//Evolution">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Evolution/useEcorePackage"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Evolution/useEresourcePackage"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Evolution/useEtypesPackage"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Evolution/uniqueNamespaces"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/models"/>
+      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/rootPackages"/>
+      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/allPackages"/>
+      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/missingPackages"/>
+      <genFeatures property="None" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/releases"/>
+      <genFeatures property="Readonly" children="true" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/orderedReleases"/>
+      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Evolution/latestRelease"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Evolution/nextReleaseVersion"/>
+      <genOperations ecoreOperation="evolution.ecore#//Evolution/getRelease">
+        <genParameters ecoreParameter="evolution.ecore#//Evolution/getRelease/version"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//Release">
+      <genFeatures property="None" notify="false" createChild="false" propertySortChoices="true"
+          ecoreFeature="ecore:EReference evolution.ecore#//Release/evolution"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Release/version"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Release/date"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Release/nextRelease"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Release/previousRelease"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference evolution.ecore#//Release/rootPackages"/>
+      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Release/allPackages"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="evolution.ecore#//Change">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Change/parent"/>
+      <genFeatures property="None" children="true" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Change/children"/>
+      <genOperations ecoreOperation="evolution.ecore#//Change/getModelSetChange"/>
+      <genOperations ecoreOperation="evolution.ecore#//Change/getOldElementFor">
+        <genParameters ecoreParameter="evolution.ecore#//Change/getOldElementFor/newElement"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//Change/getNewElementsFor">
+        <genParameters ecoreParameter="evolution.ecore#//Change/getNewElementsFor/oldElement"/>
+      </genOperations>
+      <genOperations ecoreOperation="evolution.ecore#//Change/getOldModelSet"/>
+      <genOperations ecoreOperation="evolution.ecore#//Change/getNewModelSet"/>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//ModelSetChange">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//ModelSetChange/oldModelSet"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//ModelSetChange/newModelSet"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="evolution.ecore#//ElementChange">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//ElementChange/oldElement"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//ElementChange/newElement"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//ElementChange/kind"/>
+      <genOperations ecoreOperation="evolution.ecore#//ElementChange/getElement"/>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//PropertyChange">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//PropertyChange/feature"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//PropertyChange/oldValue"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//PropertyChange/newValue"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//PropertyChange/kind"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="evolution.ecore#//Migration">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference evolution.ecore#//Migration/modelSet"/>
+      <genFeatures property="None" createChild="false" ecoreFeature="ecore:EAttribute evolution.ecore#//Migration/diagnosticID"/>
+    </genClasses>
+    <genClasses ecoreClass="evolution.ecore#//FeaturePathMigration">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//FeaturePathMigration/fromClass"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//FeaturePathMigration/toClass"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference evolution.ecore#//FeaturePathMigration/featurePath"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/plugin.properties b/plugins/org.eclipse.emf.cdo.evolution/plugin.properties
new file mode 100644
index 0000000..8e8682a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/plugin.properties
@@ -0,0 +1,36 @@
+# Copyright (c) 2013 Eike Stepper (Loehne, Germany) and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Eike Stepper - initial API and implementation
+
+pluginName = CDO Model Repository Evolution
+providerName = Eclipse Modeling Project
+
+_UI_NoModel_diagnostic = The evolution has no model
+_UI_NO_URI_diagnostic = The URI is missing
+_UI_NO_RESOURCE_SET_diagnostic = A resource set is not available
+_UI_RESOURCE_NOT_FOUND_diagnostic = The resource ''{0}'' is not found
+_UI_LOAD_PROBLEM_diagnostic = The resource ''{0}'' could not be loaded
+_UI_CONTENT_PROBLEM_diagnostic = The resource ''{0}'' does not contain a package
+
+_UI_PackageNotUnique_diagnostic = The model URI ''{0}'' is not unique
+_UI_NsuriNotUnique_diagnostic = The nsURI ''{0}'' of package ''{0}'' is not unique
+_UI_MissingPackage_diagnostic = The referenced package ''{0}'' is missing
+
+_UI_NsUriMustChange_diagnostic = The structure of the package ''{0}'' has changed since release v{1} but the nsURI is still the same
+
+_UI_IDsExist_AnnotationMissing_diagnostic = The ID annotation is missing
+_UI_IDsExist_NoValue_diagnostic = The ID annotation has no value
+_UI_IDNotUnique_diagnostic = The ID ''{0}'' is not unique
+
+_UI_MigrationUnused_diagnostic = The migration ''{0}'' is unused
+
+_UI_FeaturePathIsKnown_diagnostic = The feature ''{0}'' has been {1} from ''{2}'' but the feature path is not known
+
+_UI_Unchanged_diagnostic = The models are unchanged
+_UI_UnchangedSince_diagnostic = The models are unchanged since release v{0}
+_UI_Release_diagnostic = The models can be released now
diff --git a/plugins/org.eclipse.emf.cdo.evolution/plugin.xml b/plugins/org.eclipse.emf.cdo.evolution/plugin.xml
new file mode 100644
index 0000000..3e851a6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+	Copyright (c) 2013 Eike Stepper (Loehne, Germany) and others.
+	All rights reserved. This program and the accompanying materials
+	are made available under the terms of the Eclipse Public License v1.0
+	which accompanies this distribution, and is available at
+	http://www.eclipse.org/legal/epl-v10.html
+
+	Contributors:
+	  Eike Stepper - initial API and implementation
+-->
+
+<plugin>
+
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated evolution -->
+      <package
+            uri="http://www.eclipse.org/emf/CDO/evolution/1.0.0"
+            class="org.eclipse.emf.cdo.evolution.EvolutionPackage"
+            genModel="model/evolution.genmodel"/>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/pom.xml b/plugins/org.eclipse.emf.cdo.evolution/pom.xml
new file mode 100644
index 0000000..755d213
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Eike Stepper (Loehne, Germany) and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Public License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/legal/epl-v10.html
+
+  Contributors:
+    Eike Stepper - initial API and implementation
+-->
+<project
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+	  <groupId>org.eclipse.emf.cdo</groupId>
+    <artifactId>org.eclipse.emf.cdo.plugins</artifactId>
+    <version>4.7.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.emf.cdo.releng.parent/plugins</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.emf.cdo</groupId>
+  <artifactId>org.eclipse.emf.cdo.evolution</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+</project>
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Change.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Change.java
new file mode 100644
index 0000000..7492053
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Change.java
@@ -0,0 +1,116 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.cdo.CDOObject;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EModelElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Change#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Change#getChildren <em>Children</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getChange()
+ * @model abstract="true"
+ * @extends CDOObject
+ * @generated
+ */
+public interface Change extends CDOObject
+{
+  /**
+   * Returns the value of the '<em><b>Parent</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Change#getChildren <em>Children</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Parent</em>' container reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Parent</em>' container reference.
+   * @see #setParent(Change)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getChange_Parent()
+   * @see org.eclipse.emf.cdo.evolution.Change#getChildren
+   * @model opposite="children" resolveProxies="false" transient="false"
+   * @generated
+   */
+  Change getParent();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Change#getParent <em>Parent</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Parent</em>' container reference.
+   * @see #getParent()
+   * @generated
+   */
+  void setParent(Change value);
+
+  /**
+   * Returns the value of the '<em><b>Children</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.cdo.evolution.Change}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Change#getParent <em>Parent</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Children</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Children</em>' containment reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getChange_Children()
+   * @see org.eclipse.emf.cdo.evolution.Change#getParent
+   * @model opposite="parent" containment="true"
+   * @generated
+   */
+  EList<Change> getChildren();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  ModelSet getOldModelSet();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  ModelSet getNewModelSet();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  ModelSetChange getModelSetChange();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  EModelElement getOldElementFor(EModelElement newElement);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  EList<EModelElement> getNewElementsFor(EModelElement oldElement);
+
+} // Change
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ChangeKind.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ChangeKind.java
new file mode 100644
index 0000000..d77d774
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ChangeKind.java
@@ -0,0 +1,330 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Change Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getChangeKind()
+ * @model
+ * @generated
+ */
+public enum ChangeKind implements Enumerator
+{
+  /**
+   * The '<em><b>NONE</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #NONE_VALUE
+   * @generated
+   * @ordered
+   */
+  NONE(0, "NONE", "NONE"),
+
+  /**
+   * The '<em><b>CHANGED</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #CHANGED_VALUE
+   * @generated
+   * @ordered
+   */
+  CHANGED(1, "CHANGED", "CHANGED"),
+  /**
+   * The '<em><b>REMOVED</b></em>' literal object.
+   * <!-- begin-user-doc -->
+  * <!-- end-user-doc -->
+   * @see #REMOVED_VALUE
+   * @generated
+   * @ordered
+   */
+  REMOVED(2, "REMOVED", "REMOVED"),
+  /**
+   * The '<em><b>ADDED</b></em>' literal object.
+   * <!-- begin-user-doc -->
+  * <!-- end-user-doc -->
+   * @see #ADDED_VALUE
+   * @generated
+   * @ordered
+   */
+  ADDED(3, "ADDED", "ADDED"),
+  /**
+   * The '<em><b>COPIED</b></em>' literal object.
+   * <!-- begin-user-doc -->
+  * <!-- end-user-doc -->
+   * @see #COPIED_VALUE
+   * @generated
+   * @ordered
+   */
+  COPIED(4, "COPIED", "COPIED"),
+  /**
+   * The '<em><b>MOVED</b></em>' literal object.
+   * <!-- begin-user-doc -->
+  * <!-- end-user-doc -->
+   * @see #MOVED_VALUE
+   * @generated
+   * @ordered
+   */
+  MOVED(5, "MOVED", "MOVED");
+
+  /**
+   * The '<em><b>NONE</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>NONE</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #NONE
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int NONE_VALUE = 0;
+
+  /**
+   * The '<em><b>CHANGED</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>CHANGED</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #CHANGED
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int CHANGED_VALUE = 1;
+
+  /**
+   * The '<em><b>REMOVED</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>REMOVED</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #REMOVED
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int REMOVED_VALUE = 2;
+
+  /**
+   * The '<em><b>ADDED</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>ADDED</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #ADDED
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int ADDED_VALUE = 3;
+
+  /**
+   * The '<em><b>COPIED</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>COPIED</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #COPIED
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int COPIED_VALUE = 4;
+
+  /**
+   * The '<em><b>MOVED</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of '<em><b>MOVED</b></em>' literal object isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @see #MOVED
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int MOVED_VALUE = 5;
+
+  /**
+   * An array of all the '<em><b>Change Kind</b></em>' enumerators.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static final ChangeKind[] VALUES_ARRAY = new ChangeKind[] { NONE, CHANGED, REMOVED, ADDED, COPIED, MOVED, };
+
+  /**
+   * A public read-only list of all the '<em><b>Change Kind</b></em>' enumerators.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final List<ChangeKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+  /**
+   * Returns the '<em><b>Change Kind</b></em>' literal with the specified literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param literal the literal.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static ChangeKind get(String literal)
+  {
+    for (int i = 0; i < VALUES_ARRAY.length; ++i)
+    {
+      ChangeKind result = VALUES_ARRAY[i];
+      if (result.toString().equals(literal))
+      {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the '<em><b>Change Kind</b></em>' literal with the specified name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param name the name.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static ChangeKind getByName(String name)
+  {
+    for (int i = 0; i < VALUES_ARRAY.length; ++i)
+    {
+      ChangeKind result = VALUES_ARRAY[i];
+      if (result.getName().equals(name))
+      {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the '<em><b>Change Kind</b></em>' literal with the specified integer value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the integer value.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static ChangeKind get(int value)
+  {
+    switch (value)
+    {
+    case NONE_VALUE:
+      return NONE;
+    case CHANGED_VALUE:
+      return CHANGED;
+    case REMOVED_VALUE:
+      return REMOVED;
+    case ADDED_VALUE:
+      return ADDED;
+    case COPIED_VALUE:
+      return COPIED;
+    case MOVED_VALUE:
+      return MOVED;
+    }
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final int value;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final String name;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final String literal;
+
+  /**
+   * Only this class can construct instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private ChangeKind(int value, String name, String literal)
+  {
+    this.value = value;
+    this.name = name;
+    this.literal = literal;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public int getValue()
+  {
+    return value;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getName()
+  {
+    return name;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getLiteral()
+  {
+    return literal;
+  }
+
+  /**
+   * Returns the literal value of the enumerator, which is its string representation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    return literal;
+  }
+
+} // ChangeKind
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ElementChange.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ElementChange.java
new file mode 100644
index 0000000..5daa1bf
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ElementChange.java
@@ -0,0 +1,82 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.ecore.EModelElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Element Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ElementChange#getOldElement <em>Old Element</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ElementChange#getNewElement <em>New Element</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ElementChange#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getElementChange()
+ * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='FeaturePathIsKnown'"
+ * @generated
+ */
+public interface ElementChange extends Change
+{
+  /**
+   * Returns the value of the '<em><b>Old Element</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Old Element</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Old Element</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getElementChange_OldElement()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  EModelElement getOldElement();
+
+  /**
+   * Returns the value of the '<em><b>New Element</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>New Element</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>New Element</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getElementChange_NewElement()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  EModelElement getNewElement();
+
+  /**
+   * Returns the value of the '<em><b>Kind</b></em>' attribute.
+   * The literals are from the enumeration {@link org.eclipse.emf.cdo.evolution.ChangeKind}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Kind</em>' attribute.
+   * @see org.eclipse.emf.cdo.evolution.ChangeKind
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getElementChange_Kind()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  ChangeKind getKind();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  EModelElement getElement();
+
+} // ElementChange
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Evolution.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Evolution.java
new file mode 100644
index 0000000..528cbb5
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Evolution.java
@@ -0,0 +1,286 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EPackage;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Evolution</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEcorePackage <em>Use Ecore Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEresourcePackage <em>Use Eresource Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEtypesPackage <em>Use Etypes Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#isUniqueNamespaces <em>Unique Namespaces</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getModels <em>Models</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getRootPackages <em>Root Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getAllPackages <em>All Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getMissingPackages <em>Missing Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getReleases <em>Releases</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getOrderedReleases <em>Ordered Releases</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getLatestRelease <em>Latest Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Evolution#getNextReleaseVersion <em>Next Release Version</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution()
+ * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='NotEmpty PackagesUnique NoMissingPackages IDsUnique'"
+ * @generated
+ */
+public interface Evolution extends ModelSet
+{
+  /**
+   * Returns the value of the '<em><b>Models</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.cdo.evolution.Model}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Model#getEvolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Models</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Models</em>' containment reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_Models()
+   * @see org.eclipse.emf.cdo.evolution.Model#getEvolution
+   * @model opposite="evolution" containment="true"
+   * @generated
+   */
+  EList<Model> getModels();
+
+  /**
+   * Returns the value of the '<em><b>Use Ecore Package</b></em>' attribute.
+   * The default value is <code>"true"</code>.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Use Ecore Package</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Use Ecore Package</em>' attribute.
+   * @see #setUseEcorePackage(boolean)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_UseEcorePackage()
+   * @model default="true"
+   * @generated
+   */
+  boolean isUseEcorePackage();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEcorePackage <em>Use Ecore Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Use Ecore Package</em>' attribute.
+   * @see #isUseEcorePackage()
+   * @generated
+   */
+  void setUseEcorePackage(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>Use Eresource Package</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Use Eresource Package</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Use Eresource Package</em>' attribute.
+   * @see #setUseEresourcePackage(boolean)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_UseEresourcePackage()
+   * @model
+   * @generated
+   */
+  boolean isUseEresourcePackage();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEresourcePackage <em>Use Eresource Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Use Eresource Package</em>' attribute.
+   * @see #isUseEresourcePackage()
+   * @generated
+   */
+  void setUseEresourcePackage(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>Use Etypes Package</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Use Etypes Package</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Use Etypes Package</em>' attribute.
+   * @see #setUseEtypesPackage(boolean)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_UseEtypesPackage()
+   * @model
+   * @generated
+   */
+  boolean isUseEtypesPackage();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEtypesPackage <em>Use Etypes Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Use Etypes Package</em>' attribute.
+   * @see #isUseEtypesPackage()
+   * @generated
+   */
+  void setUseEtypesPackage(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>Unique Namespaces</b></em>' attribute.
+   * The default value is <code>"true"</code>.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Unique Namespaces</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Unique Namespaces</em>' attribute.
+   * @see #setUniqueNamespaces(boolean)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_UniqueNamespaces()
+   * @model default="true"
+   * @generated
+   */
+  boolean isUniqueNamespaces();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Evolution#isUniqueNamespaces <em>Unique Namespaces</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Unique Namespaces</em>' attribute.
+   * @see #isUniqueNamespaces()
+   * @generated
+   */
+  void setUniqueNamespaces(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>Root Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Root Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Root Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_RootPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getRootPackages();
+
+  /**
+   * Returns the value of the '<em><b>All Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>All Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>All Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_AllPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getAllPackages();
+
+  public Map<String, Set<EPackage>> getReleasedPackages();
+
+  /**
+   * Returns the value of the '<em><b>Releases</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.cdo.evolution.Release}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Release#getEvolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Releases</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Releases</em>' containment reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_Releases()
+   * @see org.eclipse.emf.cdo.evolution.Release#getEvolution
+   * @model opposite="evolution" containment="true"
+   * @generated
+   */
+  EList<Release> getReleases();
+
+  /**
+   * Returns the value of the '<em><b>Ordered Releases</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.cdo.evolution.Release}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Ordered Releases</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Ordered Releases</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_OrderedReleases()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<Release> getOrderedReleases();
+
+  /**
+   * Returns the value of the '<em><b>Latest Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Latest Release</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Latest Release</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_LatestRelease()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  Release getLatestRelease();
+
+  /**
+   * Returns the value of the '<em><b>Next Release Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Next Release Version</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Next Release Version</em>' attribute.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_NextReleaseVersion()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  int getNextReleaseVersion();
+
+  /**
+   * Returns the value of the '<em><b>Missing Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Missing Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Missing Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getEvolution_MissingPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getMissingPackages();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  Release getRelease(int version);
+
+} // Evolution
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionFactory.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionFactory.java
new file mode 100644
index 0000000..90503ae
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionFactory.java
@@ -0,0 +1,148 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EFactory;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage
+ * @generated
+ */
+public interface EvolutionFactory extends EFactory
+{
+  /**
+   * The singleton instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  EvolutionFactory eINSTANCE = org.eclipse.emf.cdo.evolution.impl.EvolutionFactoryImpl.init();
+
+  /**
+   * Returns a new object of class '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Model</em>'.
+   * @generated
+   */
+  Model createModel();
+
+  Model createModel(URI uri);
+
+  /**
+   * Returns a new object of class '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Evolution</em>'.
+   * @generated
+   */
+  Evolution createEvolution();
+
+  /**
+   * Returns a new object of class '<em>Release</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Release</em>'.
+   * @generated
+   */
+  Release createRelease();
+
+  /**
+   * Returns a new object of class '<em>Model Set Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Model Set Change</em>'.
+   * @generated
+   */
+  ModelSetChange createModelSetChange();
+
+  ModelSetChange createModelSetChange(ModelSet[] modelSetChain);
+
+  /**
+   * Returns a new object of class '<em>Element Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Element Change</em>'.
+   * @generated
+   */
+  ElementChange createElementChange();
+
+  ElementChange createElementChange(EModelElement oldElement, EModelElement newElement, ChangeKind kind);
+
+  /**
+   * Returns a new object of class '<em>Property Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Property Change</em>'.
+   * @generated
+   */
+  PropertyChange createPropertyChange();
+
+  /**
+   * Returns a new object of class '<em>Feature Path Migration</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Feature Path Migration</em>'.
+   * @generated
+   */
+  FeaturePathMigration createFeaturePathMigration();
+
+  PropertyChange createPropertyChange(EStructuralFeature feature, Object oldValue, Object newValue);
+
+  /**
+   * Returns an instance of data type '<em>Change Kind</em>' corresponding the given literal.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param literal a literal of the data type.
+   * @return a new instance value of the data type.
+   * @generated
+   */
+  ChangeKind createChangeKind(String literal);
+
+  /**
+   * Returns a literal representation of an instance of data type '<em>Change Kind</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param instanceValue an instance value of the data type.
+   * @return a literal representation of the instance value.
+   * @generated
+   */
+  String convertChangeKind(ChangeKind instanceValue);
+
+  /**
+   * Returns an instance of data type '<em>URI</em>' corresponding the given literal.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param literal a literal of the data type.
+   * @return a new instance value of the data type.
+   * @generated
+   */
+  URI createURI(String literal);
+
+  /**
+   * Returns a literal representation of an instance of data type '<em>URI</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param instanceValue an instance value of the data type.
+   * @return a literal representation of the instance value.
+   * @generated
+   */
+  String convertURI(URI instanceValue);
+
+  /**
+   * Returns the package supported by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the package supported by this factory.
+   * @generated
+   */
+  EvolutionPackage getEvolutionPackage();
+
+} // EvolutionFactory
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionPackage.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionPackage.java
new file mode 100644
index 0000000..3be6a2d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/EvolutionPackage.java
@@ -0,0 +1,2761 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface EvolutionPackage extends EPackage
+{
+  /**
+   * The package name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNAME = "evolution";
+
+  /**
+   * The package namespace URI.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_URI = "http://www.eclipse.org/emf/CDO/evolution/1.0.0";
+
+  /**
+   * The package namespace name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_PREFIX = "evolution";
+
+  /**
+   * The singleton instance of the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  EvolutionPackage eINSTANCE = org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl.init();
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelSetImpl <em>Model Set</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ModelSetImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModelSet()
+   * @generated
+   */
+  int MODEL_SET = 0;
+
+  /**
+   * The feature id for the '<em><b>Change</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET__CHANGE = 0;
+
+  /**
+   * The feature id for the '<em><b>Migrations</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET__MIGRATIONS = 1;
+
+  /**
+   * The number of structural features of the '<em>Model Set</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_FEATURE_COUNT = 2;
+
+  /**
+   * The operation id for the '<em>Get Evolution</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_EVOLUTION = 0;
+
+  /**
+   * The operation id for the '<em>Get Version</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_VERSION = 1;
+
+  /**
+   * The operation id for the '<em>Get Previous Release</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_PREVIOUS_RELEASE = 2;
+
+  /**
+   * The operation id for the '<em>Get Root Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_ROOT_PACKAGES = 3;
+
+  /**
+   * The operation id for the '<em>Get All Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_ALL_PACKAGES = 4;
+
+  /**
+   * The operation id for the '<em>Contains Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT = 5;
+
+  /**
+   * The operation id for the '<em>Get Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_ELEMENT__STRING = 6;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT = 7;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN = 8;
+
+  /**
+   * The operation id for the '<em>Compare</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___COMPARE__MODELSET = 9;
+
+  /**
+   * The operation id for the '<em>Get Migration</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET___GET_MIGRATION__STRING = 10;
+
+  /**
+   * The number of operations of the '<em>Model Set</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_OPERATION_COUNT = 11;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl <em>Model</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ModelImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModel()
+   * @generated
+   */
+  int MODEL = 1;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl <em>Evolution</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getEvolution()
+   * @generated
+   */
+  int EVOLUTION = 2;
+
+  /**
+   * The feature id for the '<em><b>Evolution</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__EVOLUTION = 0;
+
+  /**
+   * The feature id for the '<em><b>URI</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__URI = 1;
+
+  /**
+   * The feature id for the '<em><b>Root Package</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__ROOT_PACKAGE = 2;
+
+  /**
+   * The feature id for the '<em><b>All Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__ALL_PACKAGES = 3;
+
+  /**
+   * The feature id for the '<em><b>Referenced Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__REFERENCED_PACKAGES = 4;
+
+  /**
+   * The feature id for the '<em><b>Missing Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__MISSING_PACKAGES = 5;
+
+  /**
+   * The number of structural features of the '<em>Model</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_FEATURE_COUNT = 6;
+
+  /**
+   * The number of operations of the '<em>Model</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_OPERATION_COUNT = 0;
+
+  /**
+   * The feature id for the '<em><b>Change</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__CHANGE = MODEL_SET__CHANGE;
+
+  /**
+   * The feature id for the '<em><b>Migrations</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__MIGRATIONS = MODEL_SET__MIGRATIONS;
+
+  /**
+   * The feature id for the '<em><b>Use Ecore Package</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__USE_ECORE_PACKAGE = MODEL_SET_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Use Eresource Package</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__USE_ERESOURCE_PACKAGE = MODEL_SET_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Use Etypes Package</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__USE_ETYPES_PACKAGE = MODEL_SET_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Unique Namespaces</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__UNIQUE_NAMESPACES = MODEL_SET_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Models</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__MODELS = MODEL_SET_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>Root Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__ROOT_PACKAGES = MODEL_SET_FEATURE_COUNT + 5;
+
+  /**
+   * The feature id for the '<em><b>All Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__ALL_PACKAGES = MODEL_SET_FEATURE_COUNT + 6;
+
+  /**
+   * The feature id for the '<em><b>Missing Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__MISSING_PACKAGES = MODEL_SET_FEATURE_COUNT + 7;
+
+  /**
+   * The feature id for the '<em><b>Releases</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__RELEASES = MODEL_SET_FEATURE_COUNT + 8;
+
+  /**
+   * The feature id for the '<em><b>Ordered Releases</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__ORDERED_RELEASES = MODEL_SET_FEATURE_COUNT + 9;
+
+  /**
+   * The feature id for the '<em><b>Latest Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__LATEST_RELEASE = MODEL_SET_FEATURE_COUNT + 10;
+
+  /**
+   * The feature id for the '<em><b>Next Release Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION__NEXT_RELEASE_VERSION = MODEL_SET_FEATURE_COUNT + 11;
+
+  /**
+   * The number of structural features of the '<em>Evolution</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION_FEATURE_COUNT = MODEL_SET_FEATURE_COUNT + 12;
+
+  /**
+   * The operation id for the '<em>Get Evolution</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_EVOLUTION = MODEL_SET___GET_EVOLUTION;
+
+  /**
+   * The operation id for the '<em>Get Version</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_VERSION = MODEL_SET___GET_VERSION;
+
+  /**
+   * The operation id for the '<em>Get Previous Release</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_PREVIOUS_RELEASE = MODEL_SET___GET_PREVIOUS_RELEASE;
+
+  /**
+   * The operation id for the '<em>Get Root Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_ROOT_PACKAGES = MODEL_SET___GET_ROOT_PACKAGES;
+
+  /**
+   * The operation id for the '<em>Get All Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_ALL_PACKAGES = MODEL_SET___GET_ALL_PACKAGES;
+
+  /**
+   * The operation id for the '<em>Contains Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___CONTAINS_ELEMENT__EMODELELEMENT = MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_ELEMENT__STRING = MODEL_SET___GET_ELEMENT__STRING;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_ELEMENT_ID__EMODELELEMENT = MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN = MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN;
+
+  /**
+   * The operation id for the '<em>Compare</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___COMPARE__MODELSET = MODEL_SET___COMPARE__MODELSET;
+
+  /**
+   * The operation id for the '<em>Get Migration</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_MIGRATION__STRING = MODEL_SET___GET_MIGRATION__STRING;
+
+  /**
+   * The operation id for the '<em>Get Release</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION___GET_RELEASE__INT = MODEL_SET_OPERATION_COUNT + 0;
+
+  /**
+   * The number of operations of the '<em>Evolution</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVOLUTION_OPERATION_COUNT = MODEL_SET_OPERATION_COUNT + 1;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl <em>Release</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ReleaseImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getRelease()
+   * @generated
+   */
+  int RELEASE = 3;
+
+  /**
+   * The feature id for the '<em><b>Change</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__CHANGE = MODEL_SET__CHANGE;
+
+  /**
+   * The feature id for the '<em><b>Migrations</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__MIGRATIONS = MODEL_SET__MIGRATIONS;
+
+  /**
+   * The feature id for the '<em><b>Evolution</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__EVOLUTION = MODEL_SET_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__VERSION = MODEL_SET_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Date</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__DATE = MODEL_SET_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Next Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__NEXT_RELEASE = MODEL_SET_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Previous Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__PREVIOUS_RELEASE = MODEL_SET_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>Root Packages</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__ROOT_PACKAGES = MODEL_SET_FEATURE_COUNT + 5;
+
+  /**
+   * The feature id for the '<em><b>All Packages</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE__ALL_PACKAGES = MODEL_SET_FEATURE_COUNT + 6;
+
+  /**
+   * The number of structural features of the '<em>Release</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE_FEATURE_COUNT = MODEL_SET_FEATURE_COUNT + 7;
+
+  /**
+   * The operation id for the '<em>Get Evolution</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_EVOLUTION = MODEL_SET___GET_EVOLUTION;
+
+  /**
+   * The operation id for the '<em>Get Version</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_VERSION = MODEL_SET___GET_VERSION;
+
+  /**
+   * The operation id for the '<em>Get Previous Release</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_PREVIOUS_RELEASE = MODEL_SET___GET_PREVIOUS_RELEASE;
+
+  /**
+   * The operation id for the '<em>Get Root Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_ROOT_PACKAGES = MODEL_SET___GET_ROOT_PACKAGES;
+
+  /**
+   * The operation id for the '<em>Get All Packages</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_ALL_PACKAGES = MODEL_SET___GET_ALL_PACKAGES;
+
+  /**
+   * The operation id for the '<em>Contains Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___CONTAINS_ELEMENT__EMODELELEMENT = MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_ELEMENT__STRING = MODEL_SET___GET_ELEMENT__STRING;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_ELEMENT_ID__EMODELELEMENT = MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Element ID</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN = MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN;
+
+  /**
+   * The operation id for the '<em>Compare</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___COMPARE__MODELSET = MODEL_SET___COMPARE__MODELSET;
+
+  /**
+   * The operation id for the '<em>Get Migration</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE___GET_MIGRATION__STRING = MODEL_SET___GET_MIGRATION__STRING;
+
+  /**
+   * The number of operations of the '<em>Release</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RELEASE_OPERATION_COUNT = MODEL_SET_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ChangeImpl <em>Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ChangeImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getChange()
+   * @generated
+   */
+  int CHANGE = 4;
+
+  /**
+   * The feature id for the '<em><b>Parent</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE__PARENT = 0;
+
+  /**
+   * The feature id for the '<em><b>Children</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE__CHILDREN = 1;
+
+  /**
+   * The number of structural features of the '<em>Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_FEATURE_COUNT = 2;
+
+  /**
+   * The operation id for the '<em>Get Model Set Change</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE___GET_MODEL_SET_CHANGE = 0;
+
+  /**
+   * The operation id for the '<em>Get Old Element For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT = 1;
+
+  /**
+   * The operation id for the '<em>Get New Elements For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT = 2;
+
+  /**
+   * The operation id for the '<em>Get Old Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE___GET_OLD_MODEL_SET = 3;
+
+  /**
+   * The operation id for the '<em>Get New Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE___GET_NEW_MODEL_SET = 4;
+
+  /**
+   * The number of operations of the '<em>Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_OPERATION_COUNT = 5;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl <em>Model Set Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModelSetChange()
+   * @generated
+   */
+  int MODEL_SET_CHANGE = 5;
+
+  /**
+   * The feature id for the '<em><b>Parent</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE__PARENT = CHANGE__PARENT;
+
+  /**
+   * The feature id for the '<em><b>Children</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE__CHILDREN = CHANGE__CHILDREN;
+
+  /**
+   * The feature id for the '<em><b>Old Model Set</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE__OLD_MODEL_SET = CHANGE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>New Model Set</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE__NEW_MODEL_SET = CHANGE_FEATURE_COUNT + 1;
+
+  /**
+   * The number of structural features of the '<em>Model Set Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE_FEATURE_COUNT = CHANGE_FEATURE_COUNT + 2;
+
+  /**
+   * The operation id for the '<em>Get Model Set Change</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE___GET_MODEL_SET_CHANGE = CHANGE___GET_MODEL_SET_CHANGE;
+
+  /**
+   * The operation id for the '<em>Get Old Element For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT = CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get New Elements For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT = CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Old Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE___GET_OLD_MODEL_SET = CHANGE___GET_OLD_MODEL_SET;
+
+  /**
+   * The operation id for the '<em>Get New Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE___GET_NEW_MODEL_SET = CHANGE___GET_NEW_MODEL_SET;
+
+  /**
+   * The number of operations of the '<em>Model Set Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_SET_CHANGE_OPERATION_COUNT = CHANGE_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl <em>Element Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getElementChange()
+   * @generated
+   */
+  int ELEMENT_CHANGE = 6;
+
+  /**
+   * The feature id for the '<em><b>Parent</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE__PARENT = CHANGE__PARENT;
+
+  /**
+   * The feature id for the '<em><b>Children</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE__CHILDREN = CHANGE__CHILDREN;
+
+  /**
+   * The feature id for the '<em><b>Old Element</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE__OLD_ELEMENT = CHANGE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>New Element</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE__NEW_ELEMENT = CHANGE_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Kind</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE__KIND = CHANGE_FEATURE_COUNT + 2;
+
+  /**
+   * The number of structural features of the '<em>Element Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE_FEATURE_COUNT = CHANGE_FEATURE_COUNT + 3;
+
+  /**
+   * The operation id for the '<em>Get Model Set Change</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_MODEL_SET_CHANGE = CHANGE___GET_MODEL_SET_CHANGE;
+
+  /**
+   * The operation id for the '<em>Get Old Element For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT = CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get New Elements For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT = CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Old Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_OLD_MODEL_SET = CHANGE___GET_OLD_MODEL_SET;
+
+  /**
+   * The operation id for the '<em>Get New Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_NEW_MODEL_SET = CHANGE___GET_NEW_MODEL_SET;
+
+  /**
+   * The operation id for the '<em>Get Element</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE___GET_ELEMENT = CHANGE_OPERATION_COUNT + 0;
+
+  /**
+   * The number of operations of the '<em>Element Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int ELEMENT_CHANGE_OPERATION_COUNT = CHANGE_OPERATION_COUNT + 1;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl <em>Property Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getPropertyChange()
+   * @generated
+   */
+  int PROPERTY_CHANGE = 7;
+
+  /**
+   * The feature id for the '<em><b>Parent</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__PARENT = CHANGE__PARENT;
+
+  /**
+   * The feature id for the '<em><b>Children</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__CHILDREN = CHANGE__CHILDREN;
+
+  /**
+   * The feature id for the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__FEATURE = CHANGE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Old Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__OLD_VALUE = CHANGE_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>New Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__NEW_VALUE = CHANGE_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Kind</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE__KIND = CHANGE_FEATURE_COUNT + 3;
+
+  /**
+   * The number of structural features of the '<em>Property Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE_FEATURE_COUNT = CHANGE_FEATURE_COUNT + 4;
+
+  /**
+   * The operation id for the '<em>Get Model Set Change</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE___GET_MODEL_SET_CHANGE = CHANGE___GET_MODEL_SET_CHANGE;
+
+  /**
+   * The operation id for the '<em>Get Old Element For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT = CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get New Elements For</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT = CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT;
+
+  /**
+   * The operation id for the '<em>Get Old Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE___GET_OLD_MODEL_SET = CHANGE___GET_OLD_MODEL_SET;
+
+  /**
+   * The operation id for the '<em>Get New Model Set</em>' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE___GET_NEW_MODEL_SET = CHANGE___GET_NEW_MODEL_SET;
+
+  /**
+   * The number of operations of the '<em>Property Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int PROPERTY_CHANGE_OPERATION_COUNT = CHANGE_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.MigrationImpl <em>Migration</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.MigrationImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getMigration()
+   * @generated
+   */
+  int MIGRATION = 8;
+
+  /**
+   * The feature id for the '<em><b>Model Set</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MIGRATION__MODEL_SET = 0;
+
+  /**
+   * The feature id for the '<em><b>Diagnostic ID</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MIGRATION__DIAGNOSTIC_ID = 1;
+
+  /**
+   * The number of structural features of the '<em>Migration</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MIGRATION_FEATURE_COUNT = 2;
+
+  /**
+   * The number of operations of the '<em>Migration</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MIGRATION_OPERATION_COUNT = 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl <em>Feature Path Migration</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getFeaturePathMigration()
+   * @generated
+   */
+  int FEATURE_PATH_MIGRATION = 9;
+
+  /**
+   * The feature id for the '<em><b>Model Set</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION__MODEL_SET = MIGRATION__MODEL_SET;
+
+  /**
+   * The feature id for the '<em><b>Diagnostic ID</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION__DIAGNOSTIC_ID = MIGRATION__DIAGNOSTIC_ID;
+
+  /**
+   * The feature id for the '<em><b>From Class</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION__FROM_CLASS = MIGRATION_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>To Class</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION__TO_CLASS = MIGRATION_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Feature Path</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION__FEATURE_PATH = MIGRATION_FEATURE_COUNT + 2;
+
+  /**
+   * The number of structural features of the '<em>Feature Path Migration</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION_FEATURE_COUNT = MIGRATION_FEATURE_COUNT + 3;
+
+  /**
+   * The number of operations of the '<em>Feature Path Migration</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_PATH_MIGRATION_OPERATION_COUNT = MIGRATION_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.cdo.evolution.ChangeKind <em>Change Kind</em>}' enum.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.cdo.evolution.ChangeKind
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getChangeKind()
+   * @generated
+   */
+  int CHANGE_KIND = 10;
+
+  /**
+   * The meta object id for the '<em>URI</em>' data type.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.common.util.URI
+   * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getURI()
+   * @generated
+   */
+  int URI = 11;
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.ModelSet <em>Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Model Set</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet
+   * @generated
+   */
+  EClass getModelSet();
+
+  /**
+   * Returns the meta object for the containment reference '{@link org.eclipse.emf.cdo.evolution.ModelSet#getChange <em>Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference '<em>Change</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getChange()
+   * @see #getModelSet()
+   * @generated
+   */
+  EReference getModelSet_Change();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.cdo.evolution.ModelSet#getMigrations <em>Migrations</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Migrations</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getMigrations()
+   * @see #getModelSet()
+   * @generated
+   */
+  EReference getModelSet_Migrations();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getEvolution() <em>Get Evolution</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Evolution</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getEvolution()
+   * @generated
+   */
+  EOperation getModelSet__GetEvolution();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getVersion() <em>Get Version</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Version</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getVersion()
+   * @generated
+   */
+  EOperation getModelSet__GetVersion();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getPreviousRelease() <em>Get Previous Release</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Previous Release</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getPreviousRelease()
+   * @generated
+   */
+  EOperation getModelSet__GetPreviousRelease();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getRootPackages() <em>Get Root Packages</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Root Packages</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getRootPackages()
+   * @generated
+   */
+  EOperation getModelSet__GetRootPackages();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getAllPackages() <em>Get All Packages</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get All Packages</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getAllPackages()
+   * @generated
+   */
+  EOperation getModelSet__GetAllPackages();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#containsElement(org.eclipse.emf.ecore.EModelElement) <em>Contains Element</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Contains Element</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#containsElement(org.eclipse.emf.ecore.EModelElement)
+   * @generated
+   */
+  EOperation getModelSet__ContainsElement__EModelElement();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getElement(java.lang.String) <em>Get Element</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Element</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getElement(java.lang.String)
+   * @generated
+   */
+  EOperation getModelSet__GetElement__String();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getElementID(org.eclipse.emf.ecore.EModelElement) <em>Get Element ID</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Element ID</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getElementID(org.eclipse.emf.ecore.EModelElement)
+   * @generated
+   */
+  EOperation getModelSet__GetElementID__EModelElement();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getElementID(org.eclipse.emf.ecore.EModelElement, boolean) <em>Get Element ID</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Element ID</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getElementID(org.eclipse.emf.ecore.EModelElement, boolean)
+   * @generated
+   */
+  EOperation getModelSet__GetElementID__EModelElement_boolean();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#compare(org.eclipse.emf.cdo.evolution.ModelSet) <em>Compare</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Compare</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#compare(org.eclipse.emf.cdo.evolution.ModelSet)
+   * @generated
+   */
+  EOperation getModelSet__Compare__ModelSet();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getMigration(java.lang.String) <em>Get Migration</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Migration</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getMigration(java.lang.String)
+   * @generated
+   */
+  EOperation getModelSet__GetMigration__String();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.Model <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Model</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model
+   * @generated
+   */
+  EClass getModel();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.emf.cdo.evolution.Model#getEvolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>Evolution</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getEvolution()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_Evolution();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Model#getURI <em>URI</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>URI</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getURI()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_URI();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.Model#getRootPackage <em>Root Package</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Root Package</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getRootPackage()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_RootPackage();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Model#getAllPackages <em>All Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>All Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getAllPackages()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_AllPackages();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Model#getReferencedPackages <em>Referenced Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Referenced Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getReferencedPackages()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_ReferencedPackages();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Model#getMissingPackages <em>Missing Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Missing Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Model#getMissingPackages()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_MissingPackages();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.Evolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Evolution</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution
+   * @generated
+   */
+  EClass getEvolution();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getModels <em>Models</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Models</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getModels()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_Models();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEcorePackage <em>Use Ecore Package</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Use Ecore Package</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#isUseEcorePackage()
+   * @see #getEvolution()
+   * @generated
+   */
+  EAttribute getEvolution_UseEcorePackage();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEresourcePackage <em>Use Eresource Package</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Use Eresource Package</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#isUseEresourcePackage()
+   * @see #getEvolution()
+   * @generated
+   */
+  EAttribute getEvolution_UseEresourcePackage();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Evolution#isUseEtypesPackage <em>Use Etypes Package</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Use Etypes Package</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#isUseEtypesPackage()
+   * @see #getEvolution()
+   * @generated
+   */
+  EAttribute getEvolution_UseEtypesPackage();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Evolution#isUniqueNamespaces <em>Unique Namespaces</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Unique Namespaces</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#isUniqueNamespaces()
+   * @see #getEvolution()
+   * @generated
+   */
+  EAttribute getEvolution_UniqueNamespaces();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getRootPackages <em>Root Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Root Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getRootPackages()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_RootPackages();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getAllPackages <em>All Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>All Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getAllPackages()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_AllPackages();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getReleases <em>Releases</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Releases</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getReleases()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_Releases();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getOrderedReleases <em>Ordered Releases</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Ordered Releases</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getOrderedReleases()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_OrderedReleases();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.Evolution#getLatestRelease <em>Latest Release</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Latest Release</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getLatestRelease()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_LatestRelease();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Evolution#getNextReleaseVersion <em>Next Release Version</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Next Release Version</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getNextReleaseVersion()
+   * @see #getEvolution()
+   * @generated
+   */
+  EAttribute getEvolution_NextReleaseVersion();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Evolution#getMissingPackages <em>Missing Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Missing Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getMissingPackages()
+   * @see #getEvolution()
+   * @generated
+   */
+  EReference getEvolution_MissingPackages();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Evolution#getRelease(int) <em>Get Release</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Release</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getRelease(int)
+   * @generated
+   */
+  EOperation getEvolution__GetRelease__int();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.Release <em>Release</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Release</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release
+   * @generated
+   */
+  EClass getRelease();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.emf.cdo.evolution.Release#getEvolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>Evolution</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getEvolution()
+   * @see #getRelease()
+   * @generated
+   */
+  EReference getRelease_Evolution();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Release#getDate <em>Date</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Date</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getDate()
+   * @see #getRelease()
+   * @generated
+   */
+  EAttribute getRelease_Date();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.Release#getNextRelease <em>Next Release</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Next Release</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getNextRelease()
+   * @see #getRelease()
+   * @generated
+   */
+  EReference getRelease_NextRelease();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.Release#getPreviousRelease <em>Previous Release</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Previous Release</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getPreviousRelease()
+   * @see #getRelease()
+   * @generated
+   */
+  EReference getRelease_PreviousRelease();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Release#getVersion <em>Version</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Version</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getVersion()
+   * @see #getRelease()
+   * @generated
+   */
+  EAttribute getRelease_Version();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.cdo.evolution.Release#getRootPackages <em>Root Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Root Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getRootPackages()
+   * @see #getRelease()
+   * @generated
+   */
+  EReference getRelease_RootPackages();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.Release#getAllPackages <em>All Packages</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>All Packages</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Release#getAllPackages()
+   * @see #getRelease()
+   * @generated
+   */
+  EReference getRelease_AllPackages();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.Change <em>Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Change</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Change
+   * @generated
+   */
+  EClass getChange();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.emf.cdo.evolution.Change#getParent <em>Parent</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>Parent</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Change#getParent()
+   * @see #getChange()
+   * @generated
+   */
+  EReference getChange_Parent();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.cdo.evolution.Change#getChildren <em>Children</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Children</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Change#getChildren()
+   * @see #getChange()
+   * @generated
+   */
+  EReference getChange_Children();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Change#getOldModelSet() <em>Get Old Model Set</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Old Model Set</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Change#getOldModelSet()
+   * @generated
+   */
+  EOperation getChange__GetOldModelSet();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Change#getNewModelSet() <em>Get New Model Set</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get New Model Set</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Change#getNewModelSet()
+   * @generated
+   */
+  EOperation getChange__GetNewModelSet();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Change#getModelSetChange() <em>Get Model Set Change</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Model Set Change</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Change#getModelSetChange()
+   * @generated
+   */
+  EOperation getChange__GetModelSetChange();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Change#getOldElementFor(org.eclipse.emf.ecore.EModelElement) <em>Get Old Element For</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Old Element For</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Change#getOldElementFor(org.eclipse.emf.ecore.EModelElement)
+   * @generated
+   */
+  EOperation getChange__GetOldElementFor__EModelElement();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.Change#getNewElementsFor(org.eclipse.emf.ecore.EModelElement) <em>Get New Elements For</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get New Elements For</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.Change#getNewElementsFor(org.eclipse.emf.ecore.EModelElement)
+   * @generated
+   */
+  EOperation getChange__GetNewElementsFor__EModelElement();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.ModelSetChange <em>Model Set Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Model Set Change</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSetChange
+   * @generated
+   */
+  EClass getModelSetChange();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.ModelSetChange#getOldModelSet <em>Old Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Old Model Set</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSetChange#getOldModelSet()
+   * @see #getModelSetChange()
+   * @generated
+   */
+  EReference getModelSetChange_OldModelSet();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.ModelSetChange#getNewModelSet <em>New Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>New Model Set</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ModelSetChange#getNewModelSet()
+   * @see #getModelSetChange()
+   * @generated
+   */
+  EReference getModelSetChange_NewModelSet();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.ElementChange <em>Element Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Element Change</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange
+   * @generated
+   */
+  EClass getElementChange();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.ElementChange#getOldElement <em>Old Element</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Old Element</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange#getOldElement()
+   * @see #getElementChange()
+   * @generated
+   */
+  EReference getElementChange_OldElement();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.ElementChange#getNewElement <em>New Element</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>New Element</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange#getNewElement()
+   * @see #getElementChange()
+   * @generated
+   */
+  EReference getElementChange_NewElement();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.ElementChange#getKind <em>Kind</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Kind</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange#getKind()
+   * @see #getElementChange()
+   * @generated
+   */
+  EAttribute getElementChange_Kind();
+
+  /**
+   * Returns the meta object for the '{@link org.eclipse.emf.cdo.evolution.ElementChange#getElement() <em>Get Element</em>}' operation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the '<em>Get Element</em>' operation.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange#getElement()
+   * @generated
+   */
+  EOperation getElementChange__GetElement();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.PropertyChange <em>Property Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Property Change</em>'.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange
+   * @generated
+   */
+  EClass getPropertyChange();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.PropertyChange#getFeature <em>Feature</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Feature</em>'.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange#getFeature()
+   * @see #getPropertyChange()
+   * @generated
+   */
+  EReference getPropertyChange_Feature();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.PropertyChange#getOldValue <em>Old Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Old Value</em>'.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange#getOldValue()
+   * @see #getPropertyChange()
+   * @generated
+   */
+  EAttribute getPropertyChange_OldValue();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.PropertyChange#getNewValue <em>New Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>New Value</em>'.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange#getNewValue()
+   * @see #getPropertyChange()
+   * @generated
+   */
+  EAttribute getPropertyChange_NewValue();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.PropertyChange#getKind <em>Kind</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Kind</em>'.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange#getKind()
+   * @see #getPropertyChange()
+   * @generated
+   */
+  EAttribute getPropertyChange_Kind();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.Migration <em>Migration</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Migration</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Migration
+   * @generated
+   */
+  EClass getMigration();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.emf.cdo.evolution.Migration#getModelSet <em>Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>Model Set</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Migration#getModelSet()
+   * @see #getMigration()
+   * @generated
+   */
+  EReference getMigration_ModelSet();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.cdo.evolution.Migration#getDiagnosticID <em>Diagnostic ID</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Diagnostic ID</em>'.
+   * @see org.eclipse.emf.cdo.evolution.Migration#getDiagnosticID()
+   * @see #getMigration()
+   * @generated
+   */
+  EAttribute getMigration_DiagnosticID();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration <em>Feature Path Migration</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Feature Path Migration</em>'.
+   * @see org.eclipse.emf.cdo.evolution.FeaturePathMigration
+   * @generated
+   */
+  EClass getFeaturePathMigration();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFromClass <em>From Class</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>From Class</em>'.
+   * @see org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFromClass()
+   * @see #getFeaturePathMigration()
+   * @generated
+   */
+  EReference getFeaturePathMigration_FromClass();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getToClass <em>To Class</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>To Class</em>'.
+   * @see org.eclipse.emf.cdo.evolution.FeaturePathMigration#getToClass()
+   * @see #getFeaturePathMigration()
+   * @generated
+   */
+  EReference getFeaturePathMigration_ToClass();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFeaturePath <em>Feature Path</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Feature Path</em>'.
+   * @see org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFeaturePath()
+   * @see #getFeaturePathMigration()
+   * @generated
+   */
+  EReference getFeaturePathMigration_FeaturePath();
+
+  /**
+   * Returns the meta object for enum '{@link org.eclipse.emf.cdo.evolution.ChangeKind <em>Change Kind</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for enum '<em>Change Kind</em>'.
+   * @see org.eclipse.emf.cdo.evolution.ChangeKind
+   * @generated
+   */
+  EEnum getChangeKind();
+
+  /**
+   * Returns the meta object for data type '{@link org.eclipse.emf.common.util.URI <em>URI</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for data type '<em>URI</em>'.
+   * @see org.eclipse.emf.common.util.URI
+   * @model instanceClass="org.eclipse.emf.common.util.URI"
+   * @generated
+   */
+  EDataType getURI();
+
+  /**
+   * Returns the factory that creates the instances of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the factory that creates the instances of the model.
+   * @generated
+   */
+  EvolutionFactory getEvolutionFactory();
+
+  /**
+   * <!-- begin-user-doc -->
+   * Defines literals for the meta objects that represent
+   * <ul>
+   *   <li>each class,</li>
+   *   <li>each feature of each class,</li>
+   *   <li>each operation of each class,</li>
+   *   <li>each enum,</li>
+   *   <li>and each data type</li>
+   * </ul>
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  interface Literals
+  {
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelSetImpl <em>Model Set</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ModelSetImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModelSet()
+     * @generated
+     */
+    EClass MODEL_SET = eINSTANCE.getModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>Change</b></em>' containment reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL_SET__CHANGE = eINSTANCE.getModelSet_Change();
+
+    /**
+     * The meta object literal for the '<em><b>Migrations</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL_SET__MIGRATIONS = eINSTANCE.getModelSet_Migrations();
+
+    /**
+     * The meta object literal for the '<em><b>Get Evolution</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_EVOLUTION = eINSTANCE.getModelSet__GetEvolution();
+
+    /**
+     * The meta object literal for the '<em><b>Get Version</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_VERSION = eINSTANCE.getModelSet__GetVersion();
+
+    /**
+     * The meta object literal for the '<em><b>Get Previous Release</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_PREVIOUS_RELEASE = eINSTANCE.getModelSet__GetPreviousRelease();
+
+    /**
+     * The meta object literal for the '<em><b>Get Root Packages</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_ROOT_PACKAGES = eINSTANCE.getModelSet__GetRootPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Get All Packages</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_ALL_PACKAGES = eINSTANCE.getModelSet__GetAllPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Contains Element</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT = eINSTANCE.getModelSet__ContainsElement__EModelElement();
+
+    /**
+     * The meta object literal for the '<em><b>Get Element</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_ELEMENT__STRING = eINSTANCE.getModelSet__GetElement__String();
+
+    /**
+     * The meta object literal for the '<em><b>Get Element ID</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT = eINSTANCE.getModelSet__GetElementID__EModelElement();
+
+    /**
+     * The meta object literal for the '<em><b>Get Element ID</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN = eINSTANCE.getModelSet__GetElementID__EModelElement_boolean();
+
+    /**
+     * The meta object literal for the '<em><b>Compare</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___COMPARE__MODELSET = eINSTANCE.getModelSet__Compare__ModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>Get Migration</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation MODEL_SET___GET_MIGRATION__STRING = eINSTANCE.getModelSet__GetMigration__String();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl <em>Model</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ModelImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModel()
+     * @generated
+     */
+    EClass MODEL = eINSTANCE.getModel();
+
+    /**
+     * The meta object literal for the '<em><b>Evolution</b></em>' container reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL__EVOLUTION = eINSTANCE.getModel_Evolution();
+
+    /**
+     * The meta object literal for the '<em><b>URI</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute MODEL__URI = eINSTANCE.getModel_URI();
+
+    /**
+     * The meta object literal for the '<em><b>Root Package</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL__ROOT_PACKAGE = eINSTANCE.getModel_RootPackage();
+
+    /**
+     * The meta object literal for the '<em><b>All Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL__ALL_PACKAGES = eINSTANCE.getModel_AllPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Referenced Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL__REFERENCED_PACKAGES = eINSTANCE.getModel_ReferencedPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Missing Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL__MISSING_PACKAGES = eINSTANCE.getModel_MissingPackages();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl <em>Evolution</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getEvolution()
+     * @generated
+     */
+    EClass EVOLUTION = eINSTANCE.getEvolution();
+
+    /**
+     * The meta object literal for the '<em><b>Models</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__MODELS = eINSTANCE.getEvolution_Models();
+
+    /**
+     * The meta object literal for the '<em><b>Use Ecore Package</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute EVOLUTION__USE_ECORE_PACKAGE = eINSTANCE.getEvolution_UseEcorePackage();
+
+    /**
+     * The meta object literal for the '<em><b>Use Eresource Package</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute EVOLUTION__USE_ERESOURCE_PACKAGE = eINSTANCE.getEvolution_UseEresourcePackage();
+
+    /**
+     * The meta object literal for the '<em><b>Use Etypes Package</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute EVOLUTION__USE_ETYPES_PACKAGE = eINSTANCE.getEvolution_UseEtypesPackage();
+
+    /**
+     * The meta object literal for the '<em><b>Unique Namespaces</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute EVOLUTION__UNIQUE_NAMESPACES = eINSTANCE.getEvolution_UniqueNamespaces();
+
+    /**
+     * The meta object literal for the '<em><b>Root Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__ROOT_PACKAGES = eINSTANCE.getEvolution_RootPackages();
+
+    /**
+     * The meta object literal for the '<em><b>All Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__ALL_PACKAGES = eINSTANCE.getEvolution_AllPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Releases</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__RELEASES = eINSTANCE.getEvolution_Releases();
+
+    /**
+     * The meta object literal for the '<em><b>Ordered Releases</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__ORDERED_RELEASES = eINSTANCE.getEvolution_OrderedReleases();
+
+    /**
+     * The meta object literal for the '<em><b>Latest Release</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__LATEST_RELEASE = eINSTANCE.getEvolution_LatestRelease();
+
+    /**
+     * The meta object literal for the '<em><b>Next Release Version</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute EVOLUTION__NEXT_RELEASE_VERSION = eINSTANCE.getEvolution_NextReleaseVersion();
+
+    /**
+     * The meta object literal for the '<em><b>Missing Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EVOLUTION__MISSING_PACKAGES = eINSTANCE.getEvolution_MissingPackages();
+
+    /**
+     * The meta object literal for the '<em><b>Get Release</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation EVOLUTION___GET_RELEASE__INT = eINSTANCE.getEvolution__GetRelease__int();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl <em>Release</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ReleaseImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getRelease()
+     * @generated
+     */
+    EClass RELEASE = eINSTANCE.getRelease();
+
+    /**
+     * The meta object literal for the '<em><b>Evolution</b></em>' container reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RELEASE__EVOLUTION = eINSTANCE.getRelease_Evolution();
+
+    /**
+     * The meta object literal for the '<em><b>Date</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute RELEASE__DATE = eINSTANCE.getRelease_Date();
+
+    /**
+     * The meta object literal for the '<em><b>Next Release</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RELEASE__NEXT_RELEASE = eINSTANCE.getRelease_NextRelease();
+
+    /**
+     * The meta object literal for the '<em><b>Previous Release</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RELEASE__PREVIOUS_RELEASE = eINSTANCE.getRelease_PreviousRelease();
+
+    /**
+     * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute RELEASE__VERSION = eINSTANCE.getRelease_Version();
+
+    /**
+     * The meta object literal for the '<em><b>Root Packages</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RELEASE__ROOT_PACKAGES = eINSTANCE.getRelease_RootPackages();
+
+    /**
+     * The meta object literal for the '<em><b>All Packages</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RELEASE__ALL_PACKAGES = eINSTANCE.getRelease_AllPackages();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ChangeImpl <em>Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ChangeImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getChange()
+     * @generated
+     */
+    EClass CHANGE = eINSTANCE.getChange();
+
+    /**
+     * The meta object literal for the '<em><b>Parent</b></em>' container reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE__PARENT = eINSTANCE.getChange_Parent();
+
+    /**
+     * The meta object literal for the '<em><b>Children</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE__CHILDREN = eINSTANCE.getChange_Children();
+
+    /**
+     * The meta object literal for the '<em><b>Get Old Model Set</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation CHANGE___GET_OLD_MODEL_SET = eINSTANCE.getChange__GetOldModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>Get New Model Set</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation CHANGE___GET_NEW_MODEL_SET = eINSTANCE.getChange__GetNewModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>Get Model Set Change</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation CHANGE___GET_MODEL_SET_CHANGE = eINSTANCE.getChange__GetModelSetChange();
+
+    /**
+     * The meta object literal for the '<em><b>Get Old Element For</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT = eINSTANCE.getChange__GetOldElementFor__EModelElement();
+
+    /**
+     * The meta object literal for the '<em><b>Get New Elements For</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT = eINSTANCE.getChange__GetNewElementsFor__EModelElement();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl <em>Model Set Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getModelSetChange()
+     * @generated
+     */
+    EClass MODEL_SET_CHANGE = eINSTANCE.getModelSetChange();
+
+    /**
+     * The meta object literal for the '<em><b>Old Model Set</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL_SET_CHANGE__OLD_MODEL_SET = eINSTANCE.getModelSetChange_OldModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>New Model Set</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MODEL_SET_CHANGE__NEW_MODEL_SET = eINSTANCE.getModelSetChange_NewModelSet();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl <em>Element Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getElementChange()
+     * @generated
+     */
+    EClass ELEMENT_CHANGE = eINSTANCE.getElementChange();
+
+    /**
+     * The meta object literal for the '<em><b>Old Element</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference ELEMENT_CHANGE__OLD_ELEMENT = eINSTANCE.getElementChange_OldElement();
+
+    /**
+     * The meta object literal for the '<em><b>New Element</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference ELEMENT_CHANGE__NEW_ELEMENT = eINSTANCE.getElementChange_NewElement();
+
+    /**
+     * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute ELEMENT_CHANGE__KIND = eINSTANCE.getElementChange_Kind();
+
+    /**
+     * The meta object literal for the '<em><b>Get Element</b></em>' operation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EOperation ELEMENT_CHANGE___GET_ELEMENT = eINSTANCE.getElementChange__GetElement();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl <em>Property Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getPropertyChange()
+     * @generated
+     */
+    EClass PROPERTY_CHANGE = eINSTANCE.getPropertyChange();
+
+    /**
+     * The meta object literal for the '<em><b>Feature</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference PROPERTY_CHANGE__FEATURE = eINSTANCE.getPropertyChange_Feature();
+
+    /**
+     * The meta object literal for the '<em><b>Old Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute PROPERTY_CHANGE__OLD_VALUE = eINSTANCE.getPropertyChange_OldValue();
+
+    /**
+     * The meta object literal for the '<em><b>New Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute PROPERTY_CHANGE__NEW_VALUE = eINSTANCE.getPropertyChange_NewValue();
+
+    /**
+     * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute PROPERTY_CHANGE__KIND = eINSTANCE.getPropertyChange_Kind();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.MigrationImpl <em>Migration</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.MigrationImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getMigration()
+     * @generated
+     */
+    EClass MIGRATION = eINSTANCE.getMigration();
+
+    /**
+     * The meta object literal for the '<em><b>Model Set</b></em>' container reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference MIGRATION__MODEL_SET = eINSTANCE.getMigration_ModelSet();
+
+    /**
+     * The meta object literal for the '<em><b>Diagnostic ID</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute MIGRATION__DIAGNOSTIC_ID = eINSTANCE.getMigration_DiagnosticID();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl <em>Feature Path Migration</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getFeaturePathMigration()
+     * @generated
+     */
+    EClass FEATURE_PATH_MIGRATION = eINSTANCE.getFeaturePathMigration();
+
+    /**
+     * The meta object literal for the '<em><b>From Class</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_PATH_MIGRATION__FROM_CLASS = eINSTANCE.getFeaturePathMigration_FromClass();
+
+    /**
+     * The meta object literal for the '<em><b>To Class</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_PATH_MIGRATION__TO_CLASS = eINSTANCE.getFeaturePathMigration_ToClass();
+
+    /**
+     * The meta object literal for the '<em><b>Feature Path</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_PATH_MIGRATION__FEATURE_PATH = eINSTANCE.getFeaturePathMigration_FeaturePath();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.cdo.evolution.ChangeKind <em>Change Kind</em>}' enum.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.cdo.evolution.ChangeKind
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getChangeKind()
+     * @generated
+     */
+    EEnum CHANGE_KIND = eINSTANCE.getChangeKind();
+
+    /**
+     * The meta object literal for the '<em>URI</em>' data type.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.common.util.URI
+     * @see org.eclipse.emf.cdo.evolution.impl.EvolutionPackageImpl#getURI()
+     * @generated
+     */
+    EDataType URI = eINSTANCE.getURI();
+
+  }
+
+} // EvolutionPackage
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/FeaturePathMigration.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/FeaturePathMigration.java
new file mode 100644
index 0000000..857f6b9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/FeaturePathMigration.java
@@ -0,0 +1,97 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Feature Path Migration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFromClass <em>From Class</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getToClass <em>To Class</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFeaturePath <em>Feature Path</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getFeaturePathMigration()
+ * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='NewFeatureReachable'"
+ * @generated
+ */
+public interface FeaturePathMigration extends Migration
+{
+  /**
+   * Returns the value of the '<em><b>From Class</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>From Class</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>From Class</em>' reference.
+   * @see #setFromClass(EClass)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getFeaturePathMigration_FromClass()
+   * @model required="true"
+   * @generated
+   */
+  EClass getFromClass();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getFromClass <em>From Class</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>From Class</em>' reference.
+   * @see #getFromClass()
+   * @generated
+   */
+  void setFromClass(EClass value);
+
+  /**
+   * Returns the value of the '<em><b>To Class</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>To Class</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>To Class</em>' reference.
+   * @see #setToClass(EClass)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getFeaturePathMigration_ToClass()
+   * @model required="true"
+   * @generated
+   */
+  EClass getToClass();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration#getToClass <em>To Class</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>To Class</em>' reference.
+   * @see #getToClass()
+   * @generated
+   */
+  void setToClass(EClass value);
+
+  /**
+   * Returns the value of the '<em><b>Feature Path</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EReference}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Feature Path</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature Path</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getFeaturePathMigration_FeaturePath()
+   * @model
+   * @generated
+   */
+  EList<EReference> getFeaturePath();
+
+} // FeaturePathMigration
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Migration.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Migration.java
new file mode 100644
index 0000000..6da9d95
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Migration.java
@@ -0,0 +1,82 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.cdo.CDOObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Migration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Migration#getModelSet <em>Model Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Migration#getDiagnosticID <em>Diagnostic ID</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getMigration()
+ * @model abstract="true"
+ *        annotation="http://www.eclipse.org/emf/2002/Ecore constraints='NotObsolete'"
+ * @extends CDOObject
+ * @generated
+ */
+public interface Migration extends CDOObject
+{
+  /**
+   * Returns the value of the '<em><b>Model Set</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.ModelSet#getMigrations <em>Migrations</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Model Set</em>' container reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Model Set</em>' container reference.
+   * @see #setModelSet(ModelSet)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getMigration_ModelSet()
+   * @see org.eclipse.emf.cdo.evolution.ModelSet#getMigrations
+   * @model opposite="migrations" transient="false"
+   * @generated
+   */
+  ModelSet getModelSet();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Migration#getModelSet <em>Model Set</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Model Set</em>' container reference.
+   * @see #getModelSet()
+   * @generated
+   */
+  void setModelSet(ModelSet value);
+
+  /**
+   * Returns the value of the '<em><b>Diagnostic ID</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Diagnostic ID</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Diagnostic ID</em>' attribute.
+   * @see #setDiagnosticID(String)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getMigration_DiagnosticID()
+   * @model
+   * @generated
+   */
+  String getDiagnosticID();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Migration#getDiagnosticID <em>Diagnostic ID</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Diagnostic ID</em>' attribute.
+   * @see #getDiagnosticID()
+   * @generated
+   */
+  void setDiagnosticID(String value);
+
+} // Migration
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Model.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Model.java
new file mode 100644
index 0000000..77ad5c8
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Model.java
@@ -0,0 +1,163 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.cdo.CDOObject;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getEvolution <em>Evolution</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getURI <em>URI</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getRootPackage <em>Root Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getAllPackages <em>All Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getReferencedPackages <em>Referenced Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Model#getMissingPackages <em>Missing Packages</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel()
+ * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='ModelLoaded IDs_Exist NamespaceReflectsChange'"
+ * @extends CDOObject
+ * @generated
+ */
+public interface Model extends CDOObject
+{
+  /**
+   * Returns the value of the '<em><b>Evolution</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Evolution#getModels <em>Models</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Evolution</em>' container reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Evolution</em>' container reference.
+   * @see #setEvolution(Evolution)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_Evolution()
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getModels
+   * @model opposite="models" required="true" transient="false"
+   * @generated
+   */
+  Evolution getEvolution();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Model#getEvolution <em>Evolution</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Evolution</em>' container reference.
+   * @see #getEvolution()
+   * @generated
+   */
+  void setEvolution(Evolution value);
+
+  /**
+   * Returns the value of the '<em><b>URI</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>URI</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>URI</em>' attribute.
+   * @see #setURI(URI)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_URI()
+   * @model dataType="org.eclipse.emf.cdo.evolution.URI"
+   *        extendedMetaData="kind='attribute' name='uri'"
+   * @generated
+   */
+  URI getURI();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Model#getURI <em>URI</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>URI</em>' attribute.
+   * @see #getURI()
+   * @generated
+   */
+  void setURI(URI value);
+
+  /**
+   * Returns the value of the '<em><b>Root Package</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Root Package</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Root Package</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_RootPackage()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EPackage getRootPackage();
+
+  /**
+   * Returns the value of the '<em><b>All Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>All Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>All Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_AllPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getAllPackages();
+
+  /**
+   * Returns the value of the '<em><b>Referenced Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Referenced Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Referenced Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_ReferencedPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getReferencedPackages();
+
+  /**
+   * Returns the value of the '<em><b>Missing Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Missing Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Missing Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModel_MissingPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getMissingPackages();
+
+  public ModelStatus getStatus();
+
+  /**
+   * @author Eike Stepper
+   */
+  public enum ModelStatus
+  {
+    NO_URI, NO_RESOURCE_SET, RESOURCE_NOT_FOUND, LOAD_PROBLEM, CONTENT_PROBLEM, OK
+  }
+
+} // Model
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSet.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSet.java
new file mode 100644
index 0000000..9b4e61e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSet.java
@@ -0,0 +1,163 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.cdo.CDOObject;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Set</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ModelSet#getChange <em>Change</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ModelSet#getMigrations <em>Migrations</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSet()
+ * @model abstract="true"
+ * @extends CDOObject
+ * @generated
+ */
+public interface ModelSet extends CDOObject
+{
+  /**
+   * Returns the value of the '<em><b>Change</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Change</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Change</em>' containment reference.
+   * @see #isSetChange()
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSet_Change()
+   * @model containment="true" unsettable="true" transient="true" derived="true" suppressedSetVisibility="true" suppressedUnsetVisibility="true"
+   * @generated
+   */
+  ModelSetChange getChange();
+
+  /**
+   * Returns whether the value of the '{@link org.eclipse.emf.cdo.evolution.ModelSet#getChange <em>Change</em>}' containment reference is set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return whether the value of the '<em>Change</em>' containment reference is set.
+   * @see #getChange()
+   * @generated
+   */
+  boolean isSetChange();
+
+  /**
+   * Returns the value of the '<em><b>Migrations</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.cdo.evolution.Migration}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Migration#getModelSet <em>Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Migrations</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Migrations</em>' containment reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSet_Migrations()
+   * @see org.eclipse.emf.cdo.evolution.Migration#getModelSet
+   * @model opposite="modelSet" containment="true"
+   * @generated
+   */
+  EList<Migration> getMigrations();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  Evolution getEvolution();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  int getVersion();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  Release getPreviousRelease();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  EList<EPackage> getRootPackages();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model kind="operation"
+   * @generated
+   */
+  EList<EPackage> getAllPackages();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  boolean containsElement(EModelElement modelElement);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  <T extends EModelElement> T getElement(String id);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  String getElementID(EModelElement modelElement);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  String getElementID(EModelElement modelElement, boolean considerOldIDs);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  ModelSetChange compare(ModelSet other);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  Migration getMigration(String diagnosticID);
+
+} // ModelSet
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSetChange.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSetChange.java
new file mode 100644
index 0000000..d17c620
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/ModelSetChange.java
@@ -0,0 +1,71 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.ecore.EModelElement;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Set Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ModelSetChange#getOldModelSet <em>Old Model Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.ModelSetChange#getNewModelSet <em>New Model Set</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSetChange()
+ * @model
+ * @generated
+ */
+public interface ModelSetChange extends Change
+{
+  /**
+   * Returns the value of the '<em><b>Old Model Set</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Old Model Set</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Old Model Set</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSetChange_OldModelSet()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  ModelSet getOldModelSet();
+
+  /**
+   * Returns the value of the '<em><b>New Model Set</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>New Model Set</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>New Model Set</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getModelSetChange_NewModelSet()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  ModelSet getNewModelSet();
+
+  ModelSet[] getModelSetChain();
+
+  Map<EModelElement, ElementChange> getElementChanges();
+
+  Map<EModelElement, EModelElement> getNewToOldElements();
+
+  Map<EModelElement, Set<EModelElement>> getOldToNewElements();
+
+  Set<EModelElement> getAddedElements();
+
+  Set<EModelElement> getRemovedElements();
+
+} // ModelSetChange
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/PropertyChange.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/PropertyChange.java
new file mode 100644
index 0000000..7aab3ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/PropertyChange.java
@@ -0,0 +1,90 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Property Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.PropertyChange#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.PropertyChange#getOldValue <em>Old Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.PropertyChange#getNewValue <em>New Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.PropertyChange#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getPropertyChange()
+ * @model
+ * @generated
+ */
+public interface PropertyChange extends Change
+{
+  /**
+   * Returns the value of the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Feature</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getPropertyChange_Feature()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  EStructuralFeature getFeature();
+
+  /**
+   * Returns the value of the '<em><b>Old Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Old Value</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Old Value</em>' attribute.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getPropertyChange_OldValue()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  Object getOldValue();
+
+  /**
+   * Returns the value of the '<em><b>New Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>New Value</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>New Value</em>' attribute.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getPropertyChange_NewValue()
+   * @model suppressedSetVisibility="true"
+   * @generated
+   */
+  Object getNewValue();
+
+  /**
+   * Returns the value of the '<em><b>Kind</b></em>' attribute.
+   * The literals are from the enumeration {@link org.eclipse.emf.cdo.evolution.ChangeKind}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Kind</em>' attribute.
+   * @see org.eclipse.emf.cdo.evolution.ChangeKind
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getPropertyChange_Kind()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  ChangeKind getKind();
+
+} // PropertyChange
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Release.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Release.java
new file mode 100644
index 0000000..ef07d0d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/Release.java
@@ -0,0 +1,177 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EPackage;
+
+import java.util.Date;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Release</b></em>'.
+ * @extends Comparable<Release>
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getEvolution <em>Evolution</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getVersion <em>Version</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getDate <em>Date</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getNextRelease <em>Next Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getPreviousRelease <em>Previous Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getRootPackages <em>Root Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.Release#getAllPackages <em>All Packages</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease()
+ * @model
+ * @generated
+ */
+public interface Release extends ModelSet, Comparable<Release>
+{
+  /**
+   * Returns the value of the '<em><b>Evolution</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.evolution.Evolution#getReleases <em>Releases</em>}'.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Evolution</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Evolution</em>' container reference.
+   * @see #setEvolution(Evolution)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_Evolution()
+   * @see org.eclipse.emf.cdo.evolution.Evolution#getReleases
+   * @model opposite="releases" required="true" transient="false"
+   * @generated
+   */
+  Evolution getEvolution();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Release#getEvolution <em>Evolution</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Evolution</em>' container reference.
+   * @see #getEvolution()
+   * @generated
+   */
+  void setEvolution(Evolution value);
+
+  /**
+   * Returns the value of the '<em><b>Date</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Date</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Date</em>' attribute.
+   * @see #setDate(Date)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_Date()
+   * @model required="true"
+   * @generated
+   */
+  Date getDate();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Release#getDate <em>Date</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Date</em>' attribute.
+   * @see #getDate()
+   * @generated
+   */
+  void setDate(Date value);
+
+  /**
+   * Returns the value of the '<em><b>Next Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Next Release</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Next Release</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_NextRelease()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  Release getNextRelease();
+
+  /**
+   * Returns the value of the '<em><b>Previous Release</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Previous Release</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Previous Release</em>' reference.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_PreviousRelease()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  Release getPreviousRelease();
+
+  /**
+   * Returns the value of the '<em><b>Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Version</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Version</em>' attribute.
+   * @see #setVersion(int)
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_Version()
+   * @model required="true"
+   * @generated
+   */
+  int getVersion();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.cdo.evolution.Release#getVersion <em>Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Version</em>' attribute.
+   * @see #getVersion()
+   * @generated
+   */
+  void setVersion(int value);
+
+  /**
+   * Returns the value of the '<em><b>Root Packages</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Root Packages</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Root Packages</em>' containment reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_RootPackages()
+   * @model containment="true"
+   * @generated
+   */
+  EList<EPackage> getRootPackages();
+
+  /**
+   * Returns the value of the '<em><b>All Packages</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>All Packages</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>All Packages</em>' reference list.
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#getRelease_AllPackages()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<EPackage> getAllPackages();
+
+} // Release
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ChangeImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ChangeImpl.java
new file mode 100644
index 0000000..eb877a9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ChangeImpl.java
@@ -0,0 +1,349 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+
+import org.eclipse.emf.internal.cdo.CDOObjectImpl;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ChangeImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ChangeImpl#getChildren <em>Children</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class ChangeImpl extends CDOObjectImpl implements Change
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ChangeImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected int eStaticFeatureCount()
+  {
+    return 0;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Change getParent()
+  {
+    return (Change)eDynamicGet(EvolutionPackage.CHANGE__PARENT, EvolutionPackage.Literals.CHANGE__PARENT, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetParent(Change newParent, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newParent, EvolutionPackage.CHANGE__PARENT, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setParent(Change newParent)
+  {
+    eDynamicSet(EvolutionPackage.CHANGE__PARENT, EvolutionPackage.Literals.CHANGE__PARENT, newParent);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EList<Change> getChildren()
+  {
+    return (EList<Change>)eDynamicGet(EvolutionPackage.CHANGE__CHILDREN, EvolutionPackage.Literals.CHANGE__CHILDREN, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract ModelSet getOldModelSet();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract ModelSet getNewModelSet();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public ModelSetChange getModelSetChange()
+  {
+    Change parent = getParent();
+    if (parent != null)
+    {
+      return parent.getModelSetChange();
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EModelElement getOldElementFor(EModelElement newElement)
+  {
+    ModelSetChange modelSetChange = getModelSetChange();
+    if (modelSetChange != null)
+    {
+      return modelSetChange.getNewToOldElements().get(newElement);
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<EModelElement> getNewElementsFor(EModelElement oldElement)
+  {
+    ModelSetChange modelSetChange = getModelSetChange();
+    if (modelSetChange != null)
+    {
+      Set<EModelElement> newElements = modelSetChange.getOldToNewElements().get(oldElement);
+      if (newElements != null)
+      {
+        int size = newElements.size();
+        if (size == 1)
+        {
+          return ECollections.singletonEList(newElements.iterator().next());
+        }
+
+        if (size > 1)
+        {
+          return new BasicEList<EModelElement>(newElements);
+        }
+      }
+    }
+
+    return ECollections.emptyEList();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      return basicSetParent((Change)otherEnd, msgs);
+    case EvolutionPackage.CHANGE__CHILDREN:
+      return ((InternalEList<InternalEObject>)(InternalEList<?>)getChildren()).basicAdd(otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      return basicSetParent(null, msgs);
+    case EvolutionPackage.CHANGE__CHILDREN:
+      return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      return eInternalContainer().eInverseRemove(this, EvolutionPackage.CHANGE__CHILDREN, Change.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      return getParent();
+    case EvolutionPackage.CHANGE__CHILDREN:
+      return getChildren();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      setParent((Change)newValue);
+      return;
+    case EvolutionPackage.CHANGE__CHILDREN:
+      getChildren().clear();
+      getChildren().addAll((Collection<? extends Change>)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      setParent((Change)null);
+      return;
+    case EvolutionPackage.CHANGE__CHILDREN:
+      getChildren().clear();
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.CHANGE__PARENT:
+      return getParent() != null;
+    case EvolutionPackage.CHANGE__CHILDREN:
+      return !getChildren().isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
+  {
+    switch (operationID)
+    {
+    case EvolutionPackage.CHANGE___GET_MODEL_SET_CHANGE:
+      return getModelSetChange();
+    case EvolutionPackage.CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT:
+      return getOldElementFor((EModelElement)arguments.get(0));
+    case EvolutionPackage.CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT:
+      return getNewElementsFor((EModelElement)arguments.get(0));
+    case EvolutionPackage.CHANGE___GET_OLD_MODEL_SET:
+      return getOldModelSet();
+    case EvolutionPackage.CHANGE___GET_NEW_MODEL_SET:
+      return getNewModelSet();
+    }
+    return super.eInvoke(operationID, arguments);
+  }
+
+} // ChangeImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ElementChangeImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ElementChangeImpl.java
new file mode 100644
index 0000000..9789905
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ElementChangeImpl.java
@@ -0,0 +1,317 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.util.DiagnosticID;
+import org.eclipse.emf.cdo.evolution.util.IDAnnotation;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Element Change</b></em>'.
+ * @implements DiagnosticID.Provider
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl#getOldElement <em>Old Element</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl#getNewElement <em>New Element</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ElementChangeImpl#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ElementChangeImpl extends ChangeImpl implements ElementChange, DiagnosticID.Provider
+{
+  /**
+   * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getKind()
+   * @generated
+   * @ordered
+   */
+  protected static final ChangeKind KIND_EDEFAULT = ChangeKind.NONE;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ElementChangeImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.ELEMENT_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EModelElement getOldElement()
+  {
+    return (EModelElement)eDynamicGet(EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__OLD_ELEMENT, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EModelElement basicGetOldElement()
+  {
+    return (EModelElement)eDynamicGet(EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__OLD_ELEMENT, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setOldElement(EModelElement newOldElement)
+  {
+    eDynamicSet(EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__OLD_ELEMENT, newOldElement);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EModelElement getNewElement()
+  {
+    return (EModelElement)eDynamicGet(EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__NEW_ELEMENT, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EModelElement basicGetNewElement()
+  {
+    return (EModelElement)eDynamicGet(EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__NEW_ELEMENT, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setNewElement(EModelElement newNewElement)
+  {
+    eDynamicSet(EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT, EvolutionPackage.Literals.ELEMENT_CHANGE__NEW_ELEMENT, newNewElement);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeKind getKind()
+  {
+    return (ChangeKind)eDynamicGet(EvolutionPackage.ELEMENT_CHANGE__KIND, EvolutionPackage.Literals.ELEMENT_CHANGE__KIND, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setKind(ChangeKind newKind)
+  {
+    eDynamicSet(EvolutionPackage.ELEMENT_CHANGE__KIND, EvolutionPackage.Literals.ELEMENT_CHANGE__KIND, newKind);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EModelElement getElement()
+  {
+    EModelElement element = getNewElement();
+    if (element == null)
+    {
+      element = getOldElement();
+    }
+
+    return element;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT:
+      if (resolve)
+      {
+        return getOldElement();
+      }
+      return basicGetOldElement();
+    case EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT:
+      if (resolve)
+      {
+        return getNewElement();
+      }
+      return basicGetNewElement();
+    case EvolutionPackage.ELEMENT_CHANGE__KIND:
+      return getKind();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT:
+      setOldElement((EModelElement)newValue);
+      return;
+    case EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT:
+      setNewElement((EModelElement)newValue);
+      return;
+    case EvolutionPackage.ELEMENT_CHANGE__KIND:
+      setKind((ChangeKind)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT:
+      setOldElement((EModelElement)null);
+      return;
+    case EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT:
+      setNewElement((EModelElement)null);
+      return;
+    case EvolutionPackage.ELEMENT_CHANGE__KIND:
+      setKind(KIND_EDEFAULT);
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.ELEMENT_CHANGE__OLD_ELEMENT:
+      return basicGetOldElement() != null;
+    case EvolutionPackage.ELEMENT_CHANGE__NEW_ELEMENT:
+      return basicGetNewElement() != null;
+    case EvolutionPackage.ELEMENT_CHANGE__KIND:
+      return getKind() != KIND_EDEFAULT;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
+  {
+    switch (operationID)
+    {
+    case EvolutionPackage.ELEMENT_CHANGE___GET_ELEMENT:
+      return getElement();
+    }
+    return super.eInvoke(operationID, arguments);
+  }
+
+  @Override
+  public ModelSet getOldModelSet()
+  {
+    Change parent = getParent();
+    if (parent != null)
+    {
+      return parent.getOldModelSet();
+    }
+
+    return null;
+  }
+
+  @Override
+  public ModelSet getNewModelSet()
+  {
+    Change parent = getParent();
+    if (parent != null)
+    {
+      return parent.getNewModelSet();
+    }
+
+    return null;
+  }
+
+  public void extractDiagnosticData(Context context)
+  {
+    context.add("EC");
+
+    EModelElement newElement = getNewElement();
+    if (newElement != null)
+    {
+      context.add(IDAnnotation.getValue(newElement));
+    }
+
+    EModelElement oldElement = getOldElement();
+    if (oldElement != null)
+    {
+      context.add(IDAnnotation.getValue(oldElement));
+    }
+
+    context.add(getKind().getName());
+  }
+
+} // ElementChangeImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionFactoryImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionFactoryImpl.java
new file mode 100644
index 0000000..f50c7c9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionFactoryImpl.java
@@ -0,0 +1,352 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionFactoryImpl extends EFactoryImpl implements EvolutionFactory
+{
+  /**
+   * Creates the default factory implementation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static EvolutionFactory init()
+  {
+    try
+    {
+      EvolutionFactory theEvolutionFactory = (EvolutionFactory)EPackage.Registry.INSTANCE.getEFactory(EvolutionPackage.eNS_URI);
+      if (theEvolutionFactory != null)
+      {
+        return theEvolutionFactory;
+      }
+    }
+    catch (Exception exception)
+    {
+      EcorePlugin.INSTANCE.log(exception);
+    }
+    return new EvolutionFactoryImpl();
+  }
+
+  /**
+   * Creates an instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionFactoryImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EObject create(EClass eClass)
+  {
+    switch (eClass.getClassifierID())
+    {
+    case EvolutionPackage.MODEL:
+      return createModel();
+    case EvolutionPackage.EVOLUTION:
+      return createEvolution();
+    case EvolutionPackage.RELEASE:
+      return createRelease();
+    case EvolutionPackage.MODEL_SET_CHANGE:
+      return createModelSetChange();
+    case EvolutionPackage.ELEMENT_CHANGE:
+      return createElementChange();
+    case EvolutionPackage.PROPERTY_CHANGE:
+      return createPropertyChange();
+    case EvolutionPackage.FEATURE_PATH_MIGRATION:
+      return createFeaturePathMigration();
+    default:
+      throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object createFromString(EDataType eDataType, String initialValue)
+  {
+    switch (eDataType.getClassifierID())
+    {
+    case EvolutionPackage.CHANGE_KIND:
+      return createChangeKindFromString(eDataType, initialValue);
+    case EvolutionPackage.URI:
+      return createURIFromString(eDataType, initialValue);
+    default:
+      throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String convertToString(EDataType eDataType, Object instanceValue)
+  {
+    switch (eDataType.getClassifierID())
+    {
+    case EvolutionPackage.CHANGE_KIND:
+      return convertChangeKindToString(eDataType, instanceValue);
+    case EvolutionPackage.URI:
+      return convertURIToString(eDataType, instanceValue);
+    default:
+      throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Model createModel()
+  {
+    ModelImpl model = new ModelImpl();
+    return model;
+  }
+
+  public Model createModel(URI uri)
+  {
+    ModelImpl model = new ModelImpl();
+    model.setURI(uri);
+    return model;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Evolution createEvolution()
+  {
+    EvolutionImpl evolution = new EvolutionImpl();
+    return evolution;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Release createRelease()
+  {
+    ReleaseImpl release = new ReleaseImpl();
+    return release;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSetChange createModelSetChange()
+  {
+    ModelSetChangeImpl modelSetChange = new ModelSetChangeImpl();
+    return modelSetChange;
+  }
+
+  public ModelSetChange createModelSetChange(ModelSet[] modelSetChain)
+  {
+    ModelSetChangeImpl modelSetChange = new ModelSetChangeImpl();
+    modelSetChange.setModelSetChain(modelSetChain);
+    return modelSetChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ElementChange createElementChange()
+  {
+    ElementChangeImpl elementChange = new ElementChangeImpl();
+    return elementChange;
+  }
+
+  public ElementChange createElementChange(EModelElement oldElement, EModelElement newElement, ChangeKind kind)
+  {
+    ElementChangeImpl elementChange = new ElementChangeImpl();
+    elementChange.setOldElement(oldElement);
+    elementChange.setNewElement(newElement);
+    elementChange.setKind(kind);
+    return elementChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public PropertyChange createPropertyChange()
+  {
+    PropertyChangeImpl propertyChange = new PropertyChangeImpl();
+    return propertyChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public FeaturePathMigration createFeaturePathMigration()
+  {
+    FeaturePathMigrationImpl featurePathMigration = new FeaturePathMigrationImpl();
+    return featurePathMigration;
+  }
+
+  public PropertyChange createPropertyChange(EStructuralFeature feature, Object oldValue, Object newValue)
+  {
+    PropertyChangeImpl propertyChange = new PropertyChangeImpl();
+    propertyChange.setFeature(feature);
+    propertyChange.setOldValue(oldValue);
+    propertyChange.setNewValue(newValue);
+    return propertyChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeKind createChangeKind(String literal)
+  {
+    ChangeKind result = ChangeKind.get(literal);
+    if (result == null)
+    {
+      throw new IllegalArgumentException("The value '" + literal + "' is not a valid enumerator of '" + EvolutionPackage.Literals.CHANGE_KIND.getName() + "'");
+    }
+    return result;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeKind createChangeKindFromString(EDataType eDataType, String initialValue)
+  {
+    return createChangeKind(initialValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String convertChangeKind(ChangeKind instanceValue)
+  {
+    return instanceValue == null ? null : instanceValue.toString();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String convertChangeKindToString(EDataType eDataType, Object instanceValue)
+  {
+    return convertChangeKind((ChangeKind)instanceValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public URI createURI(String literal)
+  {
+    return literal == null ? null : URI.createURI(literal);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public URI createURIFromString(EDataType eDataType, String initialValue)
+  {
+    return initialValue == null ? null : URI.createURI(initialValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String convertURI(URI instanceValue)
+  {
+    return instanceValue == null ? null : instanceValue.toString();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String convertURIToString(EDataType eDataType, Object instanceValue)
+  {
+    return instanceValue == null ? null : instanceValue.toString();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionPackage getEvolutionPackage()
+  {
+    return (EvolutionPackage)getEPackage();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @deprecated
+   * @generated
+   */
+  @Deprecated
+  public static EvolutionPackage getPackage()
+  {
+    return EvolutionPackage.eINSTANCE;
+  }
+
+} // EvolutionFactoryImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionImpl.java
new file mode 100644
index 0000000..a4af949
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionImpl.java
@@ -0,0 +1,691 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.Release;
+
+import org.eclipse.net4j.util.collection.CollectionUtil;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Evolution</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#isUseEcorePackage <em>Use Ecore Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#isUseEresourcePackage <em>Use Eresource Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#isUseEtypesPackage <em>Use Etypes Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#isUniqueNamespaces <em>Unique Namespaces</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getModels <em>Models</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getRootPackages <em>Root Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getAllPackages <em>All Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getMissingPackages <em>Missing Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getReleases <em>Releases</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getOrderedReleases <em>Ordered Releases</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getLatestRelease <em>Latest Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.EvolutionImpl#getNextReleaseVersion <em>Next Release Version</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EvolutionImpl extends ModelSetImpl implements Evolution
+{
+  /**
+   * The default value of the '{@link #isUseEcorePackage() <em>Use Ecore Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isUseEcorePackage()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean USE_ECORE_PACKAGE_EDEFAULT = true;
+
+  /**
+   * The default value of the '{@link #isUseEresourcePackage() <em>Use Eresource Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isUseEresourcePackage()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean USE_ERESOURCE_PACKAGE_EDEFAULT = false;
+
+  /**
+   * The default value of the '{@link #isUseEtypesPackage() <em>Use Etypes Package</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isUseEtypesPackage()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean USE_ETYPES_PACKAGE_EDEFAULT = false;
+
+  /**
+   * The default value of the '{@link #isUniqueNamespaces() <em>Unique Namespaces</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isUniqueNamespaces()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean UNIQUE_NAMESPACES_EDEFAULT = true;
+
+  /**
+   * The default value of the '{@link #getNextReleaseVersion() <em>Next Release Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getNextReleaseVersion()
+   * @generated
+   * @ordered
+   */
+  protected static final int NEXT_RELEASE_VERSION_EDEFAULT = 0;
+
+  private Map<String, Set<EPackage>> releasedPackages;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.EVOLUTION;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EList<Model> getModels()
+  {
+    return (EList<Model>)eDynamicGet(EvolutionPackage.EVOLUTION__MODELS, EvolutionPackage.Literals.EVOLUTION__MODELS, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isUseEcorePackage()
+  {
+    return (Boolean)eDynamicGet(EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ECORE_PACKAGE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setUseEcorePackage(boolean newUseEcorePackage)
+  {
+    eDynamicSet(EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ECORE_PACKAGE, newUseEcorePackage);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isUseEresourcePackage()
+  {
+    return (Boolean)eDynamicGet(EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ERESOURCE_PACKAGE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setUseEresourcePackage(boolean newUseEresourcePackage)
+  {
+    eDynamicSet(EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ERESOURCE_PACKAGE, newUseEresourcePackage);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isUseEtypesPackage()
+  {
+    return (Boolean)eDynamicGet(EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ETYPES_PACKAGE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setUseEtypesPackage(boolean newUseEtypesPackage)
+  {
+    eDynamicSet(EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE, EvolutionPackage.Literals.EVOLUTION__USE_ETYPES_PACKAGE, newUseEtypesPackage);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isUniqueNamespaces()
+  {
+    return (Boolean)eDynamicGet(EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES, EvolutionPackage.Literals.EVOLUTION__UNIQUE_NAMESPACES, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setUniqueNamespaces(boolean newUniqueNamespaces)
+  {
+    eDynamicSet(EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES, EvolutionPackage.Literals.EVOLUTION__UNIQUE_NAMESPACES, newUniqueNamespaces);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public EList<EPackage> getRootPackages()
+  {
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.EVOLUTION__ROOT_PACKAGES;
+      }
+    };
+
+    for (Model model : getModels())
+    {
+      EPackage rootPackage = model.getRootPackage();
+      if (rootPackage != null)
+      {
+        list.add(rootPackage);
+      }
+    }
+
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public EList<EPackage> getAllPackages()
+  {
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.EVOLUTION__ALL_PACKAGES;
+      }
+    };
+
+    for (Model model : getModels())
+    {
+      list.addAll(model.getAllPackages());
+    }
+
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<EPackage> getMissingPackages()
+  {
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.EVOLUTION__MISSING_PACKAGES;
+      }
+    };
+
+    Set<EPackage> set = new HashSet<EPackage>();
+    for (Model model : getModels())
+    {
+      set.addAll(model.getMissingPackages());
+    }
+
+    list.addAll(set);
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Release getRelease(int version)
+  {
+    for (Release release : getReleases())
+    {
+      if (release.getVersion() == version)
+      {
+        return release;
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EList<Release> getReleases()
+  {
+    return (EList<Release>)eDynamicGet(EvolutionPackage.EVOLUTION__RELEASES, EvolutionPackage.Literals.EVOLUTION__RELEASES, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<Release> getOrderedReleases()
+  {
+    EcoreEList<Release> list = new EcoreEList<Release>(Release.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.EVOLUTION__ORDERED_RELEASES;
+      }
+    };
+
+    list.addAll(getReleases());
+    ECollections.sort(list);
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Release getLatestRelease()
+  {
+    Release latestRelease = basicGetLatestRelease();
+    return latestRelease != null && ((EObject)latestRelease).eIsProxy() ? (Release)eResolveProxy((InternalEObject)latestRelease) : latestRelease;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Release basicGetLatestRelease()
+  {
+    EList<Release> orderedReleases = getOrderedReleases();
+    if (orderedReleases.isEmpty())
+    {
+      return null;
+    }
+
+    return orderedReleases.get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public int getNextReleaseVersion()
+  {
+    Release latestRelease = getLatestRelease();
+    return latestRelease == null ? 1 : latestRelease.getVersion() + 1;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__MODELS:
+      return ((InternalEList<InternalEObject>)(InternalEList<?>)getModels()).basicAdd(otherEnd, msgs);
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      return ((InternalEList<InternalEObject>)(InternalEList<?>)getReleases()).basicAdd(otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__MODELS:
+      return ((InternalEList<?>)getModels()).basicRemove(otherEnd, msgs);
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      return ((InternalEList<?>)getReleases()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE:
+      return isUseEcorePackage();
+    case EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE:
+      return isUseEresourcePackage();
+    case EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE:
+      return isUseEtypesPackage();
+    case EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES:
+      return isUniqueNamespaces();
+    case EvolutionPackage.EVOLUTION__MODELS:
+      return getModels();
+    case EvolutionPackage.EVOLUTION__ROOT_PACKAGES:
+      return getRootPackages();
+    case EvolutionPackage.EVOLUTION__ALL_PACKAGES:
+      return getAllPackages();
+    case EvolutionPackage.EVOLUTION__MISSING_PACKAGES:
+      return getMissingPackages();
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      return getReleases();
+    case EvolutionPackage.EVOLUTION__ORDERED_RELEASES:
+      return getOrderedReleases();
+    case EvolutionPackage.EVOLUTION__LATEST_RELEASE:
+      if (resolve)
+      {
+        return getLatestRelease();
+      }
+      return basicGetLatestRelease();
+    case EvolutionPackage.EVOLUTION__NEXT_RELEASE_VERSION:
+      return getNextReleaseVersion();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE:
+      setUseEcorePackage((Boolean)newValue);
+      return;
+    case EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE:
+      setUseEresourcePackage((Boolean)newValue);
+      return;
+    case EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE:
+      setUseEtypesPackage((Boolean)newValue);
+      return;
+    case EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES:
+      setUniqueNamespaces((Boolean)newValue);
+      return;
+    case EvolutionPackage.EVOLUTION__MODELS:
+      getModels().clear();
+      getModels().addAll((Collection<? extends Model>)newValue);
+      return;
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      getReleases().clear();
+      getReleases().addAll((Collection<? extends Release>)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE:
+      setUseEcorePackage(USE_ECORE_PACKAGE_EDEFAULT);
+      return;
+    case EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE:
+      setUseEresourcePackage(USE_ERESOURCE_PACKAGE_EDEFAULT);
+      return;
+    case EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE:
+      setUseEtypesPackage(USE_ETYPES_PACKAGE_EDEFAULT);
+      return;
+    case EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES:
+      setUniqueNamespaces(UNIQUE_NAMESPACES_EDEFAULT);
+      return;
+    case EvolutionPackage.EVOLUTION__MODELS:
+      getModels().clear();
+      return;
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      getReleases().clear();
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.EVOLUTION__USE_ECORE_PACKAGE:
+      return isUseEcorePackage() != USE_ECORE_PACKAGE_EDEFAULT;
+    case EvolutionPackage.EVOLUTION__USE_ERESOURCE_PACKAGE:
+      return isUseEresourcePackage() != USE_ERESOURCE_PACKAGE_EDEFAULT;
+    case EvolutionPackage.EVOLUTION__USE_ETYPES_PACKAGE:
+      return isUseEtypesPackage() != USE_ETYPES_PACKAGE_EDEFAULT;
+    case EvolutionPackage.EVOLUTION__UNIQUE_NAMESPACES:
+      return isUniqueNamespaces() != UNIQUE_NAMESPACES_EDEFAULT;
+    case EvolutionPackage.EVOLUTION__MODELS:
+      return !getModels().isEmpty();
+    case EvolutionPackage.EVOLUTION__ROOT_PACKAGES:
+      return !getRootPackages().isEmpty();
+    case EvolutionPackage.EVOLUTION__ALL_PACKAGES:
+      return !getAllPackages().isEmpty();
+    case EvolutionPackage.EVOLUTION__MISSING_PACKAGES:
+      return !getMissingPackages().isEmpty();
+    case EvolutionPackage.EVOLUTION__RELEASES:
+      return !getReleases().isEmpty();
+    case EvolutionPackage.EVOLUTION__ORDERED_RELEASES:
+      return !getOrderedReleases().isEmpty();
+    case EvolutionPackage.EVOLUTION__LATEST_RELEASE:
+      return basicGetLatestRelease() != null;
+    case EvolutionPackage.EVOLUTION__NEXT_RELEASE_VERSION:
+      return getNextReleaseVersion() != NEXT_RELEASE_VERSION_EDEFAULT;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
+  {
+    switch (operationID)
+    {
+    case EvolutionPackage.EVOLUTION___GET_RELEASE__INT:
+      return getRelease((Integer)arguments.get(0));
+    }
+    return super.eInvoke(operationID, arguments);
+  }
+
+  @Override
+  public Evolution getEvolution()
+  {
+    return this;
+  }
+
+  @Override
+  public int getVersion()
+  {
+    return Integer.MAX_VALUE;
+  }
+
+  @Override
+  public Release getPreviousRelease()
+  {
+    return getLatestRelease();
+  }
+
+  @Override
+  public boolean containsElement(EModelElement modelElement)
+  {
+    for (EPackage ePackage : getRootPackages())
+    {
+      if (EcoreUtil.isAncestor(ePackage, modelElement))
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  public Map<String, Set<EPackage>> getReleasedPackages()
+  {
+    if (releasedPackages == null)
+    {
+      releasedPackages = new HashMap<String, Set<EPackage>>();
+
+      for (Release release : getReleases())
+      {
+        for (EPackage ePackage : release.getAllPackages())
+        {
+          CollectionUtil.add(releasedPackages, ePackage.getNsURI(), ePackage);
+        }
+      }
+    }
+
+    return releasedPackages;
+  }
+
+  public static Evolution get(Notifier notifier)
+  {
+    if (notifier instanceof ResourceSet)
+    {
+      EList<Resource> resources = ((ResourceSet)notifier).getResources();
+      if (resources.isEmpty())
+      {
+        return null;
+      }
+
+      notifier = resources.get(0);
+    }
+
+    if (notifier instanceof Resource)
+    {
+      EList<EObject> contents = ((Resource)notifier).getContents();
+      if (contents.isEmpty())
+      {
+        return null;
+      }
+
+      notifier = contents.get(0);
+    }
+
+    if (notifier instanceof Evolution)
+    {
+      return (Evolution)notifier;
+    }
+
+    if (notifier instanceof EObject)
+    {
+      Resource resource = ((EObject)notifier).eResource();
+      if (resource != null)
+      {
+        return get(resource.getResourceSet());
+      }
+    }
+
+    return null;
+  }
+
+} // EvolutionImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPackageImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPackageImpl.java
new file mode 100644
index 0000000..3f66950
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPackageImpl.java
@@ -0,0 +1,1306 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.util.EvolutionValidator;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.ETypeParameter;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EvolutionPackageImpl extends EPackageImpl implements EvolutionPackage
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass modelSetEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass modelEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass evolutionEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass releaseEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass changeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass modelSetChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass elementChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass propertyChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass migrationEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass featurePathMigrationEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EEnum changeKindEEnum = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EDataType uriEDataType = null;
+
+  /**
+   * Creates an instance of the model <b>Package</b>, registered with
+   * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+   * package URI value.
+   * <p>Note: the correct way to create the package is via the static
+   * factory method {@link #init init()}, which also performs
+   * initialization of the package, or returns the registered package,
+   * if one already exists.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.EPackage.Registry
+   * @see org.eclipse.emf.cdo.evolution.EvolutionPackage#eNS_URI
+   * @see #init()
+   * @generated
+   */
+  private EvolutionPackageImpl()
+  {
+    super(eNS_URI, EvolutionFactory.eINSTANCE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static boolean isInited = false;
+
+  /**
+   * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+   *
+   * <p>This method is used to initialize {@link EvolutionPackage#eINSTANCE} when that field is accessed.
+   * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #eNS_URI
+   * @see #createPackageContents()
+   * @see #initializePackageContents()
+   * @generated
+   */
+  public static EvolutionPackage init()
+  {
+    if (isInited)
+    {
+      return (EvolutionPackage)EPackage.Registry.INSTANCE.getEPackage(EvolutionPackage.eNS_URI);
+    }
+
+    // Obtain or create and register package
+    Object registeredEvolutionPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
+    EvolutionPackageImpl theEvolutionPackage = registeredEvolutionPackage instanceof EvolutionPackageImpl ? (EvolutionPackageImpl)registeredEvolutionPackage
+        : new EvolutionPackageImpl();
+
+    isInited = true;
+
+    // Initialize simple dependencies
+    EcorePackage.eINSTANCE.eClass();
+
+    // Create package meta-data objects
+    theEvolutionPackage.createPackageContents();
+
+    // Initialize created meta-data
+    theEvolutionPackage.initializePackageContents();
+
+    // Register package validator
+    EValidator.Registry.INSTANCE.put(theEvolutionPackage, new EValidator.Descriptor()
+    {
+      public EValidator getEValidator()
+      {
+        return EvolutionValidator.INSTANCE;
+      }
+    });
+
+    // Mark meta-data to indicate it can't be changed
+    theEvolutionPackage.freeze();
+
+    // Update the registry and return the package
+    EPackage.Registry.INSTANCE.put(EvolutionPackage.eNS_URI, theEvolutionPackage);
+    return theEvolutionPackage;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getModelSet()
+  {
+    return modelSetEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModelSet_Change()
+  {
+    return (EReference)modelSetEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModelSet_Migrations()
+  {
+    return (EReference)modelSetEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetEvolution()
+  {
+    return modelSetEClass.getEOperations().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetVersion()
+  {
+    return modelSetEClass.getEOperations().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetPreviousRelease()
+  {
+    return modelSetEClass.getEOperations().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetRootPackages()
+  {
+    return modelSetEClass.getEOperations().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetAllPackages()
+  {
+    return modelSetEClass.getEOperations().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__ContainsElement__EModelElement()
+  {
+    return modelSetEClass.getEOperations().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetElement__String()
+  {
+    return modelSetEClass.getEOperations().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetElementID__EModelElement()
+  {
+    return modelSetEClass.getEOperations().get(7);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetElementID__EModelElement_boolean()
+  {
+    return modelSetEClass.getEOperations().get(8);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__Compare__ModelSet()
+  {
+    return modelSetEClass.getEOperations().get(9);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getModelSet__GetMigration__String()
+  {
+    return modelSetEClass.getEOperations().get(10);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getModel()
+  {
+    return modelEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModel_Evolution()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getModel_URI()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModel_RootPackage()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModel_AllPackages()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModel_ReferencedPackages()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModel_MissingPackages()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getEvolution()
+  {
+    return evolutionEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_Models()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getEvolution_UseEcorePackage()
+  {
+    return (EAttribute)evolutionEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getEvolution_UseEresourcePackage()
+  {
+    return (EAttribute)evolutionEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getEvolution_UseEtypesPackage()
+  {
+    return (EAttribute)evolutionEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getEvolution_UniqueNamespaces()
+  {
+    return (EAttribute)evolutionEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_RootPackages()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_AllPackages()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_Releases()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(8);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_OrderedReleases()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(9);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_LatestRelease()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(10);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getEvolution_NextReleaseVersion()
+  {
+    return (EAttribute)evolutionEClass.getEStructuralFeatures().get(11);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEvolution_MissingPackages()
+  {
+    return (EReference)evolutionEClass.getEStructuralFeatures().get(7);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getEvolution__GetRelease__int()
+  {
+    return evolutionEClass.getEOperations().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getRelease()
+  {
+    return releaseEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getRelease_Evolution()
+  {
+    return (EReference)releaseEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getRelease_Date()
+  {
+    return (EAttribute)releaseEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getRelease_NextRelease()
+  {
+    return (EReference)releaseEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getRelease_PreviousRelease()
+  {
+    return (EReference)releaseEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getRelease_Version()
+  {
+    return (EAttribute)releaseEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getRelease_RootPackages()
+  {
+    return (EReference)releaseEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getRelease_AllPackages()
+  {
+    return (EReference)releaseEClass.getEStructuralFeatures().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getChange()
+  {
+    return changeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChange_Parent()
+  {
+    return (EReference)changeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChange_Children()
+  {
+    return (EReference)changeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getChange__GetOldModelSet()
+  {
+    return changeEClass.getEOperations().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getChange__GetNewModelSet()
+  {
+    return changeEClass.getEOperations().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getChange__GetModelSetChange()
+  {
+    return changeEClass.getEOperations().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getChange__GetOldElementFor__EModelElement()
+  {
+    return changeEClass.getEOperations().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getChange__GetNewElementsFor__EModelElement()
+  {
+    return changeEClass.getEOperations().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getModelSetChange()
+  {
+    return modelSetChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModelSetChange_OldModelSet()
+  {
+    return (EReference)modelSetChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getModelSetChange_NewModelSet()
+  {
+    return (EReference)modelSetChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getElementChange()
+  {
+    return elementChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getElementChange_OldElement()
+  {
+    return (EReference)elementChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getElementChange_NewElement()
+  {
+    return (EReference)elementChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getElementChange_Kind()
+  {
+    return (EAttribute)elementChangeEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EOperation getElementChange__GetElement()
+  {
+    return elementChangeEClass.getEOperations().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getPropertyChange()
+  {
+    return propertyChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getPropertyChange_Feature()
+  {
+    return (EReference)propertyChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getPropertyChange_OldValue()
+  {
+    return (EAttribute)propertyChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getPropertyChange_NewValue()
+  {
+    return (EAttribute)propertyChangeEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getPropertyChange_Kind()
+  {
+    return (EAttribute)propertyChangeEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getMigration()
+  {
+    return migrationEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getMigration_ModelSet()
+  {
+    return (EReference)migrationEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getMigration_DiagnosticID()
+  {
+    return (EAttribute)migrationEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getFeaturePathMigration()
+  {
+    return featurePathMigrationEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeaturePathMigration_FromClass()
+  {
+    return (EReference)featurePathMigrationEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeaturePathMigration_ToClass()
+  {
+    return (EReference)featurePathMigrationEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeaturePathMigration_FeaturePath()
+  {
+    return (EReference)featurePathMigrationEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EEnum getChangeKind()
+  {
+    return changeKindEEnum;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EDataType getURI()
+  {
+    return uriEDataType;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionFactory getEvolutionFactory()
+  {
+    return (EvolutionFactory)getEFactoryInstance();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isCreated = false;
+
+  /**
+   * Creates the meta-model objects for the package.  This method is
+   * guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void createPackageContents()
+  {
+    if (isCreated)
+    {
+      return;
+    }
+    isCreated = true;
+
+    // Create classes and their features
+    modelSetEClass = createEClass(MODEL_SET);
+    createEReference(modelSetEClass, MODEL_SET__CHANGE);
+    createEReference(modelSetEClass, MODEL_SET__MIGRATIONS);
+    createEOperation(modelSetEClass, MODEL_SET___GET_EVOLUTION);
+    createEOperation(modelSetEClass, MODEL_SET___GET_VERSION);
+    createEOperation(modelSetEClass, MODEL_SET___GET_PREVIOUS_RELEASE);
+    createEOperation(modelSetEClass, MODEL_SET___GET_ROOT_PACKAGES);
+    createEOperation(modelSetEClass, MODEL_SET___GET_ALL_PACKAGES);
+    createEOperation(modelSetEClass, MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT);
+    createEOperation(modelSetEClass, MODEL_SET___GET_ELEMENT__STRING);
+    createEOperation(modelSetEClass, MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT);
+    createEOperation(modelSetEClass, MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN);
+    createEOperation(modelSetEClass, MODEL_SET___COMPARE__MODELSET);
+    createEOperation(modelSetEClass, MODEL_SET___GET_MIGRATION__STRING);
+
+    modelEClass = createEClass(MODEL);
+    createEReference(modelEClass, MODEL__EVOLUTION);
+    createEAttribute(modelEClass, MODEL__URI);
+    createEReference(modelEClass, MODEL__ROOT_PACKAGE);
+    createEReference(modelEClass, MODEL__ALL_PACKAGES);
+    createEReference(modelEClass, MODEL__REFERENCED_PACKAGES);
+    createEReference(modelEClass, MODEL__MISSING_PACKAGES);
+
+    evolutionEClass = createEClass(EVOLUTION);
+    createEAttribute(evolutionEClass, EVOLUTION__USE_ECORE_PACKAGE);
+    createEAttribute(evolutionEClass, EVOLUTION__USE_ERESOURCE_PACKAGE);
+    createEAttribute(evolutionEClass, EVOLUTION__USE_ETYPES_PACKAGE);
+    createEAttribute(evolutionEClass, EVOLUTION__UNIQUE_NAMESPACES);
+    createEReference(evolutionEClass, EVOLUTION__MODELS);
+    createEReference(evolutionEClass, EVOLUTION__ROOT_PACKAGES);
+    createEReference(evolutionEClass, EVOLUTION__ALL_PACKAGES);
+    createEReference(evolutionEClass, EVOLUTION__MISSING_PACKAGES);
+    createEReference(evolutionEClass, EVOLUTION__RELEASES);
+    createEReference(evolutionEClass, EVOLUTION__ORDERED_RELEASES);
+    createEReference(evolutionEClass, EVOLUTION__LATEST_RELEASE);
+    createEAttribute(evolutionEClass, EVOLUTION__NEXT_RELEASE_VERSION);
+    createEOperation(evolutionEClass, EVOLUTION___GET_RELEASE__INT);
+
+    releaseEClass = createEClass(RELEASE);
+    createEReference(releaseEClass, RELEASE__EVOLUTION);
+    createEAttribute(releaseEClass, RELEASE__VERSION);
+    createEAttribute(releaseEClass, RELEASE__DATE);
+    createEReference(releaseEClass, RELEASE__NEXT_RELEASE);
+    createEReference(releaseEClass, RELEASE__PREVIOUS_RELEASE);
+    createEReference(releaseEClass, RELEASE__ROOT_PACKAGES);
+    createEReference(releaseEClass, RELEASE__ALL_PACKAGES);
+
+    changeEClass = createEClass(CHANGE);
+    createEReference(changeEClass, CHANGE__PARENT);
+    createEReference(changeEClass, CHANGE__CHILDREN);
+    createEOperation(changeEClass, CHANGE___GET_MODEL_SET_CHANGE);
+    createEOperation(changeEClass, CHANGE___GET_OLD_ELEMENT_FOR__EMODELELEMENT);
+    createEOperation(changeEClass, CHANGE___GET_NEW_ELEMENTS_FOR__EMODELELEMENT);
+    createEOperation(changeEClass, CHANGE___GET_OLD_MODEL_SET);
+    createEOperation(changeEClass, CHANGE___GET_NEW_MODEL_SET);
+
+    modelSetChangeEClass = createEClass(MODEL_SET_CHANGE);
+    createEReference(modelSetChangeEClass, MODEL_SET_CHANGE__OLD_MODEL_SET);
+    createEReference(modelSetChangeEClass, MODEL_SET_CHANGE__NEW_MODEL_SET);
+
+    elementChangeEClass = createEClass(ELEMENT_CHANGE);
+    createEReference(elementChangeEClass, ELEMENT_CHANGE__OLD_ELEMENT);
+    createEReference(elementChangeEClass, ELEMENT_CHANGE__NEW_ELEMENT);
+    createEAttribute(elementChangeEClass, ELEMENT_CHANGE__KIND);
+    createEOperation(elementChangeEClass, ELEMENT_CHANGE___GET_ELEMENT);
+
+    propertyChangeEClass = createEClass(PROPERTY_CHANGE);
+    createEReference(propertyChangeEClass, PROPERTY_CHANGE__FEATURE);
+    createEAttribute(propertyChangeEClass, PROPERTY_CHANGE__OLD_VALUE);
+    createEAttribute(propertyChangeEClass, PROPERTY_CHANGE__NEW_VALUE);
+    createEAttribute(propertyChangeEClass, PROPERTY_CHANGE__KIND);
+
+    migrationEClass = createEClass(MIGRATION);
+    createEReference(migrationEClass, MIGRATION__MODEL_SET);
+    createEAttribute(migrationEClass, MIGRATION__DIAGNOSTIC_ID);
+
+    featurePathMigrationEClass = createEClass(FEATURE_PATH_MIGRATION);
+    createEReference(featurePathMigrationEClass, FEATURE_PATH_MIGRATION__FROM_CLASS);
+    createEReference(featurePathMigrationEClass, FEATURE_PATH_MIGRATION__TO_CLASS);
+    createEReference(featurePathMigrationEClass, FEATURE_PATH_MIGRATION__FEATURE_PATH);
+
+    // Create enums
+    changeKindEEnum = createEEnum(CHANGE_KIND);
+
+    // Create data types
+    uriEDataType = createEDataType(URI);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isInitialized = false;
+
+  /**
+   * Complete the initialization of the package and its meta-model.  This
+   * method is guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void initializePackageContents()
+  {
+    if (isInitialized)
+    {
+      return;
+    }
+    isInitialized = true;
+
+    // Initialize package
+    setName(eNAME);
+    setNsPrefix(eNS_PREFIX);
+    setNsURI(eNS_URI);
+
+    // Obtain other dependent packages
+    EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
+
+    // Create type parameters
+
+    // Set bounds for type parameters
+
+    // Add supertypes to classes
+    evolutionEClass.getESuperTypes().add(getModelSet());
+    releaseEClass.getESuperTypes().add(getModelSet());
+    modelSetChangeEClass.getESuperTypes().add(getChange());
+    elementChangeEClass.getESuperTypes().add(getChange());
+    propertyChangeEClass.getESuperTypes().add(getChange());
+    featurePathMigrationEClass.getESuperTypes().add(getMigration());
+
+    // Initialize classes, features, and operations; add parameters
+    initEClass(modelSetEClass, ModelSet.class, "ModelSet", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getModelSet_Change(), getModelSetChange(), null, "change", null, 0, 1, ModelSet.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getModelSet_Migrations(), getMigration(), getMigration_ModelSet(), "migrations", null, 0, -1, ModelSet.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEOperation(getModelSet__GetEvolution(), getEvolution(), "getEvolution", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getModelSet__GetVersion(), ecorePackage.getEInt(), "getVersion", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getModelSet__GetPreviousRelease(), getRelease(), "getPreviousRelease", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getModelSet__GetRootPackages(), ecorePackage.getEPackage(), "getRootPackages", 0, -1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getModelSet__GetAllPackages(), ecorePackage.getEPackage(), "getAllPackages", 0, -1, IS_UNIQUE, IS_ORDERED);
+
+    EOperation op = initEOperation(getModelSet__ContainsElement__EModelElement(), theEcorePackage.getEBoolean(), "containsElement", 0, 1, IS_UNIQUE,
+        IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEModelElement(), "modelElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getModelSet__GetElement__String(), null, "getElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+    ETypeParameter t1 = addETypeParameter(op, "T");
+    EGenericType g1 = createEGenericType(theEcorePackage.getEModelElement());
+    t1.getEBounds().add(g1);
+    addEParameter(op, theEcorePackage.getEString(), "id", 0, 1, IS_UNIQUE, IS_ORDERED);
+    g1 = createEGenericType(t1);
+    initEOperation(op, g1);
+
+    op = initEOperation(getModelSet__GetElementID__EModelElement(), theEcorePackage.getEString(), "getElementID", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEModelElement(), "modelElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getModelSet__GetElementID__EModelElement_boolean(), theEcorePackage.getEString(), "getElementID", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEModelElement(), "modelElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, ecorePackage.getEBoolean(), "considerOldIDs", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getModelSet__Compare__ModelSet(), getModelSetChange(), "compare", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, getModelSet(), "other", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getModelSet__GetMigration__String(), getMigration(), "getMigration", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, ecorePackage.getEString(), "diagnosticID", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(modelEClass, Model.class, "Model", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getModel_Evolution(), getEvolution(), getEvolution_Models(), "evolution", null, 1, 1, Model.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getModel_URI(), getURI(), "uRI", null, 0, 1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
+        !IS_DERIVED, IS_ORDERED);
+    initEReference(getModel_RootPackage(), theEcorePackage.getEPackage(), null, "rootPackage", null, 0, 1, Model.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getModel_AllPackages(), theEcorePackage.getEPackage(), null, "allPackages", null, 0, -1, Model.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getModel_ReferencedPackages(), theEcorePackage.getEPackage(), null, "referencedPackages", null, 0, -1, Model.class, IS_TRANSIENT,
+        IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getModel_MissingPackages(), theEcorePackage.getEPackage(), null, "missingPackages", null, 0, -1, Model.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+
+    initEClass(evolutionEClass, Evolution.class, "Evolution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getEvolution_UseEcorePackage(), ecorePackage.getEBoolean(), "useEcorePackage", "true", 0, 1, Evolution.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getEvolution_UseEresourcePackage(), ecorePackage.getEBoolean(), "useEresourcePackage", null, 0, 1, Evolution.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getEvolution_UseEtypesPackage(), ecorePackage.getEBoolean(), "useEtypesPackage", null, 0, 1, Evolution.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getEvolution_UniqueNamespaces(), ecorePackage.getEBoolean(), "uniqueNamespaces", "true", 0, 1, Evolution.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_Models(), getModel(), getModel_Evolution(), "models", null, 0, -1, Evolution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_RootPackages(), theEcorePackage.getEPackage(), null, "rootPackages", null, 0, -1, Evolution.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_AllPackages(), theEcorePackage.getEPackage(), null, "allPackages", null, 0, -1, Evolution.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_MissingPackages(), theEcorePackage.getEPackage(), null, "missingPackages", null, 0, -1, Evolution.class, IS_TRANSIENT,
+        IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_Releases(), getRelease(), getRelease_Evolution(), "releases", null, 0, -1, Evolution.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_OrderedReleases(), getRelease(), null, "orderedReleases", null, 0, -1, Evolution.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getEvolution_LatestRelease(), getRelease(), null, "latestRelease", null, 0, 1, Evolution.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE,
+        !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEAttribute(getEvolution_NextReleaseVersion(), theEcorePackage.getEInt(), "nextReleaseVersion", null, 0, 1, Evolution.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+
+    op = initEOperation(getEvolution__GetRelease__int(), getRelease(), "getRelease", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEInt(), "version", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(releaseEClass, Release.class, "Release", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getRelease_Evolution(), getEvolution(), getEvolution_Releases(), "evolution", null, 1, 1, Release.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getRelease_Version(), ecorePackage.getEInt(), "version", null, 1, 1, Release.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getRelease_Date(), ecorePackage.getEDate(), "date", null, 1, 1, Release.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
+        !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getRelease_NextRelease(), getRelease(), null, "nextRelease", null, 0, 1, Release.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE,
+        !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getRelease_PreviousRelease(), getRelease(), null, "previousRelease", null, 0, 1, Release.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE,
+        !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getRelease_RootPackages(), theEcorePackage.getEPackage(), null, "rootPackages", null, 0, -1, Release.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getRelease_AllPackages(), theEcorePackage.getEPackage(), null, "allPackages", null, 0, -1, Release.class, IS_TRANSIENT, IS_VOLATILE,
+        !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+
+    initEClass(changeEClass, Change.class, "Change", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getChange_Parent(), getChange(), getChange_Children(), "parent", null, 0, 1, Change.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getChange_Children(), getChange(), getChange_Parent(), "children", null, 0, -1, Change.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEOperation(getChange__GetModelSetChange(), getModelSetChange(), "getModelSetChange", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getChange__GetOldElementFor__EModelElement(), theEcorePackage.getEModelElement(), "getOldElementFor", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEModelElement(), "newElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = initEOperation(getChange__GetNewElementsFor__EModelElement(), theEcorePackage.getEModelElement(), "getNewElementsFor", 0, -1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEModelElement(), "oldElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getChange__GetOldModelSet(), getModelSet(), "getOldModelSet", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEOperation(getChange__GetNewModelSet(), getModelSet(), "getNewModelSet", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(modelSetChangeEClass, ModelSetChange.class, "ModelSetChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getModelSetChange_OldModelSet(), getModelSet(), null, "oldModelSet", null, 0, 1, ModelSetChange.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getModelSetChange_NewModelSet(), getModelSet(), null, "newModelSet", null, 0, 1, ModelSetChange.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(elementChangeEClass, ElementChange.class, "ElementChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getElementChange_OldElement(), theEcorePackage.getEModelElement(), null, "oldElement", null, 0, 1, ElementChange.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getElementChange_NewElement(), theEcorePackage.getEModelElement(), null, "newElement", null, 0, 1, ElementChange.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getElementChange_Kind(), getChangeKind(), "kind", null, 0, 1, ElementChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEOperation(getElementChange__GetElement(), theEcorePackage.getEModelElement(), "getElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(propertyChangeEClass, PropertyChange.class, "PropertyChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getPropertyChange_Feature(), theEcorePackage.getEStructuralFeature(), null, "feature", null, 0, 1, PropertyChange.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getPropertyChange_OldValue(), ecorePackage.getEJavaObject(), "oldValue", null, 0, 1, PropertyChange.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getPropertyChange_NewValue(), ecorePackage.getEJavaObject(), "newValue", null, 0, 1, PropertyChange.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getPropertyChange_Kind(), getChangeKind(), "kind", null, 0, 1, PropertyChange.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE,
+        !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+
+    initEClass(migrationEClass, Migration.class, "Migration", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getMigration_ModelSet(), getModelSet(), getModelSet_Migrations(), "modelSet", null, 0, 1, Migration.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getMigration_DiagnosticID(), ecorePackage.getEString(), "diagnosticID", null, 0, 1, Migration.class, !IS_TRANSIENT, !IS_VOLATILE,
+        IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(featurePathMigrationEClass, FeaturePathMigration.class, "FeaturePathMigration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getFeaturePathMigration_FromClass(), ecorePackage.getEClass(), null, "fromClass", null, 1, 1, FeaturePathMigration.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getFeaturePathMigration_ToClass(), ecorePackage.getEClass(), null, "toClass", null, 1, 1, FeaturePathMigration.class, !IS_TRANSIENT,
+        !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getFeaturePathMigration_FeaturePath(), ecorePackage.getEReference(), null, "featurePath", null, 0, -1, FeaturePathMigration.class,
+        !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    // Initialize enums and add enum literals
+    initEEnum(changeKindEEnum, ChangeKind.class, "ChangeKind");
+    addEEnumLiteral(changeKindEEnum, ChangeKind.NONE);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.CHANGED);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.REMOVED);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.ADDED);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.COPIED);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.MOVED);
+
+    // Initialize data types
+    initEDataType(uriEDataType, org.eclipse.emf.common.util.URI.class, "URI", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+
+    // Create resource
+    createResource(eNS_URI);
+
+    // Create annotations
+    // http://www.eclipse.org/emf/2002/Ecore
+    createEcoreAnnotations();
+    // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
+    createExtendedMetaDataAnnotations();
+  }
+
+  /**
+   * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/Ecore</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void createEcoreAnnotations()
+  {
+    String source = "http://www.eclipse.org/emf/2002/Ecore";
+    addAnnotation(modelEClass, source, new String[] { "constraints", "ModelLoaded IDs_Exist NamespaceReflectsChange" });
+    addAnnotation(evolutionEClass, source, new String[] { "constraints", "NotEmpty PackagesUnique NoMissingPackages IDsUnique" });
+    addAnnotation(elementChangeEClass, source, new String[] { "constraints", "FeaturePathIsKnown" });
+    addAnnotation(migrationEClass, source, new String[] { "constraints", "NotObsolete" });
+    addAnnotation(featurePathMigrationEClass, source, new String[] { "constraints", "NewFeatureReachable" });
+  }
+
+  /**
+   * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void createExtendedMetaDataAnnotations()
+  {
+    String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";
+    addAnnotation(getModel_URI(), source, new String[] { "kind", "attribute", "name", "uri" });
+  }
+
+} // EvolutionPackageImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPlugin.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPlugin.java
new file mode 100644
index 0000000..9f831d2
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/EvolutionPlugin.java
@@ -0,0 +1,92 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the Evolution model plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class EvolutionPlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final EvolutionPlugin INSTANCE = new EvolutionPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionPlugin()
+  {
+    super(new ResourceLocator[] {});
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipsePlugin
+  {
+    /**
+     * Creates an instance.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/FeaturePathMigrationImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/FeaturePathMigrationImpl.java
new file mode 100644
index 0000000..48239ad
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/FeaturePathMigrationImpl.java
@@ -0,0 +1,220 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+
+import java.util.Collection;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Feature Path Migration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl#getFromClass <em>From Class</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl#getToClass <em>To Class</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.FeaturePathMigrationImpl#getFeaturePath <em>Feature Path</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class FeaturePathMigrationImpl extends MigrationImpl implements FeaturePathMigration
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected FeaturePathMigrationImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.FEATURE_PATH_MIGRATION;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getFromClass()
+  {
+    return (EClass)eDynamicGet(EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FROM_CLASS, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass basicGetFromClass()
+  {
+    return (EClass)eDynamicGet(EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FROM_CLASS, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setFromClass(EClass newFromClass)
+  {
+    eDynamicSet(EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FROM_CLASS, newFromClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getToClass()
+  {
+    return (EClass)eDynamicGet(EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__TO_CLASS, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass basicGetToClass()
+  {
+    return (EClass)eDynamicGet(EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__TO_CLASS, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setToClass(EClass newToClass)
+  {
+    eDynamicSet(EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__TO_CLASS, newToClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EList<EReference> getFeaturePath()
+  {
+    return (EList<EReference>)eDynamicGet(EvolutionPackage.FEATURE_PATH_MIGRATION__FEATURE_PATH, EvolutionPackage.Literals.FEATURE_PATH_MIGRATION__FEATURE_PATH,
+        true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS:
+      if (resolve)
+      {
+        return getFromClass();
+      }
+      return basicGetFromClass();
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS:
+      if (resolve)
+      {
+        return getToClass();
+      }
+      return basicGetToClass();
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FEATURE_PATH:
+      return getFeaturePath();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS:
+      setFromClass((EClass)newValue);
+      return;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS:
+      setToClass((EClass)newValue);
+      return;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FEATURE_PATH:
+      getFeaturePath().clear();
+      getFeaturePath().addAll((Collection<? extends EReference>)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS:
+      setFromClass((EClass)null);
+      return;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS:
+      setToClass((EClass)null);
+      return;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FEATURE_PATH:
+      getFeaturePath().clear();
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FROM_CLASS:
+      return basicGetFromClass() != null;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__TO_CLASS:
+      return basicGetToClass() != null;
+    case EvolutionPackage.FEATURE_PATH_MIGRATION__FEATURE_PATH:
+      return !getFeaturePath().isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+} // FeaturePathMigrationImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/MigrationImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/MigrationImpl.java
new file mode 100644
index 0000000..5f37be4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/MigrationImpl.java
@@ -0,0 +1,252 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+
+import org.eclipse.emf.internal.cdo.CDOObjectImpl;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Migration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.MigrationImpl#getModelSet <em>Model Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.MigrationImpl#getDiagnosticID <em>Diagnostic ID</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class MigrationImpl extends CDOObjectImpl implements Migration
+{
+  /**
+   * The default value of the '{@link #getDiagnosticID() <em>Diagnostic ID</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getDiagnosticID()
+   * @generated
+   * @ordered
+   */
+  protected static final String DIAGNOSTIC_ID_EDEFAULT = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected MigrationImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.MIGRATION;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected int eStaticFeatureCount()
+  {
+    return 0;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSet getModelSet()
+  {
+    return (ModelSet)eDynamicGet(EvolutionPackage.MIGRATION__MODEL_SET, EvolutionPackage.Literals.MIGRATION__MODEL_SET, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetModelSet(ModelSet newModelSet, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newModelSet, EvolutionPackage.MIGRATION__MODEL_SET, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setModelSet(ModelSet newModelSet)
+  {
+    eDynamicSet(EvolutionPackage.MIGRATION__MODEL_SET, EvolutionPackage.Literals.MIGRATION__MODEL_SET, newModelSet);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getDiagnosticID()
+  {
+    return (String)eDynamicGet(EvolutionPackage.MIGRATION__DIAGNOSTIC_ID, EvolutionPackage.Literals.MIGRATION__DIAGNOSTIC_ID, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setDiagnosticID(String newDiagnosticID)
+  {
+    eDynamicSet(EvolutionPackage.MIGRATION__DIAGNOSTIC_ID, EvolutionPackage.Literals.MIGRATION__DIAGNOSTIC_ID, newDiagnosticID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      return basicSetModelSet((ModelSet)otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      return basicSetModelSet(null, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      return eInternalContainer().eInverseRemove(this, EvolutionPackage.MODEL_SET__MIGRATIONS, ModelSet.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      return getModelSet();
+    case EvolutionPackage.MIGRATION__DIAGNOSTIC_ID:
+      return getDiagnosticID();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      setModelSet((ModelSet)newValue);
+      return;
+    case EvolutionPackage.MIGRATION__DIAGNOSTIC_ID:
+      setDiagnosticID((String)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      setModelSet((ModelSet)null);
+      return;
+    case EvolutionPackage.MIGRATION__DIAGNOSTIC_ID:
+      setDiagnosticID(DIAGNOSTIC_ID_EDEFAULT);
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MIGRATION__MODEL_SET:
+      return getModelSet() != null;
+    case EvolutionPackage.MIGRATION__DIAGNOSTIC_ID:
+      return DIAGNOSTIC_ID_EDEFAULT == null ? getDiagnosticID() != null : !DIAGNOSTIC_ID_EDEFAULT.equals(getDiagnosticID());
+    }
+    return super.eIsSet(featureID);
+  }
+
+} // MigrationImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelImpl.java
new file mode 100644
index 0000000..577b410
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelImpl.java
@@ -0,0 +1,567 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.eresource.EresourcePackage;
+import org.eclipse.emf.cdo.etypes.EtypesPackage;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Model;
+
+import org.eclipse.emf.internal.cdo.CDOObjectImpl;
+import org.eclipse.emf.internal.cdo.util.CompletePackageClosure;
+import org.eclipse.emf.internal.cdo.util.IPackageClosure;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreEList;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getEvolution <em>Evolution</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getURI <em>URI</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getRootPackage <em>Root Package</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getAllPackages <em>All Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getReferencedPackages <em>Referenced Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelImpl#getMissingPackages <em>Missing Packages</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModelImpl extends CDOObjectImpl implements Model
+{
+  /**
+   * The default value of the '{@link #getURI() <em>URI</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getURI()
+   * @generated
+   * @ordered
+   */
+  protected static final URI URI_EDEFAULT = null;
+
+  private ModelStatus status;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.MODEL;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected int eStaticFeatureCount()
+  {
+    return 0;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Evolution getEvolution()
+  {
+    return (Evolution)eDynamicGet(EvolutionPackage.MODEL__EVOLUTION, EvolutionPackage.Literals.MODEL__EVOLUTION, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetEvolution(Evolution newEvolution, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newEvolution, EvolutionPackage.MODEL__EVOLUTION, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setEvolution(Evolution newEvolution)
+  {
+    eDynamicSet(EvolutionPackage.MODEL__EVOLUTION, EvolutionPackage.Literals.MODEL__EVOLUTION, newEvolution);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public URI getURI()
+  {
+    return (URI)eDynamicGet(EvolutionPackage.MODEL__URI, EvolutionPackage.Literals.MODEL__URI, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setURIGen(URI newURI)
+  {
+    eDynamicSet(EvolutionPackage.MODEL__URI, EvolutionPackage.Literals.MODEL__URI, newURI);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setURI(URI newURI)
+  {
+    status = null;
+
+    EPackage oldRootPackage = null;
+    // EList<EPackage> oldAllPackages = null;
+    // EList<EPackage> oldReferencedPackages = null;
+    // EList<EPackage> oldMissingPackages = null;
+
+    boolean notificationRequired = eNotificationRequired();
+    if (notificationRequired)
+    {
+      oldRootPackage = getRootPackage();
+      // oldAllPackages = getAllPackages();
+      // oldReferencedPackages = getReferencedPackages();
+      // oldMissingPackages = getMissingPackages();
+    }
+
+    setURIGen(newURI);
+
+    if (notificationRequired)
+    {
+      EPackage rootPackage = getRootPackage();
+      if (rootPackage != oldRootPackage)
+      {
+        eNotify(new ENotificationImpl(this, Notification.SET, EvolutionPackage.Literals.MODEL__ROOT_PACKAGE, oldRootPackage, rootPackage));
+      }
+
+      // EList<EPackage> allPackages = getAllPackages();
+      // if (!allPackages.equals(oldAllPackages))
+      // {
+      // eNotify(new ENotificationImpl(this, Notification.SET, EvolutionPackage.Literals.MODEL__ALL_PACKAGES,
+      // oldAllPackages, allPackages));
+      // }
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EPackage getRootPackage()
+  {
+    EPackage rootPackage = basicGetRootPackage();
+    return rootPackage != null && rootPackage.eIsProxy() ? (EPackage)eResolveProxy((InternalEObject)rootPackage) : rootPackage;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EPackage basicGetRootPackage()
+  {
+    URI uri = getURI();
+    if (uri == null)
+    {
+      status = ModelStatus.NO_URI;
+      return null;
+    }
+
+    Resource resource = eResource();
+    if (resource == null)
+    {
+      status = ModelStatus.NO_RESOURCE_SET;
+      return null;
+    }
+
+    ResourceSet resourceSet = resource.getResourceSet();
+    if (resourceSet == null)
+    {
+      status = ModelStatus.NO_RESOURCE_SET;
+      return null;
+    }
+
+    if (!resourceSet.getURIConverter().exists(uri, Collections.emptyMap()))
+    {
+      status = ModelStatus.RESOURCE_NOT_FOUND;
+      return null;
+    }
+
+    Resource modelResource;
+
+    try
+    {
+      modelResource = resourceSet.getResource(uri, true);
+    }
+    catch (Exception ex)
+    {
+      // ex.printStackTrace();
+      modelResource = null;
+    }
+
+    if (modelResource == null)
+    {
+      status = ModelStatus.LOAD_PROBLEM;
+      return null;
+    }
+
+    if (!modelResource.getErrors().isEmpty())
+    {
+      status = ModelStatus.LOAD_PROBLEM;
+      resourceSet.getResources().remove(modelResource);
+      return null;
+    }
+
+    EList<EObject> contents = modelResource.getContents();
+    if (contents.isEmpty())
+    {
+      status = ModelStatus.CONTENT_PROBLEM;
+      return null;
+    }
+
+    EObject firstElement = contents.get(0);
+    if (!(firstElement instanceof EPackage))
+    {
+      status = ModelStatus.CONTENT_PROBLEM;
+      return null;
+    }
+
+    status = ModelStatus.OK;
+    return (EPackage)firstElement;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<EPackage> getAllPackages()
+  {
+    EPackage rootPackage = getRootPackage();
+    if (rootPackage == null)
+    {
+      return ECollections.emptyEList();
+    }
+
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.MODEL__ALL_PACKAGES;
+      }
+    };
+
+    collectAllPackages(rootPackage, list);
+    return list;
+  }
+
+  static void collectAllPackages(EPackage ePackage, EList<EPackage> list)
+  {
+    list.add(ePackage);
+
+    for (EPackage subPackage : ePackage.getESubpackages())
+    {
+      collectAllPackages(subPackage, list);
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<EPackage> getReferencedPackages()
+  {
+    EList<EPackage> allPackages = getAllPackages();
+    if (allPackages.isEmpty())
+    {
+      return ECollections.emptyEList();
+    }
+
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.MODEL__REFERENCED_PACKAGES;
+      }
+    };
+
+    IPackageClosure closure = new CompletePackageClosure();
+    Set<EPackage> referencedPackages = closure.calculate(allPackages);
+
+    for (EPackage referencedPackage : referencedPackages)
+    {
+      if (!allPackages.contains(referencedPackage))
+      {
+        list.add(referencedPackage);
+      }
+    }
+
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<EPackage> getMissingPackages()
+  {
+    EList<EPackage> referencedPackages = getReferencedPackages();
+    if (referencedPackages.isEmpty())
+    {
+      return ECollections.emptyEList();
+    }
+
+    Evolution evolution = getEvolution();
+    if (evolution == null)
+    {
+      return ECollections.emptyEList();
+    }
+
+    EList<EPackage> allPackages = evolution.getAllPackages();
+
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.MODEL__MISSING_PACKAGES;
+      }
+    };
+
+    for (EPackage referencedPackage : referencedPackages)
+    {
+      if (referencedPackage == EcorePackage.eINSTANCE && evolution.isUseEcorePackage())
+      {
+        continue;
+      }
+
+      if (referencedPackage == EresourcePackage.eINSTANCE && evolution.isUseEresourcePackage())
+      {
+        continue;
+      }
+
+      if (referencedPackage == EtypesPackage.eINSTANCE && evolution.isUseEtypesPackage())
+      {
+        continue;
+      }
+
+      if (allPackages.contains(referencedPackage))
+      {
+        continue;
+      }
+
+      list.add(referencedPackage);
+    }
+
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      return basicSetEvolution((Evolution)otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      return basicSetEvolution(null, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      return eInternalContainer().eInverseRemove(this, EvolutionPackage.EVOLUTION__MODELS, Evolution.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      return getEvolution();
+    case EvolutionPackage.MODEL__URI:
+      return getURI();
+    case EvolutionPackage.MODEL__ROOT_PACKAGE:
+      if (resolve)
+      {
+        return getRootPackage();
+      }
+      return basicGetRootPackage();
+    case EvolutionPackage.MODEL__ALL_PACKAGES:
+      return getAllPackages();
+    case EvolutionPackage.MODEL__REFERENCED_PACKAGES:
+      return getReferencedPackages();
+    case EvolutionPackage.MODEL__MISSING_PACKAGES:
+      return getMissingPackages();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      setEvolution((Evolution)newValue);
+      return;
+    case EvolutionPackage.MODEL__URI:
+      setURI((URI)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      setEvolution((Evolution)null);
+      return;
+    case EvolutionPackage.MODEL__URI:
+      setURI(URI_EDEFAULT);
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL__EVOLUTION:
+      return getEvolution() != null;
+    case EvolutionPackage.MODEL__URI:
+      return URI_EDEFAULT == null ? getURI() != null : !URI_EDEFAULT.equals(getURI());
+    case EvolutionPackage.MODEL__ROOT_PACKAGE:
+      return basicGetRootPackage() != null;
+    case EvolutionPackage.MODEL__ALL_PACKAGES:
+      return !getAllPackages().isEmpty();
+    case EvolutionPackage.MODEL__REFERENCED_PACKAGES:
+      return !getReferencedPackages().isEmpty();
+    case EvolutionPackage.MODEL__MISSING_PACKAGES:
+      return !getMissingPackages().isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  public ModelStatus getStatus()
+  {
+    return status;
+  }
+
+} // ModelImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetChangeImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetChangeImpl.java
new file mode 100644
index 0000000..b06a023
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetChangeImpl.java
@@ -0,0 +1,276 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Set Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl#getOldModelSet <em>Old Model Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelSetChangeImpl#getNewModelSet <em>New Model Set</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModelSetChangeImpl extends ChangeImpl implements ModelSetChange
+{
+  private final Map<EModelElement, ElementChange> elementChanges = new HashMap<EModelElement, ElementChange>();
+
+  private final Map<EModelElement, EModelElement> newToOldElements = new HashMap<EModelElement, EModelElement>();
+
+  private final Map<EModelElement, Set<EModelElement>> oldToNewElements = new HashMap<EModelElement, Set<EModelElement>>();
+
+  private final Set<EModelElement> addedElements = new HashSet<EModelElement>();
+
+  private final Set<EModelElement> removedElements = new HashSet<EModelElement>();
+
+  private ModelSet[] modelSetChain;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelSetChangeImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.MODEL_SET_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ModelSet getOldModelSet()
+  {
+    return (ModelSet)eDynamicGet(EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__OLD_MODEL_SET, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSet basicGetOldModelSet()
+  {
+    return (ModelSet)eDynamicGet(EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__OLD_MODEL_SET, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setOldModelSet(ModelSet newOldModelSet)
+  {
+    eDynamicSet(EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__OLD_MODEL_SET, newOldModelSet);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ModelSet getNewModelSet()
+  {
+    return (ModelSet)eDynamicGet(EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__NEW_MODEL_SET, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSet basicGetNewModelSet()
+  {
+    return (ModelSet)eDynamicGet(EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__NEW_MODEL_SET, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setNewModelSet(ModelSet newNewModelSet)
+  {
+    eDynamicSet(EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET, EvolutionPackage.Literals.MODEL_SET_CHANGE__NEW_MODEL_SET, newNewModelSet);
+  }
+
+  @Override
+  public ModelSetChange getModelSetChange()
+  {
+    return this;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET:
+      if (resolve)
+      {
+        return getOldModelSet();
+      }
+      return basicGetOldModelSet();
+    case EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET:
+      if (resolve)
+      {
+        return getNewModelSet();
+      }
+      return basicGetNewModelSet();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET:
+      setOldModelSet((ModelSet)newValue);
+      return;
+    case EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET:
+      setNewModelSet((ModelSet)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET:
+      setOldModelSet((ModelSet)null);
+      return;
+    case EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET:
+      setNewModelSet((ModelSet)null);
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET_CHANGE__OLD_MODEL_SET:
+      return basicGetOldModelSet() != null;
+    case EvolutionPackage.MODEL_SET_CHANGE__NEW_MODEL_SET:
+      return basicGetNewModelSet() != null;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  public Map<EModelElement, ElementChange> getElementChanges()
+  {
+    return elementChanges;
+  }
+
+  public Map<EModelElement, EModelElement> getNewToOldElements()
+  {
+    return newToOldElements;
+  }
+
+  public Map<EModelElement, Set<EModelElement>> getOldToNewElements()
+  {
+    return oldToNewElements;
+  }
+
+  public Set<EModelElement> getAddedElements()
+  {
+    return addedElements;
+  }
+
+  public Set<EModelElement> getRemovedElements()
+  {
+    return removedElements;
+  }
+
+  public ModelSet[] getModelSetChain()
+  {
+    return modelSetChain;
+  }
+
+  public void setModelSetChain(ModelSet[] modelSetChain)
+  {
+    this.modelSetChain = modelSetChain;
+    setOldModelSet(modelSetChain[0]);
+    setNewModelSet(modelSetChain[modelSetChain.length - 1]);
+
+  }
+
+  public Map<EModelElement, ElementChange> reset()
+  {
+    Map<EModelElement, ElementChange> result = new HashMap<EModelElement, ElementChange>(elementChanges);
+
+    for (ElementChange elementChange : elementChanges.values())
+    {
+      elementChange.getChildren().clear();
+    }
+
+    getChildren().clear();
+    oldToNewElements.clear();
+    newToOldElements.clear();
+    addedElements.clear();
+    removedElements.clear();
+    elementChanges.clear();
+
+    return result;
+  }
+
+} // ModelSetChangeImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetImpl.java
new file mode 100644
index 0000000..b7d7696
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ModelSetImpl.java
@@ -0,0 +1,937 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionFactory;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.util.ElementHandler;
+import org.eclipse.emf.cdo.evolution.util.ElementRunnable;
+import org.eclipse.emf.cdo.evolution.util.IDAnnotation;
+
+import org.eclipse.emf.internal.cdo.CDOObjectImpl;
+
+import org.eclipse.net4j.util.ObjectUtil;
+import org.eclipse.net4j.util.collection.CollectionUtil;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Set</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelSetImpl#getChange <em>Change</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ModelSetImpl#getMigrations <em>Migrations</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class ModelSetImpl extends CDOObjectImpl implements ModelSet
+{
+  private static final boolean COMPARE_CONTAINMENT = false;
+
+  private static final boolean DEBUG_IDS = false;
+
+  private static final boolean DEBUG_MATCH = false;
+
+  private static final boolean DEBUG_COMPARE = false;
+
+  private static final boolean DEBUG_CLEANUP = false;
+
+  private boolean changeInvalid;
+
+  private ModelSetImpl emptyModelSet;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelSetImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.MODEL_SET;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected int eStaticFeatureCount()
+  {
+    return 0;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSetChange getChangeGen()
+  {
+    return (ModelSetChange)eDynamicGet(EvolutionPackage.MODEL_SET__CHANGE, EvolutionPackage.Literals.MODEL_SET__CHANGE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   *
+   * @generated NOT
+   */
+  public ModelSetChange getChange()
+  {
+    ModelSetChangeImpl change = (ModelSetChangeImpl)getChangeGen();
+    if (change != null && change.getOldModelSet() != getOldModelSet())
+    {
+      // Can happen after undoing a release.
+      change = null;
+    }
+
+    if (change == null || changeInvalid)
+
+    {
+      ModelSetChangeImpl result;
+      Map<EModelElement, ElementChange> previousElementChanges;
+
+      if (change != null)
+      {
+        previousElementChanges = change.reset();
+        result = change;
+      }
+      else
+      {
+        ModelSet oldModelSet = getOldModelSet();
+        ModelSet[] modelSetChain = createModelSetChain(oldModelSet, this);
+
+        previousElementChanges = null;
+        result = (ModelSetChangeImpl)EvolutionFactory.eINSTANCE.createModelSetChange(modelSetChain);
+      }
+
+      compareElements(result, previousElementChanges);
+
+      try
+      {
+        eSetDeliver(false);
+        setChange(change = result);
+      }
+      finally
+      {
+        eSetDeliver(true);
+        changeInvalid = false;
+      }
+    }
+
+    return change;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetChange(ModelSetChange newChange, NotificationChain msgs)
+  {
+    msgs = eDynamicInverseAdd((InternalEObject)newChange, EvolutionPackage.MODEL_SET__CHANGE, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setChange(ModelSetChange newChange)
+  {
+    eDynamicSet(EvolutionPackage.MODEL_SET__CHANGE, EvolutionPackage.Literals.MODEL_SET__CHANGE, newChange);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicUnsetChange(NotificationChain msgs)
+  {
+    return eDynamicInverseRemove((InternalEObject)getChange(), EvolutionPackage.MODEL_SET__CHANGE, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void unsetChange()
+  {
+    eDynamicUnset(EvolutionPackage.MODEL_SET__CHANGE, EvolutionPackage.Literals.MODEL_SET__CHANGE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isSetChange()
+  {
+    return eDynamicIsSet(EvolutionPackage.MODEL_SET__CHANGE, EvolutionPackage.Literals.MODEL_SET__CHANGE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EList<Migration> getMigrations()
+  {
+    return (EList<Migration>)eDynamicGet(EvolutionPackage.MODEL_SET__MIGRATIONS, EvolutionPackage.Literals.MODEL_SET__MIGRATIONS, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract Evolution getEvolution();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract int getVersion();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract Release getPreviousRelease();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract EList<EPackage> getRootPackages();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract EList<EPackage> getAllPackages();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public abstract boolean containsElement(EModelElement modelElement);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @SuppressWarnings("unchecked")
+  public <T extends EModelElement> T getElement(final String id)
+  {
+    // TODO Design better approach to early return from ElementHandler.execute().
+    int xxx;
+
+    class ResultException extends RuntimeException
+    {
+      private static final long serialVersionUID = 1L;
+
+      EModelElement result;
+    }
+
+    try
+    {
+      ElementHandler.execute(getRootPackages(), new ElementRunnable()
+      {
+        public void run(EModelElement modelElement)
+        {
+          if (ObjectUtil.equals(id, getElementID(modelElement)))
+          {
+            ResultException ex = new ResultException();
+            ex.result = modelElement;
+            throw ex;
+          }
+        }
+      });
+    }
+    catch (ResultException ex)
+    {
+      return (T)ex.result;
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getElementID(EModelElement modelElement)
+  {
+    return getElementID(modelElement, false);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getElementID(EModelElement modelElement, boolean considerOldIDs)
+  {
+    if (containsElement(modelElement))
+    {
+      return IDAnnotation.getValue(modelElement, considerOldIDs);
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public ModelSetChange compare(ModelSet other)
+  {
+    ModelSet[] modelSetChain = createModelSetChain(this, other);
+    ModelSetChangeImpl result = (ModelSetChangeImpl)EvolutionFactory.eINSTANCE.createModelSetChange(modelSetChain);
+
+    compareElements(result, null);
+    return result;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Migration getMigration(String diagnosticID)
+  {
+    if (diagnosticID != null)
+    {
+      for (Migration migration : getMigrations())
+      {
+        if (diagnosticID.equals(migration.getDiagnosticID()))
+        {
+          return migration;
+        }
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      return ((InternalEList<InternalEObject>)(InternalEList<?>)getMigrations()).basicAdd(otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+      return basicUnsetChange(msgs);
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      return ((InternalEList<?>)getMigrations()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+      return getChange();
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      return getMigrations();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+      setChange((ModelSetChange)newValue);
+      return;
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      getMigrations().clear();
+      getMigrations().addAll((Collection<? extends Migration>)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+      unsetChange();
+      return;
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      getMigrations().clear();
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.MODEL_SET__CHANGE:
+      return isSetChange();
+    case EvolutionPackage.MODEL_SET__MIGRATIONS:
+      return !getMigrations().isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
+  {
+    switch (operationID)
+    {
+    case EvolutionPackage.MODEL_SET___GET_EVOLUTION:
+      return getEvolution();
+    case EvolutionPackage.MODEL_SET___GET_VERSION:
+      return getVersion();
+    case EvolutionPackage.MODEL_SET___GET_PREVIOUS_RELEASE:
+      return getPreviousRelease();
+    case EvolutionPackage.MODEL_SET___GET_ROOT_PACKAGES:
+      return getRootPackages();
+    case EvolutionPackage.MODEL_SET___GET_ALL_PACKAGES:
+      return getAllPackages();
+    case EvolutionPackage.MODEL_SET___CONTAINS_ELEMENT__EMODELELEMENT:
+      return containsElement((EModelElement)arguments.get(0));
+    case EvolutionPackage.MODEL_SET___GET_ELEMENT__STRING:
+      return getElement((String)arguments.get(0));
+    case EvolutionPackage.MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT:
+      return getElementID((EModelElement)arguments.get(0));
+    case EvolutionPackage.MODEL_SET___GET_ELEMENT_ID__EMODELELEMENT_BOOLEAN:
+      return getElementID((EModelElement)arguments.get(0), (Boolean)arguments.get(1));
+    case EvolutionPackage.MODEL_SET___COMPARE__MODELSET:
+      return compare((ModelSet)arguments.get(0));
+    case EvolutionPackage.MODEL_SET___GET_MIGRATION__STRING:
+      return getMigration((String)arguments.get(0));
+    }
+    return super.eInvoke(operationID, arguments);
+  }
+
+  public void invalidateChange()
+  {
+    changeInvalid = true;
+  }
+
+  private ModelSet getOldModelSet()
+  {
+    Release previousRelease = getPreviousRelease();
+    return previousRelease != null ? previousRelease : getEmptyModelSet();
+  }
+
+  private ModelSet getEmptyModelSet()
+  {
+    if (emptyModelSet == null)
+    {
+      emptyModelSet = new ModelSetImpl()
+      {
+        @Override
+        public int getVersion()
+        {
+          return 0;
+        }
+
+        @Override
+        public EList<EPackage> getRootPackages()
+        {
+          return ECollections.emptyEList();
+        }
+
+        @Override
+        public Release getPreviousRelease()
+        {
+          return null;
+        }
+
+        @Override
+        public Evolution getEvolution()
+        {
+          return ModelSetImpl.this.getEvolution();
+        }
+
+        @Override
+        public EList<EPackage> getAllPackages()
+        {
+          return ECollections.emptyEList();
+        }
+
+        @Override
+        public boolean containsElement(EModelElement modelElement)
+        {
+          return false;
+        }
+      };
+    }
+
+    return emptyModelSet;
+  }
+
+  private static void compareElements(final ModelSetChangeImpl result, final Map<EModelElement, ElementChange> previousElementChanges)
+  {
+    final ModelSet[] modelSets = result.getModelSetChain();
+    final ModelSet oldModelSet = result.getOldModelSet();
+    final ModelSet newModelSet = result.getNewModelSet();
+
+    ElementHandler.execute(newModelSet.getRootPackages(), new ElementRunnable()
+    {
+      public void run(EModelElement newElement)
+      {
+        EModelElement oldElement = newElement;
+
+        for (int i = modelSets.length - 1; i > 0; --i)
+        {
+          String id = modelSets[i].getElementID(oldElement, true);
+          oldElement = modelSets[i - 1].getElement(id);
+          if (oldElement == null)
+          {
+            break;
+          }
+        }
+
+        if (oldElement != null)
+        {
+          String newID = IDAnnotation.getValue(newElement);
+          String oldID = IDAnnotation.getValue(oldElement);
+
+          ChangeKind kind = ObjectUtil.equals(newID, oldID) ? ChangeKind.NONE : ChangeKind.COPIED;
+          if (kind == ChangeKind.COPIED)
+          {
+            if (newModelSet.getElement(oldID) == null)
+            {
+              kind = ChangeKind.MOVED;
+            }
+          }
+
+          if (DEBUG_MATCH)
+          {
+            System.out.println(kind + " " + getLabel(oldElement) + " --> " + getLabel(newElement));
+          }
+
+          ElementChange elementChange = getElementChange(newElement, oldElement, kind, previousElementChanges);
+          getParentChange(elementChange, result).getChildren().add(elementChange);
+          result.getElementChanges().put(oldElement, elementChange);
+          result.getElementChanges().put(newElement, elementChange);
+          result.getNewToOldElements().put(newElement, oldElement);
+          CollectionUtil.add(result.getOldToNewElements(), oldElement, newElement);
+        }
+        else
+        {
+          if (DEBUG_MATCH)
+          {
+            System.out.println("ADDED " + getLabel(newElement));
+          }
+
+          ElementChange elementChange = getElementChange(null, newElement, ChangeKind.ADDED, previousElementChanges);
+          getParentChange(elementChange, result).getChildren().add(elementChange);
+          result.getElementChanges().put(newElement, elementChange);
+          result.getAddedElements().add(newElement);
+        }
+      }
+    });
+
+    ElementHandler.execute(oldModelSet.getRootPackages(), new ElementRunnable()
+    {
+      public void run(EModelElement oldElement)
+      {
+        if (isRemoved(oldElement))
+        {
+          if (DEBUG_MATCH)
+          {
+            System.out.println("REMOVED " + getLabel(oldElement));
+          }
+
+          ElementChange elementChange = getElementChange(oldElement, null, ChangeKind.REMOVED, previousElementChanges);
+          getParentChange(elementChange, result).getChildren().add(elementChange);
+          result.getElementChanges().put(oldElement, elementChange);
+          result.getRemovedElements().add(oldElement);
+        }
+      }
+
+      private boolean isRemoved(EModelElement oldElement)
+      {
+        Set<EModelElement> newElements = result.getOldToNewElements().get(oldElement);
+        if (newElements == null || newElements.isEmpty())
+        {
+          return true;
+        }
+
+        String oldID = oldModelSet.getElementID(oldElement);
+        for (EModelElement newElement : newElements)
+        {
+          String newID = newModelSet.getElementID(newElement);
+          if (ObjectUtil.equals(newID, oldID))
+          {
+            return false;
+          }
+        }
+
+        return true;
+      }
+    });
+
+    for (Map.Entry<EModelElement, EModelElement> entry : result.getNewToOldElements().entrySet())
+    {
+      EModelElement newElement = entry.getKey();
+      EModelElement oldElement = entry.getValue();
+
+      compareProperties(result, newElement, oldElement);
+    }
+
+    for (EModelElement newElement : result.getAddedElements())
+    {
+      compareProperties(result, newElement, null);
+    }
+
+    cleanupChanges(result);
+  }
+
+  private static void compareProperties(ModelSetChange result, EModelElement newElement, EModelElement oldElement)
+  {
+    EClass eClass = newElement.eClass();
+
+    if (oldElement == null)
+    {
+      oldElement = (EModelElement)EcoreUtil.create(eClass);
+    }
+    else if (oldElement.eClass() != eClass)
+    {
+      int xxx;
+      throw new IllegalArgumentException();
+    }
+
+    Map<EModelElement, EModelElement> newToOldElements = result.getNewToOldElements();
+
+    for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
+    {
+      if (feature.isDerived())
+      {
+        continue;
+      }
+
+      if (feature == EcorePackage.Literals.EPACKAGE__EFACTORY_INSTANCE)
+      {
+        continue;
+      }
+
+      if (feature == EcorePackage.Literals.EENUM_LITERAL__INSTANCE)
+      {
+        continue;
+      }
+
+      EReference eReference = feature instanceof EReference ? (EReference)feature : null;
+      if (COMPARE_CONTAINMENT)
+      {
+        if (feature == EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)
+        {
+          continue;
+        }
+
+        if (feature == EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE)
+        {
+          continue;
+        }
+
+        if (feature == EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES)
+        {
+          continue;
+        }
+      }
+      else
+      {
+        if (eReference != null && eReference.isContainment())
+        {
+          continue;
+        }
+      }
+
+      Object newValue = newElement.eGet(feature);
+      if (eReference != null)
+      {
+        if (eReference.isMany())
+        {
+          @SuppressWarnings("unchecked")
+          EList<EObject> list = (EList<EObject>)newValue;
+
+          // TODO As an optimization, defer list creation.
+          EList<EObject> newList = new BasicEList<EObject>(list.size());
+
+          for (EObject eObject : list)
+          {
+            if (eObject instanceof EModelElement)
+            {
+              EModelElement newListElement = (EModelElement)eObject;
+              EModelElement oldListElement = newToOldElements.get(newListElement);
+              if (oldListElement != null && oldListElement != newListElement)
+              {
+                eObject = oldListElement;
+              }
+            }
+
+            newList.add(eObject);
+          }
+
+          newValue = newList;
+        }
+        else
+        {
+          if (newValue instanceof EModelElement)
+          {
+            EModelElement oldValue = newToOldElements.get(newValue);
+            if (oldValue != null && oldValue != newValue)
+            {
+              newValue = oldValue;
+            }
+          }
+        }
+      }
+
+      Object oldValue = oldElement.eGet(feature);
+      if (!ObjectUtil.equals(newValue, oldValue))
+      {
+        if (DEBUG_COMPARE)
+        {
+          System.out.println("PROPERTY CHANGE " + getLabel(newElement) + " --> " + feature.getName());
+        }
+
+        PropertyChange propertyChange = EvolutionFactory.eINSTANCE.createPropertyChange(feature, oldValue, newValue);
+        ElementChange elementChange = result.getElementChanges().get(newElement);
+        elementChange.getChildren().add(0, propertyChange);
+      }
+    }
+  }
+
+  private static void cleanupChanges(Change change)
+  {
+    for (Iterator<Change> it = change.getChildren().iterator(); it.hasNext();)
+    {
+      Change child = it.next();
+      if (child instanceof ElementChange)
+      {
+        ElementChange elementChange = (ElementChange)child;
+        cleanupChanges(elementChange);
+
+        if (elementChange.getKind() == ChangeKind.NONE && elementChange.getChildren().isEmpty())
+        {
+          if (DEBUG_CLEANUP)
+          {
+            System.out.println("CLEANUP " + getLabel(elementChange.getElement()));
+          }
+
+          it.remove();
+        }
+      }
+    }
+  }
+
+  private static Change getParentChange(ElementChange elementChange, ModelSetChange modelSetChange)
+  {
+    EModelElement element = elementChange.getElement();
+    EObject eContainer = element.eContainer();
+    if (eContainer instanceof EModelElement)
+    {
+      EModelElement parentElement = (EModelElement)eContainer;
+      ElementChange parentChange = modelSetChange.getElementChanges().get(parentElement);
+      if (parentChange != null)
+      {
+        return parentChange;
+      }
+    }
+
+    return modelSetChange;
+  }
+
+  private static ElementChange getElementChange(EModelElement newElement, EModelElement oldElement, ChangeKind kind,
+      Map<EModelElement, ElementChange> previousElementChanges)
+  {
+    if (previousElementChanges != null)
+    {
+      ElementChangeImpl elementChange = (ElementChangeImpl)previousElementChanges.remove(newElement);
+      if (elementChange == null)
+      {
+        elementChange = (ElementChangeImpl)previousElementChanges.remove(oldElement);
+      }
+
+      if (elementChange != null)
+      {
+        // Make sure that the ElementChange can't be used later through any other lookup.
+        for (Iterator<Map.Entry<EModelElement, ElementChange>> it = previousElementChanges.entrySet().iterator(); it.hasNext();)
+        {
+          Map.Entry<EModelElement, ElementChange> entry = it.next();
+          if (entry.getValue() == elementChange)
+          {
+            it.remove();
+          }
+        }
+
+        elementChange.setOldElement(oldElement);
+        elementChange.setNewElement(newElement);
+        elementChange.setKind(kind);
+        return elementChange;
+      }
+    }
+
+    return EvolutionFactory.eINSTANCE.createElementChange(oldElement, newElement, kind);
+  }
+
+  private static String getLabel(EModelElement element)
+  {
+    String label = ElementHandler.getLabel(element);
+
+    if (DEBUG_IDS)
+    {
+      String id = IDAnnotation.getValue(element);
+      if (id != null)
+      {
+        label += "[" + id + "]";
+      }
+    }
+
+    return label;
+  }
+
+  private static ModelSet[] createModelSetChain(ModelSet modelSetA, ModelSet modelSetB)
+  {
+    int versionA = modelSetA.getVersion();
+    int versionB = modelSetB.getVersion();
+
+    EList<ModelSet> result = new BasicEList<ModelSet>();
+    if (versionA < versionB)
+    {
+      result.add(modelSetA);
+      result.add(modelSetB);
+    }
+    else
+    {
+      result.add(modelSetB);
+      result.add(modelSetA);
+    }
+
+    ModelSet first = result.get(0);
+    ModelSet second;
+    while ((second = result.get(1).getPreviousRelease()) != first)
+    {
+      if (second == null)
+      {
+        break;
+      }
+
+      result.add(1, second);
+    }
+
+    return result.toArray(new ModelSet[result.size()]);
+  }
+
+} // ModelSetImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/PropertyChangeImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/PropertyChangeImpl.java
new file mode 100644
index 0000000..d8e7d9b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/PropertyChangeImpl.java
@@ -0,0 +1,301 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Property Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl#getOldValue <em>Old Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl#getNewValue <em>New Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.PropertyChangeImpl#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PropertyChangeImpl extends ChangeImpl implements PropertyChange
+{
+  /**
+   * The default value of the '{@link #getOldValue() <em>Old Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getOldValue()
+   * @generated
+   * @ordered
+   */
+  protected static final Object OLD_VALUE_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #getNewValue() <em>New Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getNewValue()
+   * @generated
+   * @ordered
+   */
+  protected static final Object NEW_VALUE_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getKind()
+   * @generated
+   * @ordered
+   */
+  protected static final ChangeKind KIND_EDEFAULT = ChangeKind.NONE;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected PropertyChangeImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.PROPERTY_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EStructuralFeature getFeature()
+  {
+    return (EStructuralFeature)eDynamicGet(EvolutionPackage.PROPERTY_CHANGE__FEATURE, EvolutionPackage.Literals.PROPERTY_CHANGE__FEATURE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EStructuralFeature basicGetFeature()
+  {
+    return (EStructuralFeature)eDynamicGet(EvolutionPackage.PROPERTY_CHANGE__FEATURE, EvolutionPackage.Literals.PROPERTY_CHANGE__FEATURE, false, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setFeature(EStructuralFeature newFeature)
+  {
+    eDynamicSet(EvolutionPackage.PROPERTY_CHANGE__FEATURE, EvolutionPackage.Literals.PROPERTY_CHANGE__FEATURE, newFeature);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Object getOldValue()
+  {
+    return eDynamicGet(EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE, EvolutionPackage.Literals.PROPERTY_CHANGE__OLD_VALUE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setOldValue(Object newOldValue)
+  {
+    eDynamicSet(EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE, EvolutionPackage.Literals.PROPERTY_CHANGE__OLD_VALUE, newOldValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Object getNewValue()
+  {
+    return eDynamicGet(EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE, EvolutionPackage.Literals.PROPERTY_CHANGE__NEW_VALUE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setNewValue(Object newNewValue)
+  {
+    eDynamicSet(EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE, EvolutionPackage.Literals.PROPERTY_CHANGE__NEW_VALUE, newNewValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public ChangeKind getKind()
+  {
+    Object oldValue = getOldValue();
+    Object newValue = getNewValue();
+
+    if (oldValue == null)
+    {
+      if (newValue == null)
+      {
+        return ChangeKind.NONE;
+      }
+
+      return ChangeKind.ADDED;
+    }
+    else
+    {
+      if (newValue == null)
+      {
+        return ChangeKind.REMOVED;
+      }
+
+      return ChangeKind.CHANGED;
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.PROPERTY_CHANGE__FEATURE:
+      if (resolve)
+      {
+        return getFeature();
+      }
+      return basicGetFeature();
+    case EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE:
+      return getOldValue();
+    case EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE:
+      return getNewValue();
+    case EvolutionPackage.PROPERTY_CHANGE__KIND:
+      return getKind();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.PROPERTY_CHANGE__FEATURE:
+      setFeature((EStructuralFeature)newValue);
+      return;
+    case EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE:
+      setOldValue(newValue);
+      return;
+    case EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE:
+      setNewValue(newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.PROPERTY_CHANGE__FEATURE:
+      setFeature((EStructuralFeature)null);
+      return;
+    case EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE:
+      setOldValue(OLD_VALUE_EDEFAULT);
+      return;
+    case EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE:
+      setNewValue(NEW_VALUE_EDEFAULT);
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.PROPERTY_CHANGE__FEATURE:
+      return basicGetFeature() != null;
+    case EvolutionPackage.PROPERTY_CHANGE__OLD_VALUE:
+      return OLD_VALUE_EDEFAULT == null ? getOldValue() != null : !OLD_VALUE_EDEFAULT.equals(getOldValue());
+    case EvolutionPackage.PROPERTY_CHANGE__NEW_VALUE:
+      return NEW_VALUE_EDEFAULT == null ? getNewValue() != null : !NEW_VALUE_EDEFAULT.equals(getNewValue());
+    case EvolutionPackage.PROPERTY_CHANGE__KIND:
+      return getKind() != KIND_EDEFAULT;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  @Override
+  public ModelSet getOldModelSet()
+  {
+    Change parent = getParent();
+    if (parent != null)
+    {
+      return parent.getOldModelSet();
+    }
+
+    return null;
+  }
+
+  @Override
+  public ModelSet getNewModelSet()
+  {
+    Change parent = getParent();
+    if (parent != null)
+    {
+      return parent.getNewModelSet();
+    }
+
+    return null;
+  }
+
+} // PropertyChangeImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ReleaseImpl.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ReleaseImpl.java
new file mode 100644
index 0000000..f219630
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/impl/ReleaseImpl.java
@@ -0,0 +1,463 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.impl;
+
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.util.ElementHandler;
+import org.eclipse.emf.cdo.evolution.util.ElementRunnable;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Release</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getEvolution <em>Evolution</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getVersion <em>Version</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getDate <em>Date</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getNextRelease <em>Next Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getPreviousRelease <em>Previous Release</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getRootPackages <em>Root Packages</em>}</li>
+ *   <li>{@link org.eclipse.emf.cdo.evolution.impl.ReleaseImpl#getAllPackages <em>All Packages</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ReleaseImpl extends ModelSetImpl implements Release
+{
+  /**
+   * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVersion()
+   * @generated
+   * @ordered
+   */
+  protected static final int VERSION_EDEFAULT = 0;
+
+  /**
+   * The default value of the '{@link #getDate() <em>Date</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getDate()
+   * @generated
+   * @ordered
+   */
+  protected static final Date DATE_EDEFAULT = null;
+
+  private Map<String, EModelElement> idCache;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ReleaseImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return EvolutionPackage.Literals.RELEASE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Date getDate()
+  {
+    return (Date)eDynamicGet(EvolutionPackage.RELEASE__DATE, EvolutionPackage.Literals.RELEASE__DATE, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setDate(Date newDate)
+  {
+    eDynamicSet(EvolutionPackage.RELEASE__DATE, EvolutionPackage.Literals.RELEASE__DATE, newDate);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Release getNextRelease()
+  {
+    Release nextRelease = basicGetNextRelease();
+    return nextRelease != null && ((EObject)nextRelease).eIsProxy() ? (Release)eResolveProxy((InternalEObject)nextRelease) : nextRelease;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Release basicGetNextRelease()
+  {
+    int nextVersion = getVersion() + 1;
+    return getEvolution().getRelease(nextVersion);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Release getPreviousRelease()
+  {
+    Release previousRelease = basicGetPreviousRelease();
+    return previousRelease != null && ((EObject)previousRelease).eIsProxy() ? (Release)eResolveProxy((InternalEObject)previousRelease) : previousRelease;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Release basicGetPreviousRelease()
+  {
+    int previousVersion = getVersion() - 1;
+    if (previousVersion < 1)
+    {
+      return null;
+    }
+
+    return getEvolution().getRelease(previousVersion);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int getVersion()
+  {
+    return (Integer)eDynamicGet(EvolutionPackage.RELEASE__VERSION, EvolutionPackage.Literals.RELEASE__VERSION, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setVersion(int newVersion)
+  {
+    eDynamicSet(EvolutionPackage.RELEASE__VERSION, EvolutionPackage.Literals.RELEASE__VERSION, newVersion);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  @SuppressWarnings("unchecked")
+  public EList<EPackage> getRootPackages()
+  {
+    return (EList<EPackage>)eDynamicGet(EvolutionPackage.RELEASE__ROOT_PACKAGES, EvolutionPackage.Literals.RELEASE__ROOT_PACKAGES, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Evolution getEvolution()
+  {
+    return (Evolution)eDynamicGet(EvolutionPackage.RELEASE__EVOLUTION, EvolutionPackage.Literals.RELEASE__EVOLUTION, true, true);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetEvolution(Evolution newEvolution, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newEvolution, EvolutionPackage.RELEASE__EVOLUTION, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setEvolution(Evolution newEvolution)
+  {
+    eDynamicSet(EvolutionPackage.RELEASE__EVOLUTION, EvolutionPackage.Literals.RELEASE__EVOLUTION, newEvolution);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public EList<EPackage> getAllPackages()
+  {
+    EcoreEList<EPackage> list = new EcoreEList<EPackage>(EPackage.class, this)
+    {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public int getFeatureID()
+      {
+        return EvolutionPackage.MODEL__ALL_PACKAGES;
+      }
+    };
+
+    for (EPackage rootPackage : getRootPackages())
+    {
+      ModelImpl.collectAllPackages(rootPackage, list);
+    }
+
+    return list;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      return basicSetEvolution((Evolution)otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      return basicSetEvolution(null, msgs);
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      return ((InternalEList<?>)getRootPackages()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      return eInternalContainer().eInverseRemove(this, EvolutionPackage.EVOLUTION__RELEASES, Evolution.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      return getEvolution();
+    case EvolutionPackage.RELEASE__VERSION:
+      return getVersion();
+    case EvolutionPackage.RELEASE__DATE:
+      return getDate();
+    case EvolutionPackage.RELEASE__NEXT_RELEASE:
+      if (resolve)
+      {
+        return getNextRelease();
+      }
+      return basicGetNextRelease();
+    case EvolutionPackage.RELEASE__PREVIOUS_RELEASE:
+      if (resolve)
+      {
+        return getPreviousRelease();
+      }
+      return basicGetPreviousRelease();
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      return getRootPackages();
+    case EvolutionPackage.RELEASE__ALL_PACKAGES:
+      return getAllPackages();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      setEvolution((Evolution)newValue);
+      return;
+    case EvolutionPackage.RELEASE__VERSION:
+      setVersion((Integer)newValue);
+      return;
+    case EvolutionPackage.RELEASE__DATE:
+      setDate((Date)newValue);
+      return;
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      getRootPackages().clear();
+      getRootPackages().addAll((Collection<? extends EPackage>)newValue);
+      return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      setEvolution((Evolution)null);
+      return;
+    case EvolutionPackage.RELEASE__VERSION:
+      setVersion(VERSION_EDEFAULT);
+      return;
+    case EvolutionPackage.RELEASE__DATE:
+      setDate(DATE_EDEFAULT);
+      return;
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      getRootPackages().clear();
+      return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+    case EvolutionPackage.RELEASE__EVOLUTION:
+      return getEvolution() != null;
+    case EvolutionPackage.RELEASE__VERSION:
+      return getVersion() != VERSION_EDEFAULT;
+    case EvolutionPackage.RELEASE__DATE:
+      return DATE_EDEFAULT == null ? getDate() != null : !DATE_EDEFAULT.equals(getDate());
+    case EvolutionPackage.RELEASE__NEXT_RELEASE:
+      return basicGetNextRelease() != null;
+    case EvolutionPackage.RELEASE__PREVIOUS_RELEASE:
+      return basicGetPreviousRelease() != null;
+    case EvolutionPackage.RELEASE__ROOT_PACKAGES:
+      return !getRootPackages().isEmpty();
+    case EvolutionPackage.RELEASE__ALL_PACKAGES:
+      return !getAllPackages().isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  public int compareTo(Release o)
+  {
+    return o.getVersion() - getVersion();
+  }
+
+  @Override
+  public void invalidateChange()
+  {
+    // Do nothing.
+  }
+
+  @Override
+  public boolean containsElement(EModelElement modelElement)
+  {
+    return EcoreUtil.isAncestor(this, modelElement);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T extends EModelElement> T getElement(String id)
+  {
+    if (idCache == null)
+    {
+      idCache = new HashMap<String, EModelElement>();
+
+      ElementHandler.execute(getRootPackages(), new ElementRunnable()
+      {
+        public void run(EModelElement modelElement)
+        {
+          String id = getElementID(modelElement);
+          idCache.put(id, modelElement);
+        }
+      });
+    }
+
+    return (T)idCache.get(id);
+  }
+
+} // ReleaseImpl
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticID.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticID.java
new file mode 100644
index 0000000..eaea7ad
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticID.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.ecore.EModelElement;
+
+/**
+ * @author Eike Stepper
+ */
+public final class DiagnosticID
+{
+  private final String value;
+
+  public DiagnosticID(String value)
+  {
+    this.value = value;
+  }
+
+  public String getValue()
+  {
+    return value;
+  }
+
+  @Override
+  public int hashCode()
+  {
+    return 31 + (value == null ? 0 : value.hashCode());
+  }
+
+  @Override
+  public boolean equals(Object obj)
+  {
+    if (this == obj)
+    {
+      return true;
+    }
+
+    if (obj == null)
+    {
+      return false;
+    }
+
+    if (getClass() != obj.getClass())
+    {
+      return false;
+    }
+
+    DiagnosticID other = (DiagnosticID)obj;
+    if (value == null)
+    {
+      if (other.value != null)
+      {
+        return false;
+      }
+    }
+    else if (!value.equals(other.value))
+    {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public String toString()
+  {
+    return "DiagnosticID[" + value + "]";
+  }
+
+  public static DiagnosticID get(Diagnostic diagnostic)
+  {
+    for (Object data : diagnostic.getData())
+    {
+      if (data instanceof DiagnosticID)
+      {
+        return (DiagnosticID)data;
+      }
+    }
+
+    StringBuilder builder = new StringBuilder();
+    builder.append(diagnostic.getSource());
+    builder.append("|");
+    builder.append(diagnostic.getCode());
+
+    for (Object data : diagnostic.getData())
+    {
+      appendData(builder, data);
+    }
+
+    return new DiagnosticID(builder.toString());
+  }
+
+  private static void appendData(final StringBuilder builder, Object data)
+  {
+    if (data instanceof Provider)
+    {
+      Provider provider = (Provider)data;
+      provider.extractDiagnosticData(new Provider.Context()
+      {
+        public void add(String data)
+        {
+          builder.append("|");
+          builder.append(data);
+        }
+      });
+
+      return;
+    }
+
+    if (data instanceof EModelElement)
+    {
+      EModelElement modelElement = (EModelElement)data;
+      String label = ElementHandler.getLabel(modelElement);
+      if (label != null)
+      {
+        builder.append("|");
+        builder.append(label);
+        return;
+      }
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public interface Provider
+  {
+    public void extractDiagnosticData(Context context);
+
+    /**
+     * @author Eike Stepper
+     */
+    public interface Context
+    {
+      public void add(String data);
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticType.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticType.java
new file mode 100644
index 0000000..34e0bd4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/DiagnosticType.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.common.util.Diagnostic;
+
+/**
+ * @author Eike Stepper
+ */
+public final class DiagnosticType
+{
+  private final String source;
+
+  private final int code;
+
+  public DiagnosticType(String source, int code)
+  {
+    this.source = source;
+    this.code = code;
+  }
+
+  public String getSource()
+  {
+    return source;
+  }
+
+  public int getCode()
+  {
+    return code;
+  }
+
+  public boolean appliesTo(Diagnostic diagnostic)
+  {
+    return code == diagnostic.getCode() && source.equals(diagnostic.getSource());
+  }
+
+  @Override
+  public int hashCode()
+  {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + code;
+    result = prime * result + (source == null ? 0 : source.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj)
+  {
+    if (this == obj)
+    {
+      return true;
+    }
+
+    if (obj == null)
+    {
+      return false;
+    }
+
+    if (getClass() != obj.getClass())
+    {
+      return false;
+    }
+
+    DiagnosticType other = (DiagnosticType)obj;
+    if (code != other.code)
+    {
+      return false;
+    }
+
+    if (source == null)
+    {
+      if (other.source != null)
+      {
+        return false;
+      }
+    }
+    else if (!source.equals(other.source))
+    {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public String toString()
+  {
+    StringBuilder builder = new StringBuilder();
+    builder.append("DiagnosticType[");
+    builder.append(source);
+    builder.append(":");
+    builder.append(code);
+    builder.append("]");
+    return builder.toString();
+  }
+
+  public static DiagnosticType from(Diagnostic diagnostic)
+  {
+    return new DiagnosticType(diagnostic.getSource(), diagnostic.getCode());
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementHandler.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementHandler.java
new file mode 100644
index 0000000..f517692
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementHandler.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.ModelSet;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EEnumLiteral;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class ElementHandler
+{
+  private static ElementHandler PACKAGE = new PackageHandler();
+
+  private static ElementHandler CLASS = new ClassHandler();
+
+  private static ElementHandler ATTRIBUTE = new AttributeHandler();
+
+  private static ElementHandler REFERENCE = new ReferenceHandler();
+
+  private static ElementHandler DATA_TYPE = new DataTypeHandler();
+
+  private static ElementHandler ENUM = new EnumHandler();
+
+  private static ElementHandler ENUM_LITERAL = new EnumLiteralHandler();
+
+  private static final EReference[] NO_CHILD_FEATURES = {};
+
+  private ElementHandler()
+  {
+  }
+
+  public abstract EClass getEClass();
+
+  public EReference[] getChildFeatures()
+  {
+    return NO_CHILD_FEATURES;
+  }
+
+  public boolean hasChildFeatures()
+  {
+    return getChildFeatures().length != 0;
+  }
+
+  protected abstract String computeLabel(EModelElement element);
+
+  public static ElementHandler getHandler(EClass eClass)
+  {
+    if (eClass.getEPackage() == EcorePackage.eINSTANCE)
+    {
+      switch (eClass.getClassifierID())
+      {
+      case EcorePackage.EPACKAGE:
+        return PACKAGE;
+
+      case EcorePackage.ECLASS:
+        return CLASS;
+
+      case EcorePackage.EATTRIBUTE:
+        return ATTRIBUTE;
+
+      case EcorePackage.EREFERENCE:
+        return REFERENCE;
+
+      case EcorePackage.EDATA_TYPE:
+        return DATA_TYPE;
+
+      case EcorePackage.EENUM:
+        return ENUM;
+
+      case EcorePackage.EENUM_LITERAL:
+        return ENUM_LITERAL;
+      }
+    }
+
+    return null;
+  }
+
+  public static String getLabel(EModelElement element)
+  {
+    ElementHandler handler = getHandler(element.eClass());
+    if (handler != null)
+    {
+      return handler.computeLabel(element);
+    }
+
+    return String.valueOf(element);
+  }
+
+  public static ModelSet getModelSet(EModelElement element)
+  {
+    EObject eContainer;
+    while ((eContainer = element.eContainer()) != null)
+    {
+      if (eContainer instanceof ModelSet)
+      {
+        return (ModelSet)eContainer;
+      }
+    }
+
+    return null;
+  }
+
+  public static void execute(EModelElement element, ElementRunnable runnable)
+  {
+    runnable.run(element);
+
+    EClass eClass = element.eClass();
+    ElementHandler handler = getHandler(eClass);
+    if (handler != null)
+    {
+      EReference[] childFeatures = handler.getChildFeatures();
+      for (int i = 0; i < childFeatures.length; i++)
+      {
+        EReference childFeature = childFeatures[i];
+
+        List<?> children = (List<?>)element.eGet(childFeature);
+        for (Object child : children)
+        {
+          if (child instanceof EModelElement)
+          {
+            execute((EModelElement)child, runnable);
+          }
+        }
+      }
+    }
+  }
+
+  public static void execute(List<? extends EModelElement> elements, ElementRunnable runnable)
+  {
+    for (EModelElement element : elements)
+    {
+      execute(element, runnable);
+    }
+  }
+
+  public static void main(String[] args)
+  {
+    // dumpRelevantContainments();
+    dumpManyValuedNonContainments();
+  }
+
+  private static void dumpRelevantContainments()
+  {
+    for (EClassifier eClassifier : EcorePackage.eINSTANCE.getEClassifiers())
+    {
+      if (eClassifier instanceof EClass)
+      {
+        EClass eClass = (EClass)eClassifier;
+
+        if (eClass == EcorePackage.Literals.EOPERATION)
+        {
+          continue;
+        }
+
+        if (eClass == EcorePackage.Literals.EGENERIC_TYPE)
+        {
+          continue;
+        }
+
+        if (eClass == EcorePackage.Literals.ETYPE_PARAMETER)
+        {
+          continue;
+        }
+
+        boolean first = true;
+        for (EStructuralFeature eStructuralFeature : eClass.getEStructuralFeatures())
+        {
+          if (eStructuralFeature instanceof EReference)
+          {
+            EReference eReference = (EReference)eStructuralFeature;
+            if (eReference.isContainment())
+            {
+              if (eReference == EcorePackage.Literals.ECLASS__EOPERATIONS)
+              {
+                continue;
+              }
+
+              if (eReference == EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES)
+              {
+                continue;
+              }
+
+              if (eReference == EcorePackage.Literals.ECLASSIFIER__ETYPE_PARAMETERS)
+              {
+                continue;
+              }
+
+              if (eReference == EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE)
+              {
+                continue;
+              }
+
+              if (first)
+              {
+                System.out.println(eClass.getName());
+                first = false;
+              }
+
+              System.out.println("   " + eReference.getName() + (eReference.isDerived() ? "  DERIVED" : ""));
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private static void dumpManyValuedNonContainments()
+  {
+    for (EClassifier eClassifier : EcorePackage.eINSTANCE.getEClassifiers())
+    {
+      if (eClassifier instanceof EClass)
+      {
+        EClass eClass = (EClass)eClassifier;
+
+        boolean first = true;
+        for (EStructuralFeature eStructuralFeature : eClass.getEStructuralFeatures())
+        {
+          if (!eStructuralFeature.isMany())
+          {
+            continue;
+          }
+
+          if (eStructuralFeature instanceof EReference)
+          {
+            EReference eReference = (EReference)eStructuralFeature;
+            if (eReference.isContainment())
+            {
+              continue;
+            }
+          }
+
+          if (first)
+          {
+            System.out.println(eClass.getName());
+            first = false;
+          }
+
+          System.out.println("   " + eStructuralFeature.getName() + (eStructuralFeature.isDerived() ? "  DERIVED" : ""));
+        }
+      }
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class PackageHandler extends ElementHandler
+  {
+    private static final EReference[] CHILDREN = { EcorePackage.Literals.EPACKAGE__ECLASSIFIERS, EcorePackage.Literals.EPACKAGE__ESUBPACKAGES };
+
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EPACKAGE;
+    }
+
+    @Override
+    public EReference[] getChildFeatures()
+    {
+      return CHILDREN;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EPackage ePackage = (EPackage)element;
+      EPackage eSuperPackage = ePackage.getESuperPackage();
+      if (eSuperPackage != null)
+      {
+        return computeLabel(eSuperPackage) + "." + ePackage.getName();
+      }
+
+      return ePackage.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class ClassHandler extends ElementHandler
+  {
+    private static final EReference[] CHILDREN = { EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES };
+
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.ECLASS;
+    }
+
+    @Override
+    public EReference[] getChildFeatures()
+    {
+      return CHILDREN;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EClass eClass = (EClass)element;
+      EPackage ePackage = eClass.getEPackage();
+      if (ePackage != null)
+      {
+        return getLabel(ePackage) + "." + eClass.getName();
+      }
+
+      return eClass.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static class AttributeHandler extends ElementHandler
+  {
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EATTRIBUTE;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EAttribute eAttribute = (EAttribute)element;
+      EClass eClass = eAttribute.getEContainingClass();
+      if (eClass != null)
+      {
+        return getLabel(eClass) + "." + eAttribute.getName();
+      }
+
+      return eAttribute.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static class ReferenceHandler extends ElementHandler
+  {
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EREFERENCE;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EReference eReference = (EReference)element;
+      EClass eClass = eReference.getEContainingClass();
+      if (eClass != null)
+      {
+        return getLabel(eClass) + "." + eReference.getName();
+      }
+
+      return eReference.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class DataTypeHandler extends ElementHandler
+  {
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EDATA_TYPE;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EDataType eDataType = (EDataType)element;
+      EPackage ePackage = eDataType.getEPackage();
+      if (ePackage != null)
+      {
+        return getLabel(ePackage) + "." + eDataType.getName();
+      }
+
+      return eDataType.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class EnumHandler extends ElementHandler
+  {
+    private static final EReference[] CHILDREN = { EcorePackage.Literals.EENUM__ELITERALS };
+
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EENUM;
+    }
+
+    @Override
+    public EReference[] getChildFeatures()
+    {
+      return CHILDREN;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EEnum eEnum = (EEnum)element;
+      EPackage ePackage = eEnum.getEPackage();
+      if (ePackage != null)
+      {
+        return getLabel(ePackage) + "." + eEnum.getName();
+      }
+
+      return eEnum.getName();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class EnumLiteralHandler extends ElementHandler
+  {
+    @Override
+    public EClass getEClass()
+    {
+      return EcorePackage.Literals.EENUM_LITERAL;
+    }
+
+    @Override
+    protected String computeLabel(EModelElement element)
+    {
+      EEnumLiteral eLiteral = (EEnumLiteral)element;
+      EEnum eEnum = eLiteral.getEEnum();
+      if (eEnum != null)
+      {
+        return getLabel(eEnum) + "." + eLiteral.getName();
+      }
+
+      return eLiteral.getName();
+    }
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementRunnable.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementRunnable.java
new file mode 100644
index 0000000..f5907cb
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ElementRunnable.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.ecore.EModelElement;
+
+/**
+ * @author Eike Stepper
+ */
+public interface ElementRunnable
+{
+  public void run(EModelElement modelElement);
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionAdapterFactory.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionAdapterFactory.java
new file mode 100644
index 0000000..c9a6d16
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionAdapterFactory.java
@@ -0,0 +1,328 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage
+ * @generated
+ */
+public class EvolutionAdapterFactory extends AdapterFactoryImpl
+{
+  /**
+   * The cached model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static EvolutionPackage modelPackage;
+
+  /**
+   * Creates an instance of the adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionAdapterFactory()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = EvolutionPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Returns whether this factory is applicable for the type of the object.
+   * <!-- begin-user-doc -->
+   * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+   * <!-- end-user-doc -->
+   * @return whether this factory is applicable for the type of the object.
+   * @generated
+   */
+  @Override
+  public boolean isFactoryForType(Object object)
+  {
+    if (object == modelPackage)
+    {
+      return true;
+    }
+    if (object instanceof EObject)
+    {
+      return ((EObject)object).eClass().getEPackage() == modelPackage;
+    }
+    return false;
+  }
+
+  /**
+   * The switch that delegates to the <code>createXXX</code> methods.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EvolutionSwitch<Adapter> modelSwitch = new EvolutionSwitch<Adapter>()
+  {
+    @Override
+    public Adapter caseModelSet(ModelSet object)
+    {
+      return createModelSetAdapter();
+    }
+
+    @Override
+    public Adapter caseModel(Model object)
+    {
+      return createModelAdapter();
+    }
+
+    @Override
+    public Adapter caseEvolution(Evolution object)
+    {
+      return createEvolutionAdapter();
+    }
+
+    @Override
+    public Adapter caseRelease(Release object)
+    {
+      return createReleaseAdapter();
+    }
+
+    @Override
+    public Adapter caseChange(Change object)
+    {
+      return createChangeAdapter();
+    }
+
+    @Override
+    public Adapter caseModelSetChange(ModelSetChange object)
+    {
+      return createModelSetChangeAdapter();
+    }
+
+    @Override
+    public Adapter caseElementChange(ElementChange object)
+    {
+      return createElementChangeAdapter();
+    }
+
+    @Override
+    public Adapter casePropertyChange(PropertyChange object)
+    {
+      return createPropertyChangeAdapter();
+    }
+
+    @Override
+    public Adapter caseMigration(Migration object)
+    {
+      return createMigrationAdapter();
+    }
+
+    @Override
+    public Adapter caseFeaturePathMigration(FeaturePathMigration object)
+    {
+      return createFeaturePathMigrationAdapter();
+    }
+
+    @Override
+    public Adapter defaultCase(EObject object)
+    {
+      return createEObjectAdapter();
+    }
+  };
+
+  /**
+   * Creates an adapter for the <code>target</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param target the object to adapt.
+   * @return the adapter for the <code>target</code>.
+   * @generated
+   */
+  @Override
+  public Adapter createAdapter(Notifier target)
+  {
+    return modelSwitch.doSwitch((EObject)target);
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.ModelSet <em>Model Set</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.ModelSet
+   * @generated
+   */
+  public Adapter createModelSetAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.Model <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.Model
+   * @generated
+   */
+  public Adapter createModelAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.Evolution <em>Evolution</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.Evolution
+   * @generated
+   */
+  public Adapter createEvolutionAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.Release <em>Release</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.Release
+   * @generated
+   */
+  public Adapter createReleaseAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.Change <em>Change</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.Change
+   * @generated
+   */
+  public Adapter createChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.ModelSetChange <em>Model Set Change</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.ModelSetChange
+   * @generated
+   */
+  public Adapter createModelSetChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.ElementChange <em>Element Change</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.ElementChange
+   * @generated
+   */
+  public Adapter createElementChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.PropertyChange <em>Property Change</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.PropertyChange
+   * @generated
+   */
+  public Adapter createPropertyChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.Migration <em>Migration</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.Migration
+   * @generated
+   */
+  public Adapter createMigrationAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.cdo.evolution.FeaturePathMigration <em>Feature Path Migration</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.emf.cdo.evolution.FeaturePathMigration
+   * @generated
+   */
+  public Adapter createFeaturePathMigrationAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for the default case.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @generated
+   */
+  public Adapter createEObjectAdapter()
+  {
+    return null;
+  }
+
+} // EvolutionAdapterFactory
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionSwitch.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionSwitch.java
new file mode 100644
index 0000000..e630b1f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionSwitch.java
@@ -0,0 +1,390 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage
+ * @generated
+ */
+public class EvolutionSwitch<T> extends Switch<T>
+{
+  /**
+   * The cached model package
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static EvolutionPackage modelPackage;
+
+  /**
+   * Creates an instance of the switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionSwitch()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = EvolutionPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Checks whether this is a switch for the given package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param ePackage the package in question.
+   * @return whether this is a switch for the given package.
+   * @generated
+   */
+  @Override
+  protected boolean isSwitchFor(EPackage ePackage)
+  {
+    return ePackage == modelPackage;
+  }
+
+  /**
+   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the first non-null result returned by a <code>caseXXX</code> call.
+   * @generated
+   */
+  @Override
+  protected T doSwitch(int classifierID, EObject theEObject)
+  {
+    switch (classifierID)
+    {
+    case EvolutionPackage.MODEL_SET:
+    {
+      ModelSet modelSet = (ModelSet)theEObject;
+      T result = caseModelSet(modelSet);
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.MODEL:
+    {
+      Model model = (Model)theEObject;
+      T result = caseModel(model);
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.EVOLUTION:
+    {
+      Evolution evolution = (Evolution)theEObject;
+      T result = caseEvolution(evolution);
+      if (result == null)
+      {
+        result = caseModelSet(evolution);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.RELEASE:
+    {
+      Release release = (Release)theEObject;
+      T result = caseRelease(release);
+      if (result == null)
+      {
+        result = caseModelSet(release);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.CHANGE:
+    {
+      Change change = (Change)theEObject;
+      T result = caseChange(change);
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.MODEL_SET_CHANGE:
+    {
+      ModelSetChange modelSetChange = (ModelSetChange)theEObject;
+      T result = caseModelSetChange(modelSetChange);
+      if (result == null)
+      {
+        result = caseChange(modelSetChange);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.ELEMENT_CHANGE:
+    {
+      ElementChange elementChange = (ElementChange)theEObject;
+      T result = caseElementChange(elementChange);
+      if (result == null)
+      {
+        result = caseChange(elementChange);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.PROPERTY_CHANGE:
+    {
+      PropertyChange propertyChange = (PropertyChange)theEObject;
+      T result = casePropertyChange(propertyChange);
+      if (result == null)
+      {
+        result = caseChange(propertyChange);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.MIGRATION:
+    {
+      Migration migration = (Migration)theEObject;
+      T result = caseMigration(migration);
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    case EvolutionPackage.FEATURE_PATH_MIGRATION:
+    {
+      FeaturePathMigration featurePathMigration = (FeaturePathMigration)theEObject;
+      T result = caseFeaturePathMigration(featurePathMigration);
+      if (result == null)
+      {
+        result = caseMigration(featurePathMigration);
+      }
+      if (result == null)
+      {
+        result = defaultCase(theEObject);
+      }
+      return result;
+    }
+    default:
+      return defaultCase(theEObject);
+    }
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Model Set</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Model Set</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseModelSet(ModelSet object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Model</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseModel(Model object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Evolution</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseEvolution(Evolution object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Release</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Release</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseRelease(Release object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Change</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseChange(Change object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Model Set Change</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Model Set Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseModelSetChange(ModelSetChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Element Change</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Element Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseElementChange(ElementChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Property Change</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Property Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T casePropertyChange(PropertyChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Migration</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Migration</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseMigration(Migration object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Feature Path Migration</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Feature Path Migration</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseFeaturePathMigration(FeaturePathMigration object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch, but this is the last case anyway.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+   * @generated
+   */
+  @Override
+  public T defaultCase(EObject object)
+  {
+    return null;
+  }
+
+} // EvolutionSwitch
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionValidator.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionValidator.java
new file mode 100644
index 0000000..d169978
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/EvolutionValidator.java
@@ -0,0 +1,1032 @@
+/**
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.ChangeKind;
+import org.eclipse.emf.cdo.evolution.ElementChange;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.EvolutionPackage;
+import org.eclipse.emf.cdo.evolution.FeaturePathMigration;
+import org.eclipse.emf.cdo.evolution.Migration;
+import org.eclipse.emf.cdo.evolution.Model;
+import org.eclipse.emf.cdo.evolution.ModelSet;
+import org.eclipse.emf.cdo.evolution.ModelSetChange;
+import org.eclipse.emf.cdo.evolution.PropertyChange;
+import org.eclipse.emf.cdo.evolution.Release;
+import org.eclipse.emf.cdo.evolution.impl.EvolutionPlugin;
+
+import org.eclipse.net4j.util.collection.CollectionUtil;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.util.EObjectValidator;
+import org.eclipse.emf.ecore.util.EcoreUtil.EqualityHelper;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Validator</b> for the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.cdo.evolution.EvolutionPackage
+ * @generated
+ */
+public class EvolutionValidator extends EObjectValidator
+{
+  /**
+   * The cached model package
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final EvolutionValidator INSTANCE = new EvolutionValidator();
+
+  /**
+   * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.common.util.Diagnostic#getSource()
+   * @see org.eclipse.emf.common.util.Diagnostic#getCode()
+   * @generated
+   */
+  public static final String DIAGNOSTIC_SOURCE = "org.eclipse.emf.cdo.evolution";
+
+  /**
+   * A constant with a fixed name that can be used as the base value for additional hand written constants.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
+
+  public static final int CODE_NO_MODEL = GENERATED_DIAGNOSTIC_CODE_COUNT + 1;
+
+  public static final int CODE_NO_URI = CODE_NO_MODEL + 1;
+
+  public static final int CODE_NO_RESOURCE_SET = CODE_NO_URI + 1;
+
+  public static final int CODE_RESOURCE_NOT_FOUND = CODE_NO_RESOURCE_SET + 1;
+
+  public static final int CODE_LOAD_PROBLEM = CODE_RESOURCE_NOT_FOUND + 1;
+
+  public static final int CODE_CONTENT_PROBLEM = CODE_LOAD_PROBLEM + 1;
+
+  public static final int CODE_PACKAGE_MISSING = CODE_CONTENT_PROBLEM + 1;
+
+  public static final int CODE_PACKAGE_NOT_UNIQUE = CODE_PACKAGE_MISSING + 1;
+
+  public static final int CODE_NSURI_NOT_UNIQUE = CODE_PACKAGE_NOT_UNIQUE + 1;
+
+  public static final int CODE_NSURI_NOT_CHANGED = CODE_NSURI_NOT_UNIQUE + 1;
+
+  public static final int CODE_ID_ANNOTATION_MISSING = CODE_NSURI_NOT_CHANGED + 1;
+
+  public static final int CODE_ID_WITHOUT_VALUE = CODE_ID_ANNOTATION_MISSING + 1;
+
+  public static final int CODE_ID_NOT_UNIQUE = CODE_ID_WITHOUT_VALUE + 1;
+
+  public static final int CODE_MIGRATION_UNUSED = CODE_ID_NOT_UNIQUE + 1;
+
+  public static final int CODE_FEATURE_PATH_UNKNOWN = CODE_MIGRATION_UNUSED + 1;
+
+  // Insert new codes above.
+
+  public static final int CODE_UNCHANGED = CODE_FEATURE_PATH_UNKNOWN + 1;
+
+  public static final int CODE_RELEASE = CODE_UNCHANGED + 1;
+
+  /**
+   * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected static final int DIAGNOSTIC_CODE_COUNT = CODE_RELEASE;
+
+  /**
+   * Creates an instance of the switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EvolutionValidator()
+  {
+    super();
+  }
+
+  @Override
+  public boolean validate_EveryReferenceIsContained(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return true;
+  }
+
+  @Override
+  public boolean validate_EveryProxyResolves(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return true;
+  }
+
+  /**
+   * Returns the package of this validator switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EPackage getEPackage()
+  {
+    return EvolutionPackage.eINSTANCE;
+  }
+
+  /**
+   * Calls <code>validateXXX</code> for the corresponding classifier of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean validateGen(int classifierID, Object value, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    switch (classifierID)
+    {
+    case EvolutionPackage.MODEL_SET:
+      return validateModelSet((ModelSet)value, diagnostics, context);
+    case EvolutionPackage.MODEL:
+      return validateModel((Model)value, diagnostics, context);
+    case EvolutionPackage.EVOLUTION:
+      return validateEvolution((Evolution)value, diagnostics, context);
+    case EvolutionPackage.RELEASE:
+      return validateRelease((Release)value, diagnostics, context);
+    case EvolutionPackage.CHANGE:
+      return validateChange((Change)value, diagnostics, context);
+    case EvolutionPackage.MODEL_SET_CHANGE:
+      return validateModelSetChange((ModelSetChange)value, diagnostics, context);
+    case EvolutionPackage.ELEMENT_CHANGE:
+      return validateElementChange((ElementChange)value, diagnostics, context);
+    case EvolutionPackage.PROPERTY_CHANGE:
+      return validatePropertyChange((PropertyChange)value, diagnostics, context);
+    case EvolutionPackage.MIGRATION:
+      return validateMigration((Migration)value, diagnostics, context);
+    case EvolutionPackage.FEATURE_PATH_MIGRATION:
+      return validateFeaturePathMigration((FeaturePathMigration)value, diagnostics, context);
+    case EvolutionPackage.CHANGE_KIND:
+      return validateChangeKind((ChangeKind)value, diagnostics, context);
+    case EvolutionPackage.URI:
+      return validateURI((URI)value, diagnostics, context);
+    default:
+      return true;
+    }
+  }
+
+  @Override
+  protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (diagnostics == null)
+    {
+      return true;
+    }
+
+    if (context == null)
+    {
+      return true;
+    }
+
+    return validateGen(classifierID, value, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateModelSetGen(ModelSet modelSet, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return validate_EveryDefaultConstraint(modelSet, diagnostics, context);
+  }
+
+  public boolean validateModelSet(ModelSet modelSet, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.RELEASE))
+    {
+      diagnostics.add(
+          createDiagnostic(Diagnostic.INFO, DIAGNOSTIC_SOURCE, CODE_RELEASE, "_UI_Release_diagnostic", new Object[] {}, new Object[] { modelSet }, context));
+      return true;
+    }
+
+    return validateModelSetGen(modelSet, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateModel(Model model, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (!validate_NoCircularContainment(model, diagnostics, context))
+    {
+      return false;
+    }
+    boolean result = validate_EveryMultiplicityConforms(model, diagnostics, context);
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryDataValueConforms(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryReferenceIsContained(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryBidirectionalReferenceIsPaired(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryProxyResolves(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_UniqueID(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryKeyUnique(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryMapEntryUnique(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateModel_ModelLoaded(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateModel_IDs_Exist(model, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateModel_NamespaceReflectsChange(model, diagnostics, context);
+    }
+    return result;
+  }
+
+  /**
+   * Validates the ModelLoaded constraint of '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MODEL_AVAILABILITY
+   */
+  public boolean validateModel_ModelLoaded(Model model, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MODEL_AVAILABILITY))
+    {
+      switch (model.getStatus())
+      {
+      case NO_URI:
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_NO_URI, "_UI_NO_URI_diagnostic", new Object[] {},
+            new Object[] { model, EvolutionPackage.Literals.MODEL__URI }, context));
+        return false;
+
+      case NO_RESOURCE_SET:
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_NO_RESOURCE_SET, "_UI_NO_RESOURCE_SET_diagnostic", new Object[] {},
+            new Object[] { model }, context));
+        return false;
+
+      case RESOURCE_NOT_FOUND:
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_RESOURCE_NOT_FOUND, "_UI_RESOURCE_NOT_FOUND_diagnostic",
+            new Object[] { model.getURI().toString() }, new Object[] { model, EvolutionPackage.Literals.MODEL__URI }, context));
+        return false;
+
+      case LOAD_PROBLEM:
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_RESOURCE_NOT_FOUND, "_UI_LOAD_PROBLEM_diagnostic",
+            new Object[] { model.getURI().toString() }, new Object[] { model, EvolutionPackage.Literals.MODEL__URI }, context));
+        return false;
+
+      case CONTENT_PROBLEM:
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_CONTENT_PROBLEM, "_UI_CONTENT_PROBLEM_diagnostic",
+            new Object[] { model.getURI().toString() }, new Object[] { model, EvolutionPackage.Literals.MODEL__URI }, context));
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Validates the IDs_Exist constraint of '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category IDENTITY_COMPLETENESS
+   */
+  public boolean validateModel_IDs_Exist(Model model, final DiagnosticChain diagnostics, final Map<Object, Object> context)
+  {
+    ValidationContext validationContext = ValidationContext.getFrom(context);
+    if (validationContext != null && validationContext.getPhase() == ValidationPhase.IDENTITY_COMPLETENESS)
+    {
+      final Map<String, Object> identifiedElements = validationContext.getIdentifiedElements();
+      EPackage rootPackage = model.getRootPackage();
+
+      final boolean[] result = { true };
+      ElementHandler.execute(rootPackage, new ElementRunnable()
+      {
+        public void run(EModelElement modelElement)
+        {
+          if (IDAnnotation.getFrom(modelElement, false) == null)
+          {
+            diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_ID_ANNOTATION_MISSING, "_UI_IDsExist_AnnotationMissing_diagnostic",
+                new Object[] {}, new Object[] { modelElement, EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS }, context));
+            result[0] = false;
+          }
+          else
+          {
+            String value = IDAnnotation.getValue(modelElement);
+            if (value == null)
+            {
+              diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_ID_WITHOUT_VALUE, "_UI_IDsExist_NoValue_diagnostic", new Object[] {},
+                  new Object[] { modelElement, EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS }, context));
+              result[0] = false;
+            }
+            else
+            {
+              Object element = identifiedElements.get(value);
+              if (element == null)
+              {
+                identifiedElements.put(value, modelElement);
+              }
+              else if (element instanceof List<?>)
+              {
+                @SuppressWarnings("unchecked")
+                List<EModelElement> elements = (List<EModelElement>)element;
+                elements.add(modelElement);
+              }
+              else
+              {
+                List<EModelElement> elements = new ArrayList<EModelElement>();
+                elements.add((EModelElement)element);
+                elements.add(modelElement);
+                identifiedElements.put(value, elements);
+              }
+            }
+          }
+        }
+      });
+
+      return result[0];
+    }
+    return true;
+  }
+
+  /**
+   * Validates the NamespaceReflectsChange constraint of '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MODEL_UNIQUENESS
+   */
+  public boolean validateModel_NamespaceReflectsChange(Model model, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MODEL_UNIQUENESS))
+    {
+      Evolution evolution = model.getEvolution();
+      if (evolution.isUniqueNamespaces())
+      {
+        Map<String, Set<EPackage>> releasedPackages = evolution.getReleasedPackages();
+        boolean result = true;
+
+        for (EPackage ePackage : model.getAllPackages())
+        {
+          Set<EPackage> set = releasedPackages.get(ePackage.getNsURI());
+          if (set != null)
+          {
+            for (EPackage releasedPackage : set)
+            {
+              EqualityHelper equalityHelper = new EqualityHelper()
+              {
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                protected boolean haveEqualFeature(EObject eObject1, EObject eObject2, EStructuralFeature feature)
+                {
+                  if (feature == EcorePackage.Literals.EPACKAGE__ESUBPACKAGES)
+                  {
+                    // Compare packages without their subpackages.
+                    return true;
+                  }
+
+                  return super.haveEqualFeature(eObject1, eObject2, feature);
+                }
+              };
+
+              if (!equalityHelper.equals(ePackage, releasedPackage))
+              {
+                Release release = (Release)ElementHandler.getModelSet(releasedPackage);
+
+                diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_NSURI_NOT_CHANGED, "_UI_NsUriMustChange_diagnostic",
+                    new Object[] { ePackage.getNsURI(), release.getVersion() },
+                    new Object[] { ePackage, EcorePackage.Literals.EPACKAGE__NS_URI, releasedPackage, evolution }, context));
+                result = false;
+                break;
+              }
+            }
+          }
+        }
+
+        return result;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateEvolutionGen(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (!validate_NoCircularContainment(evolution, diagnostics, context))
+    {
+      return false;
+    }
+    boolean result = validate_EveryMultiplicityConforms(evolution, diagnostics, context);
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryDataValueConforms(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryReferenceIsContained(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryBidirectionalReferenceIsPaired(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryProxyResolves(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_UniqueID(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryKeyUnique(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryMapEntryUnique(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateEvolution_NotEmpty(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateEvolution_PackagesUnique(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateEvolution_NoMissingPackages(evolution, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateEvolution_IDsUnique(evolution, diagnostics, context);
+    }
+    return result;
+  }
+
+  public boolean validateEvolution(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.RELEASE))
+    {
+      ModelSetChange change = evolution.getChange();
+
+      if (change == null || change.getChildren().isEmpty())
+      {
+        Release latestRelease = evolution.getLatestRelease();
+        if (latestRelease == null)
+        {
+          diagnostics.add(createDiagnostic(Diagnostic.INFO, DIAGNOSTIC_SOURCE, CODE_UNCHANGED, "_UI_Unchanged_diagnostic", new Object[] {},
+              new Object[] { evolution }, context));
+        }
+        else
+        {
+          diagnostics.add(createDiagnostic(Diagnostic.INFO, DIAGNOSTIC_SOURCE, CODE_UNCHANGED, "_UI_UnchangedSince_diagnostic",
+              new Object[] { latestRelease.getVersion() }, new Object[] { evolution }, context));
+        }
+      }
+      else
+      {
+        diagnostics.add(
+            createDiagnostic(Diagnostic.INFO, DIAGNOSTIC_SOURCE, CODE_RELEASE, "_UI_Release_diagnostic", new Object[] {}, new Object[] { evolution }, context));
+      }
+      return true;
+    }
+
+    return validateEvolutionGen(evolution, diagnostics, context);
+  }
+
+  /**
+   * Validates the NotEmpty constraint of '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MODEL_AVAILABILITY
+   */
+  public boolean validateEvolution_NotEmpty(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MODEL_AVAILABILITY))
+    {
+      if (evolution.getModels().isEmpty())
+      {
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_NO_MODEL, "_UI_NoModel_diagnostic", new Object[] {},
+            new Object[] { evolution }, context));
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Validates the PackagesUnique constraint of '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MODEL_UNIQUENESS
+   */
+  public boolean validateEvolution_PackagesUnique(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MODEL_UNIQUENESS))
+    {
+      boolean result = true;
+
+      Map<URI, Set<Model>> models = new HashMap<URI, Set<Model>>();
+      for (Model model : evolution.getModels())
+      {
+        CollectionUtil.add(models, model.getURI(), model);
+      }
+
+      for (Set<Model> set : models.values())
+      {
+        if (set.size() > 1)
+        {
+          for (Model model : set)
+          {
+            diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_PACKAGE_NOT_UNIQUE, "_UI_PackageNotUnique_diagnostic",
+                new Object[] { model.getURI().toString() }, new Object[] { model, EvolutionPackage.Literals.MODEL__URI, model.getURI() }, context));
+            result = false;
+          }
+        }
+      }
+
+      Map<String, Set<EPackage>> packages = new HashMap<String, Set<EPackage>>();
+      for (EPackage ePackage : evolution.getAllPackages())
+      {
+        CollectionUtil.add(packages, ePackage.getNsURI(), ePackage);
+      }
+
+      for (Set<EPackage> set : packages.values())
+      {
+        if (set.size() > 1)
+        {
+          for (EPackage ePackage : set)
+          {
+            diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_NSURI_NOT_UNIQUE, "_UI_NsuriNotUnique_diagnostic",
+                new Object[] { ePackage.getNsURI() }, new Object[] { ePackage, EcorePackage.Literals.EPACKAGE__NS_URI, ePackage.getNsURI() }, context));
+            result = false;
+          }
+        }
+      }
+
+      return result;
+    }
+
+    return true;
+  }
+
+  /**
+   * Validates the NoMissingPackages constraint of '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MODEL_INTEGRITY
+   */
+  public boolean validateEvolution_NoMissingPackages(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MODEL_INTEGRITY))
+    {
+      EList<EPackage> missingPackages = evolution.getMissingPackages();
+      if (missingPackages.size() != 0)
+      {
+        for (EPackage missingPackage : missingPackages)
+        {
+          diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_PACKAGE_MISSING, "_UI_MissingPackage_diagnostic",
+              new Object[] { missingPackage.getName() }, new Object[] { evolution, EvolutionPackage.Literals.EVOLUTION__MISSING_PACKAGES, missingPackage },
+              context));
+        }
+
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Validates the IDsUnique constraint of '<em>Evolution</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category IDENTITY_UNIQUENESS
+   */
+  public boolean validateEvolution_IDsUnique(Evolution evolution, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    // TODO Validate oldValue.
+    // TODO Validate oldElement.eClass() == newElement.eClass().
+    int xxx;
+
+    ValidationContext validationContext = ValidationContext.getFrom(context);
+    if (validationContext != null && validationContext.getPhase() == ValidationPhase.IDENTITY_UNIQUENESS)
+    {
+      boolean result = true;
+      for (Map.Entry<String, Object> entry : validationContext.getIdentifiedElements().entrySet())
+      {
+        Object element = entry.getValue();
+        if (element instanceof List<?>)
+        {
+          String id = entry.getKey();
+
+          @SuppressWarnings("unchecked")
+          List<EModelElement> elements = (List<EModelElement>)element;
+          for (EModelElement modelElement : elements)
+          {
+            List<Object> data = new ArrayList<Object>();
+            data.add(modelElement);
+            data.add(EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS);
+            data.add(id);
+
+            for (EModelElement conflictingElement : elements)
+            {
+              if (conflictingElement != modelElement)
+              {
+                data.add(conflictingElement);
+              }
+            }
+
+            diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_ID_NOT_UNIQUE, "_UI_IDNotUnique_diagnostic", new Object[] { id },
+                data.toArray(new Object[data.size()]), context));
+            result = false;
+          }
+        }
+      }
+
+      return result;
+    }
+
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateRelease(Release release, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return validate_EveryDefaultConstraint(release, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateChange(Change change, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return validate_EveryDefaultConstraint(change, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateModelSetChange(ModelSetChange modelSetChange, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return validate_EveryDefaultConstraint(modelSetChange, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateElementChange(ElementChange elementChange, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (!validate_NoCircularContainment(elementChange, diagnostics, context))
+    {
+      return false;
+    }
+    boolean result = validate_EveryMultiplicityConforms(elementChange, diagnostics, context);
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryDataValueConforms(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryReferenceIsContained(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryBidirectionalReferenceIsPaired(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryProxyResolves(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_UniqueID(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryKeyUnique(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryMapEntryUnique(elementChange, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateElementChange_FeaturePathIsKnown(elementChange, diagnostics, context);
+    }
+    return result;
+  }
+
+  /**
+   * Validates the FeaturePathIsKnown constraint of '<em>Element Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category CHANGE_VALIDITY
+   */
+  public boolean validateElementChange_FeaturePathIsKnown(ElementChange elementChange, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    ValidationContext validationContext = ValidationContext.getFrom(context);
+    if (validationContext != null && validationContext.getPhase() == ValidationPhase.CHANGE_VALIDITY)
+    {
+      ChangeKind kind = elementChange.getKind();
+      if (kind == ChangeKind.COPIED || kind == ChangeKind.MOVED)
+      {
+        EModelElement newElement = elementChange.getNewElement();
+        if (newElement instanceof EStructuralFeature)
+        {
+          EStructuralFeature newFeature = (EStructuralFeature)newElement;
+          EStructuralFeature oldFeature = (EStructuralFeature)elementChange.getOldElement();
+
+          EClass newContainingClass = newFeature.getEContainingClass();
+          EClass oldContainingClass = oldFeature.getEContainingClass();
+          if (elementChange.getOldElementFor(newContainingClass) != oldContainingClass)
+          {
+            BasicDiagnostic diagnostic = createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_FEATURE_PATH_UNKNOWN, "_UI_FeaturePathIsKnown_diagnostic",
+                new Object[] { ElementHandler.getLabel(newFeature), kind.getName().toLowerCase(), ElementHandler.getLabel(oldFeature) },
+                new Object[] { elementChange, newFeature }, context);
+
+            Evolution evolution = validationContext.getEvolution();
+            DiagnosticID diagnosticID = DiagnosticID.get(diagnostic);
+
+            Migration migration = evolution.getMigration(diagnosticID.getValue());
+            if (migration != null)
+            {
+              validationContext.getUsedMigrations().put(diagnosticID, migration);
+              return true;
+            }
+
+            diagnostics.add(diagnostic);
+            return false;
+          }
+        }
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validatePropertyChange(PropertyChange propertyChange, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return validate_EveryDefaultConstraint(propertyChange, diagnostics, context);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateMigration(Migration migration, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (!validate_NoCircularContainment(migration, diagnostics, context))
+    {
+      return false;
+    }
+    boolean result = validate_EveryMultiplicityConforms(migration, diagnostics, context);
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryDataValueConforms(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryReferenceIsContained(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryBidirectionalReferenceIsPaired(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryProxyResolves(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_UniqueID(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryKeyUnique(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryMapEntryUnique(migration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateMigration_NotObsolete(migration, diagnostics, context);
+    }
+    return result;
+  }
+
+  /**
+   * Validates the NotObsolete constraint of '<em>Migration</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MIGRATION_OBSOLETENESS
+   */
+  public boolean validateMigration_NotObsolete(Migration migration, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    ValidationContext validationContext = ValidationContext.getFrom(context);
+    if (validationContext != null && validationContext.getPhase() == ValidationPhase.MIGRATION_OBSOLETENESS)
+    {
+      String idValue = migration.getDiagnosticID();
+      if (idValue != null && idValue.length() != 0)
+      {
+        DiagnosticID diagnosticID = new DiagnosticID(idValue);
+        if (!validationContext.getUsedMigrations().containsKey(diagnosticID))
+        {
+          diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, CODE_MIGRATION_UNUSED, "_UI_MigrationUnused_diagnostic",
+              new Object[] { migration }, new Object[] { migration, diagnosticID }, context));
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateFeaturePathMigration(FeaturePathMigration featurePathMigration, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    if (!validate_NoCircularContainment(featurePathMigration, diagnostics, context))
+    {
+      return false;
+    }
+    boolean result = validate_EveryMultiplicityConforms(featurePathMigration, diagnostics, context);
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryDataValueConforms(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryReferenceIsContained(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryBidirectionalReferenceIsPaired(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryProxyResolves(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_UniqueID(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryKeyUnique(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validate_EveryMapEntryUnique(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateMigration_NotObsolete(featurePathMigration, diagnostics, context);
+    }
+    if (result || diagnostics != null)
+    {
+      result &= validateFeaturePathMigration_NewFeatureReachable(featurePathMigration, diagnostics, context);
+    }
+    return result;
+  }
+
+  /**
+   * Validates the NewFeatureReachable constraint of '<em>Feature Path Migration</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   * @category MIGRATION_VALIDITY
+   */
+  public boolean validateFeaturePathMigration_NewFeatureReachable(FeaturePathMigration featurePathMigration, DiagnosticChain diagnostics,
+      Map<Object, Object> context)
+  {
+    if (ValidationContext.isPhase(context, ValidationPhase.MIGRATION_VALIDITY))
+    {
+    }
+    // TODO implement the constraint
+    // -> specify the condition that violates the constraint
+    // -> verify the diagnostic details, including severity, code, and message
+    // Ensure that you remove @generated or mark it @generated NOT
+    if (false)
+    {
+      if (diagnostics != null)
+      {
+        diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, 0, "_UI_GenericConstraint_diagnostic",
+            new Object[] { "NewFeatureReachable", getObjectLabel(featurePathMigration, context) }, new Object[] { featurePathMigration }, context));
+      }
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateChangeKind(ChangeKind changeKind, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return true;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean validateURI(URI uri, DiagnosticChain diagnostics, Map<Object, Object> context)
+  {
+    return true;
+  }
+
+  /**
+   * Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return EvolutionPlugin.INSTANCE;
+  }
+
+} // EvolutionValidator
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/IDAnnotation.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/IDAnnotation.java
new file mode 100644
index 0000000..9619213
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/IDAnnotation.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import java.util.ListIterator;
+
+/**
+ * @author Eike Stepper
+ */
+public class IDAnnotation
+{
+  public static final String SOURCE = "http://www.eclipse.org/CDO/evolution/ID";
+
+  public static final String VALUE_KEY = "value";
+
+  public static final String OLD_VALUE_KEY = "oldValue";
+
+  public static EAnnotation getFrom(EModelElement element, boolean createOnDemand)
+  {
+    EList<EAnnotation> annotations = element.getEAnnotations();
+    for (ListIterator<EAnnotation> it = annotations.listIterator(); it.hasNext();)
+    {
+      EAnnotation annotation = it.next();
+      if (SOURCE.equals(annotation.getSource()))
+      {
+        return annotation;
+      }
+    }
+
+    if (createOnDemand)
+    {
+      EAnnotation annotation = EcoreFactory.eINSTANCE.createEAnnotation();
+      annotation.setSource(IDAnnotation.SOURCE);
+      annotations.add(annotation);
+      return annotation;
+    }
+
+    return null;
+  }
+
+  public static boolean removeFrom(EModelElement element)
+  {
+    boolean removed = false;
+
+    for (ListIterator<EAnnotation> it = element.getEAnnotations().listIterator(); it.hasNext();)
+    {
+      EAnnotation annotation = it.next();
+      if (IDAnnotation.SOURCE.equals(annotation.getSource()))
+      {
+        it.remove();
+        removed = true;
+      }
+    }
+
+    return removed;
+  }
+
+  public static String getOldValue(EModelElement element)
+  {
+    EAnnotation annotation = getFrom(element, false);
+    if (annotation != null)
+    {
+      return annotation.getDetails().get(OLD_VALUE_KEY);
+    }
+
+    return null;
+  }
+
+  public static String setOldValue(EModelElement element, String oldValue)
+  {
+    EAnnotation annotation = getFrom(element, true);
+    if (oldValue == null || oldValue.length() == 0)
+    {
+      oldValue = annotation.getDetails().get(OLD_VALUE_KEY);
+      annotation.getDetails().remove(OLD_VALUE_KEY);
+      return oldValue;
+    }
+
+    return annotation.getDetails().put(OLD_VALUE_KEY, oldValue);
+  }
+
+  public static String getValue(EModelElement element)
+  {
+    return getValue(element, false);
+  }
+
+  public static String getValue(EModelElement element, boolean considerOldValue)
+  {
+    EAnnotation annotation = getFrom(element, false);
+    if (annotation != null)
+    {
+      EMap<String, String> details = annotation.getDetails();
+      if (considerOldValue)
+      {
+        String oldValue = details.get(OLD_VALUE_KEY);
+        if (oldValue != null && oldValue.length() != 0)
+        {
+          return oldValue;
+        }
+      }
+
+      return details.get(VALUE_KEY);
+    }
+
+    return null;
+  }
+
+  public static String setValue(EModelElement element, String value)
+  {
+    EAnnotation annotation = getFrom(element, true);
+    if (value == null || value.length() == 0)
+    {
+      value = annotation.getDetails().get(VALUE_KEY);
+      annotation.getDetails().remove(VALUE_KEY);
+      return value;
+    }
+
+    return annotation.getDetails().put(VALUE_KEY, value);
+  }
+
+  public static String ensureValue(EModelElement element)
+  {
+    EAnnotation annotation = getFrom(element, true);
+    EMap<String, String> details = annotation.getDetails();
+
+    String value = details.get(VALUE_KEY);
+    if (value != null && value.length() != 0)
+    {
+      return null;
+    }
+
+    value = EcoreUtil.generateUUID();
+    details.put(VALUE_KEY, value);
+    return value;
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationContext.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationContext.java
new file mode 100644
index 0000000..002f90a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationContext.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.Migration;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Eike Stepper
+ */
+public final class ValidationContext
+{
+  private static final String KEY = ValidationContext.class.getName();
+
+  private final Evolution evolution;
+
+  private ValidationPhase phase;
+
+  private final Map<Resource, BasicDiagnostic> resourceDiagnostics = new HashMap<Resource, BasicDiagnostic>();
+
+  private final Map<String, Object> identifiedElements = new HashMap<String, Object>();
+
+  private final Map<DiagnosticID, Migration> usedMigrations = new HashMap<DiagnosticID, Migration>();
+
+  public ValidationContext(Evolution evolution)
+  {
+    this.evolution = evolution;
+    phase = ValidationPhase.values()[0];
+  }
+
+  public Evolution getEvolution()
+  {
+    return evolution;
+  }
+
+  public ValidationPhase getPhase()
+  {
+    return phase;
+  }
+
+  public void setPhase(ValidationPhase phase)
+  {
+    this.phase = phase;
+  }
+
+  public Map<Resource, BasicDiagnostic> getResourceDiagnostics()
+  {
+    return resourceDiagnostics;
+  }
+
+  public Map<String, Object> getIdentifiedElements()
+  {
+    return identifiedElements;
+  }
+
+  public Map<DiagnosticID, Migration> getUsedMigrations()
+  {
+    return usedMigrations;
+  }
+
+  public void putInto(Map<Object, Object> context)
+  {
+    context.put(KEY, this);
+  }
+
+  public static ValidationContext getFrom(Map<Object, Object> context)
+  {
+    Object contextObject = context.get(KEY);
+    if (contextObject instanceof ValidationContext)
+    {
+      return (ValidationContext)contextObject;
+    }
+
+    return null;
+  }
+
+  public static void removeFrom(Map<Object, Object> context)
+  {
+    context.remove(KEY);
+  }
+
+  public static boolean isPhase(Map<Object, Object> context, ValidationPhase phase)
+  {
+    ValidationContext validationContext = getFrom(context);
+    return validationContext != null && validationContext.getPhase() == phase;
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationPhase.java b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationPhase.java
new file mode 100644
index 0000000..1b2c86c
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.evolution/src/org/eclipse/emf/cdo/evolution/util/ValidationPhase.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2004-2018 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.evolution.util;
+
+import org.eclipse.emf.cdo.evolution.Change;
+import org.eclipse.emf.cdo.evolution.Evolution;
+import org.eclipse.emf.cdo.evolution.Migration;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.util.Diagnostician;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eike Stepper
+ */
+public enum ValidationPhase
+{
+  MODEL_AVAILABILITY
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return evolution.getModels();
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  MODEL_UNIQUENESS
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return evolution.getModels();
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  MODEL_INTEGRITY
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      return Collections.emptyList();
+    }
+  },
+
+  MODEL_VALIDITY
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return evolution.getRootPackages();
+      }
+
+      if (isPackageElement(evolution, eObject))
+      {
+        return super.getContentsToValidate(diagnostician, evolution, eObject, context);
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  IDENTITY_COMPLETENESS
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      return MODEL_AVAILABILITY.getContentsToValidate(diagnostician, evolution, eObject, context);
+    }
+  },
+
+  IDENTITY_UNIQUENESS
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      return Collections.emptyList();
+    }
+  },
+
+  CHANGE_VALIDITY
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return Collections.singletonList(evolution.getChange());
+      }
+
+      if (eObject instanceof Change)
+      {
+        Change change = (Change)eObject;
+        if (EcoreUtil.isAncestor(evolution.getChange(), change))
+        {
+          return change.getChildren();
+        }
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  MIGRATION_OBSOLETENESS
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return evolution.getMigrations();
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  MIGRATION_VALIDITY
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      if (eObject == evolution)
+      {
+        return evolution.getMigrations();
+      }
+
+      if (eObject instanceof Migration)
+      {
+        return super.getContentsToValidate(diagnostician, evolution, eObject, context);
+      }
+
+      return Collections.emptyList();
+    }
+  },
+
+  RELEASE
+  {
+    @Override
+    public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+    {
+      return Collections.emptyList();
+    }
+  };
+
+  public static final List<ValidationPhase> ALL = Arrays.asList(ValidationPhase.values());
+
+  public List<? extends EObject> getContentsToValidate(Diagnostician diagnostician, Evolution evolution, EObject eObject, Map<Object, Object> context)
+  {
+    return eObject.eContents();
+  }
+
+  private static boolean isPackageElement(Evolution evolution, EObject eObject)
+  {
+    EObject rootContainer = EcoreUtil.getRootContainer(eObject);
+    for (EPackage rootPackage : evolution.getRootPackages())
+    {
+      if (rootContainer == rootPackage)
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+}
diff --git a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
index afff752..cc9efea 100644
--- a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
@@ -71,7 +71,8 @@
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
-   org.eclipse.emf.cdo.ui",
+   org.eclipse.emf.cdo.ui,
+   org.eclipse.emf.cdo.evolution",
  org.eclipse.emf.internal.cdo.view;version="4.6.200";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
diff --git a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
index 94d4b2f..4df488a 100644
--- a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.net4j.util;singleton:=true
-Bundle-Version: 3.8.0.qualifier
+Bundle-Version: 3.9.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -15,35 +15,35 @@
  org.osgi.framework;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.service.log;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.util.tracker;version="[1.3.0,2.0.0)";resolution:=optional
-Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.8.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
- org.eclipse.net4j.internal.util.container;version="3.8.0";x-internal:=true,
- org.eclipse.net4j.internal.util.factory;version="3.8.0";x-internal:=true,
- org.eclipse.net4j.internal.util.om;version="3.8.0";x-internal:=true,
- org.eclipse.net4j.internal.util.om.pref;version="3.8.0";x-internal:=true,
- org.eclipse.net4j.internal.util.table;version="3.8.0";x-internal:=true,
- org.eclipse.net4j.internal.util.test;version="3.8.0";x-friends:="org.eclipse.net4j.tests",
- org.eclipse.net4j.util;version="3.8.0",
- org.eclipse.net4j.util.cache;version="3.8.0",
- org.eclipse.net4j.util.collection;version="3.8.0",
- org.eclipse.net4j.util.concurrent;version="3.8.0",
- org.eclipse.net4j.util.confirmation;version="3.8.0",
- org.eclipse.net4j.util.container;version="3.8.0",
- org.eclipse.net4j.util.container.delegate;version="3.8.0",
- org.eclipse.net4j.util.event;version="3.8.0",
- org.eclipse.net4j.util.factory;version="3.8.0",
- org.eclipse.net4j.util.fsm;version="3.8.0",
- org.eclipse.net4j.util.io;version="3.8.0",
- org.eclipse.net4j.util.lifecycle;version="3.8.0",
- org.eclipse.net4j.util.om;version="3.8.0",
- org.eclipse.net4j.util.om.log;version="3.8.0",
- org.eclipse.net4j.util.om.monitor;version="3.8.0",
- org.eclipse.net4j.util.om.pref;version="3.8.0",
- org.eclipse.net4j.util.om.trace;version="3.8.0",
- org.eclipse.net4j.util.options;version="3.8.0",
- org.eclipse.net4j.util.properties;version="3.8.0",
- org.eclipse.net4j.util.ref;version="3.8.0",
- org.eclipse.net4j.util.registry;version="3.8.0",
- org.eclipse.net4j.util.security;version="3.8.0",
- org.eclipse.net4j.util.transaction;version="3.8.0"
+Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.9.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
+ org.eclipse.net4j.internal.util.container;version="3.9.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.factory;version="3.9.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.om;version="3.9.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.om.pref;version="3.9.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.table;version="3.9.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.test;version="3.9.0";x-friends:="org.eclipse.net4j.tests",
+ org.eclipse.net4j.util;version="3.9.0",
+ org.eclipse.net4j.util.cache;version="3.9.0",
+ org.eclipse.net4j.util.collection;version="3.9.0",
+ org.eclipse.net4j.util.concurrent;version="3.9.0",
+ org.eclipse.net4j.util.confirmation;version="3.9.0",
+ org.eclipse.net4j.util.container;version="3.9.0",
+ org.eclipse.net4j.util.container.delegate;version="3.9.0",
+ org.eclipse.net4j.util.event;version="3.9.0",
+ org.eclipse.net4j.util.factory;version="3.9.0",
+ org.eclipse.net4j.util.fsm;version="3.9.0",
+ org.eclipse.net4j.util.io;version="3.9.0",
+ org.eclipse.net4j.util.lifecycle;version="3.9.0",
+ org.eclipse.net4j.util.om;version="3.9.0",
+ org.eclipse.net4j.util.om.log;version="3.9.0",
+ org.eclipse.net4j.util.om.monitor;version="3.9.0",
+ org.eclipse.net4j.util.om.pref;version="3.9.0",
+ org.eclipse.net4j.util.om.trace;version="3.9.0",
+ org.eclipse.net4j.util.options;version="3.9.0",
+ org.eclipse.net4j.util.properties;version="3.9.0",
+ org.eclipse.net4j.util.ref;version="3.9.0",
+ org.eclipse.net4j.util.registry;version="3.9.0",
+ org.eclipse.net4j.util.security;version="3.9.0",
+ org.eclipse.net4j.util.transaction;version="3.9.0"
 Eclipse-BuddyPolicy: registered
 Automatic-Module-Name: org.eclipse.net4j.util
diff --git a/plugins/org.eclipse.net4j.util/pom.xml b/plugins/org.eclipse.net4j.util/pom.xml
index dc0b1fd..6d212fa 100644
--- a/plugins/org.eclipse.net4j.util/pom.xml
+++ b/plugins/org.eclipse.net4j.util/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.net4j.util</artifactId>
-  <version>3.8.0-SNAPSHOT</version>
+  <version>3.9.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/CollectionUtil.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/CollectionUtil.java
index 14e0819..3787367 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/CollectionUtil.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/CollectionUtil.java
@@ -11,8 +11,12 @@
 package org.eclipse.net4j.util.collection;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Various static helper methods.
@@ -26,6 +30,90 @@
   {
   }
 
+  /**
+   * @since 3.9
+   */
+  public static <K, V> Set<V> getSet(Map<K, Set<V>> map, K key)
+  {
+    Set<V> set = map.get(key);
+    if (set == null)
+    {
+      set = new LinkedHashSet<V>();
+      map.put(key, set);
+    }
+
+    return set;
+  }
+
+  /**
+   * @since 3.9
+   */
+  public static <K, V> boolean add(Map<K, Set<V>> map, K key, V value)
+  {
+    Set<V> set = getSet(map, key);
+    return set.add(value);
+  }
+
+  /**
+   * @since 3.9
+   */
+  public static <K, V> boolean addAll(Map<K, Set<V>> map, K key, Collection<? extends V> values)
+  {
+    Set<V> set = getSet(map, key);
+    return set.addAll(values);
+  }
+
+  /**
+   * @since 3.9
+   */
+  public static <K, V> boolean addAll(Map<K, Set<V>> map, Collection<? extends K> keys, V value)
+  {
+    boolean result = false;
+    for (K key : keys)
+    {
+      if (add(map, key, value))
+      {
+        result = true;
+      }
+    }
+
+    return result;
+  }
+
+  /**
+   * @since 3.9
+   */
+  public static <K, V> boolean addAll(Map<K, Set<V>> map, Map<? extends K, ? extends Collection<? extends V>> map2)
+  {
+    boolean result = false;
+    for (Map.Entry<? extends K, ? extends Collection<? extends V>> entry : map2.entrySet())
+    {
+      if (addAll(map, entry.getKey(), entry.getValue()))
+      {
+        result = true;
+      }
+    }
+
+    return result;
+  }
+
+  /**
+   * @since 3.9
+   */
+  public static <K, V> boolean putAll(Map<K, Set<V>> map, Map<? extends K, ? extends V> map2)
+  {
+    boolean result = false;
+    for (Map.Entry<? extends K, ? extends V> entry : map2.entrySet())
+    {
+      if (add(map, entry.getKey(), entry.getValue()))
+      {
+        result = true;
+      }
+    }
+
+    return result;
+  }
+
   public static <T> Iterator<T> dump(Iterator<T> it)
   {
     List<T> list = new ArrayList<T>();
diff --git a/releng/org.eclipse.emf.cdo.releng.parent/plugins/pom.xml b/releng/org.eclipse.emf.cdo.releng.parent/plugins/pom.xml
index fbc95eb..d3b6bd0 100644
--- a/releng/org.eclipse.emf.cdo.releng.parent/plugins/pom.xml
+++ b/releng/org.eclipse.emf.cdo.releng.parent/plugins/pom.xml
@@ -43,6 +43,7 @@
     <module>../../../plugins/org.eclipse.emf.cdo.doc</module>
     <module>../../../plugins/org.eclipse.emf.cdo.ecore</module>
     <module>../../../plugins/org.eclipse.emf.cdo.edit</module>
+    <module>../../../plugins/org.eclipse.emf.cdo.evolution</module>
     <module>../../../plugins/org.eclipse.emf.cdo.examples</module>
     <module>../../../plugins/org.eclipse.emf.cdo.examples.client</module>
     <module>../../../plugins/org.eclipse.emf.cdo.examples.client.offline</module>
diff --git a/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target b/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
index 79f92be..69e91cc 100644
--- a/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
+++ b/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde version="3.8"?>
-<target name="Generated from CDO" sequenceNumber="20">
+<target name="Generated from CDO" sequenceNumber="23">
   <locations>
     <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
       <unit id="com.db4o" version="0.0.0"/>
@@ -33,14 +33,15 @@
       <unit id="org.hsqldb" version="0.0.0"/>
       <unit id="org.postgresql" version="0.0.0"/>
       <unit id="org.slf4j.api" version="0.0.0"/>
-      <repository location="http://download.eclipse.org/releases/photon"/>
+      <repository location="http://download.eclipse.org/releases/photon/201806271001"/>
+      <repository location="http://download.eclipse.org/eclipse/updates/4.8"/>
       <repository location="http://download.eclipse.org/tools/orbit/downloads/latest-S"/>
       <repository location="http://download.eclipse.org/modeling/emf/teneo/updates/2.1.0/interim"/>
       <repository location="http://download.eclipse.org/nebula/releases/latest"/>
       <repository location="http://download.oracle.com/otn_software/oepe/12.2.1.3/mars/repository"/>
       <repository location="http://www.elver.org/eclipse/2.1.0/update"/>
       <repository location="http://download.eclipse.org/tools/ajdt/48/dev/update"/>
-      <repository location="http://download.eclipse.org/eclipse/updates/4.8/R-4.8-201806110500"/>
+      <repository location="http://download.eclipse.org/eclipse/updates/4.9-I-builds"/>
     </location>
   </locations>
 </target>