[SCM] eclipse-emf - Plug-in for eclipse - Debian package. branch, upstream, updated. 3aae69010845c9ad17881a978c9bfd2053d0b2c7

Niels Thykier nthykier-guest at alioth.debian.org
Sun Feb 14 16:44:24 UTC 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "eclipse-emf - Plug-in for eclipse - Debian package.".

The branch, upstream has been updated
       via  3aae69010845c9ad17881a978c9bfd2053d0b2c7 (commit)
      from  754caf030d41e60ac8dae7461006ff8fcea89db6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3aae69010845c9ad17881a978c9bfd2053d0b2c7
Author: Niels Thykier <niels at thykier.net>
Date:   Sun Feb 14 17:42:08 2010 +0100

    Imported Upstream version 2.5.0

-----------------------------------------------------------------------

Summary of changes:
 .../.classpath                                     |    0
 .../.cvsignore                                     |    0
 org.eclipse.emf.ecore.change/.project              |   28 +
 .../.settings/org.eclipse.jdt.core.prefs           |    0
 org.eclipse.emf.ecore.change/META-INF/MANIFEST.MF  |   17 +
 .../about.html                                     |    0
 org.eclipse.emf.ecore.change/build.properties      |   12 +
 .../build/files_to_massage.lst                     |    6 +
 org.eclipse.emf.ecore.change/model/Change.ecore    |  111 ++
 .../model/Change.ecorediag                         |  446 ++++++
 org.eclipse.emf.ecore.change/model/Change.genmodel |   78 +
 org.eclipse.emf.ecore.change/model/Change.mdl      |  638 ++++++++
 .../model/org.eclipse.emf.ecore.Change.cat         | 1614 ++++++++++++++++++++
 org.eclipse.emf.ecore.change/plugin.properties     |   21 +
 org.eclipse.emf.ecore.change/plugin.xml            |    7 +
 .../emf/ecore/change/ChangeDescription.java        |  115 ++
 .../eclipse/emf/ecore/change/ChangeFactory.java    |  108 ++
 .../org/eclipse/emf/ecore/change/ChangeKind.java   |  253 +++
 .../eclipse/emf/ecore/change/ChangePackage.java    | 1207 +++++++++++++++
 .../org/eclipse/emf/ecore/change/ChangePlugin.java |  107 ++
 .../eclipse/emf/ecore/change/FeatureChange.java    |  253 +++
 .../eclipse/emf/ecore/change/FeatureMapEntry.java  |  197 +++
 .../org/eclipse/emf/ecore/change/ListChange.java   |  206 +++
 .../eclipse/emf/ecore/change/ResourceChange.java   |  127 ++
 .../emf/ecore/change/doc-files/ChangeAPI.gif       |  Bin 0 -> 13569 bytes
 .../ecore/change/impl/ChangeDescriptionImpl.java   |  718 +++++++++
 .../emf/ecore/change/impl/ChangeFactoryImpl.java   |  268 ++++
 .../emf/ecore/change/impl/ChangePackageImpl.java   |  768 ++++++++++
 .../change/impl/EObjectToChangesMapEntryImpl.java  |  375 +++++
 .../emf/ecore/change/impl/FeatureChangeImpl.java   |  806 ++++++++++
 .../emf/ecore/change/impl/FeatureMapEntryImpl.java |  561 +++++++
 .../emf/ecore/change/impl/ListChangeImpl.java      |  734 +++++++++
 .../emf/ecore/change/impl/ResourceChangeImpl.java  |  430 ++++++
 .../org/eclipse/emf/ecore/change/impl/package.html |   31 +
 .../src/org/eclipse/emf/ecore/change/package.html  |   39 +
 .../emf/ecore/change/util/BasicChangeRecorder.java |  269 ++++
 .../ecore/change/util/ChangeAdapterFactory.java    |  247 +++
 .../emf/ecore/change/util/ChangeRecorder.java      |  645 ++++++++
 .../emf/ecore/change/util/ChangeSwitch.java        |  269 ++++
 .../ecore/change/util/ListDifferenceAnalyzer.java  |  175 +++
 .../org/eclipse/emf/ecore/change/util/package.html |   31 +
 41 files changed, 11917 insertions(+), 0 deletions(-)

diff --git a/org.eclipse.emf.cheatsheets/.classpath b/org.eclipse.emf.ecore.change/.classpath
similarity index 100%
copy from org.eclipse.emf.cheatsheets/.classpath
copy to org.eclipse.emf.ecore.change/.classpath
diff --git a/org.eclipse.emf.codegen.ecore/.cvsignore b/org.eclipse.emf.ecore.change/.cvsignore
similarity index 100%
copy from org.eclipse.emf.codegen.ecore/.cvsignore
copy to org.eclipse.emf.ecore.change/.cvsignore
diff --git a/org.eclipse.emf.ecore.change/.project b/org.eclipse.emf.ecore.change/.project
new file mode 100644
index 0000000..b95afc1
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.ecore.change</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.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.emf.ant/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.emf.ecore.change/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
copy from org.eclipse.emf.ant/.settings/org.eclipse.jdt.core.prefs
copy to org.eclipse.emf.ecore.change/.settings/org.eclipse.jdt.core.prefs
diff --git a/org.eclipse.emf.ecore.change/META-INF/MANIFEST.MF b/org.eclipse.emf.ecore.change/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0324c3e
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.emf.ecore.change; singleton:=true
+Bundle-Version: 2.5.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.emf.ecore.change.ChangePlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.emf.ecore.change,
+ org.eclipse.emf.ecore.change.impl,
+ org.eclipse.emf.ecore.change.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport
+Eclipse-LazyStart: true
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.emf.activities/about.html b/org.eclipse.emf.ecore.change/about.html
similarity index 100%
copy from org.eclipse.emf.activities/about.html
copy to org.eclipse.emf.ecore.change/about.html
diff --git a/org.eclipse.emf.ecore.change/build.properties b/org.eclipse.emf.ecore.change/build.properties
new file mode 100644
index 0000000..95a8423
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/build.properties
@@ -0,0 +1,12 @@
+bin.includes = plugin.properties,\
+               .,\
+               plugin.xml,\
+               about.html,\
+               model/,\
+               META-INF/
+bin.excludes = model/*.ecorediag
+src.includes = about.html,\
+               model/*.ecorediag
+source.. = src/
+output.. = bin/
+exclude.. = **/doc-files/**
diff --git a/org.eclipse.emf.ecore.change/build/files_to_massage.lst b/org.eclipse.emf.ecore.change/build/files_to_massage.lst
new file mode 100644
index 0000000..32e0e66
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/build/files_to_massage.lst
@@ -0,0 +1,6 @@
+# This is a list of files in this plugin (relative to the plugin)
+# that contains names of plugins (e.g. org.eclipse.emf.mapping) which need
+# to be appended with version number (e.g. org.eclipse.emf.mapping_1.0.1)
+# during packaging.
+
+model/Change.mdl
diff --git a/org.eclipse.emf.ecore.change/model/Change.ecore b/org.eclipse.emf.ecore.change/model/Change.ecore
new file mode 100644
index 0000000..1dd5a8a
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/model/Change.ecore
@@ -0,0 +1,111 @@
+<?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="change"
+    nsURI="http://www.eclipse.org/emf/2003/Change" nsPrefix="change">
+  <eClassifiers xsi:type="ecore:EClass" name="ChangeDescription">
+    <eOperations name="apply"/>
+    <eOperations name="applyAndReverse"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="objectChanges" upperBound="-1"
+        eType="#//EObjectToChangesMapEntry" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="objectsToDetach" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"
+        transient="true" derived="true" resolveProxies="false"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="objectsToAttach" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"
+        containment="true" resolveProxies="false"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceChanges" upperBound="-1"
+        eType="#//ResourceChange" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="EObjectToChangesMapEntry" instanceClassName="java.util.Map$Entry">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="key" lowerBound="1" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
+        eType="#//FeatureChange" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureChange">
+    <eOperations name="apply">
+      <eParameters name="originalObject" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+    </eOperations>
+    <eOperations name="applyAndReverse">
+      <eParameters name="originalObject" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="featureName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        volatile="true" unsettable="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dataValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        volatile="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="set" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+        defaultValueLiteral="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EJavaObject"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="feature" lowerBound="1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature"
+        volatile="true" unsettable="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceValue" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"
+        volatile="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="listChanges" upperBound="-1"
+        eType="#//ListChange" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ListChange">
+    <eOperations name="apply">
+      <eParameters name="originalList">
+        <eGenericType eClassifier="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EEList">
+          <eTypeArguments eClassifier="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eOperations name="applyAndReverse">
+      <eParameters name="originalList">
+        <eGenericType eClassifier="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EEList">
+          <eTypeArguments eClassifier="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ChangeKind"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dataValues" unique="false"
+        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="index" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
+        defaultValueLiteral="-1"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveToIndex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="values" upperBound="-1"
+        eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EJavaObject"
+        volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceValues" upperBound="-1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="feature" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="featureMapEntryValues"
+        upperBound="-1" eType="#//FeatureMapEntry" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="ChangeKind">
+    <eLiterals name="ADD"/>
+    <eLiterals name="REMOVE" value="1"/>
+    <eLiterals name="MOVE" value="2"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ResourceChange">
+    <eOperations name="apply"/>
+    <eOperations name="applyAndReverse"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceURI" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resource" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EResource"
+        transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" changeable="false"
+        volatile="true" transient="true" derived="true">
+      <eGenericType eClassifier="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EEList">
+        <eTypeArguments/>
+      </eGenericType>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="listChanges" upperBound="-1"
+        eType="#//ListChange" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FeatureMapEntry">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="featureName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        volatile="true" unsettable="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dataValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        volatile="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EJavaObject"
+        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="feature" lowerBound="1"
+        eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature"
+        volatile="true" unsettable="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceValue" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"
+        volatile="true"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/org.eclipse.emf.ecore.change/model/Change.ecorediag b/org.eclipse.emf.ecore.change/model/Change.ecorediag
new file mode 100644
index 0000000..541b7c3
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/model/Change.ecorediag
@@ -0,0 +1,446 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.1/notation" xmi:id="_MfXZQG02Ed2oWYT3SkUO8w" type="EcoreTools" measurementUnit="Pixel">
+  <children xmi:type="notation:Node" xmi:id="_ModD0G02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_ModD0202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_ModD1G02Ed2oWYT3SkUO8w" type="5001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_ModD1W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_ModD1m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_ModD1202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_ModD2G02Ed2oWYT3SkUO8w" type="5002">
+      <children xmi:type="notation:Node" xmi:id="_Mov-wG02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ChangeDescription/apply"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-wW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-wm02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ChangeDescription/applyAndReverse"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-w202Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_ModD2W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_ModD2m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_ModD2202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_ModD0W02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//ChangeDescription"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ModD0m02Ed2oWYT3SkUO8w" x="216" y="12"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Mov-xG02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_Mov-x202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_Mov-yG02Ed2oWYT3SkUO8w" type="5001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-yW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-ym02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-y202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mov-zG02Ed2oWYT3SkUO8w" type="5002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-zW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-zm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-z202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Mov-xW02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//EObjectToChangesMapEntry"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mov-xm02Ed2oWYT3SkUO8w" x="192" y="120"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Mov-0G02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_Mov-0202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_Mov-1G02Ed2oWYT3SkUO8w" type="5001">
+      <children xmi:type="notation:Node" xmi:id="_Mov-3G02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureChange/featureName"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-3W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-3m02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureChange/dataValue"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-3202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-4G02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureChange/set"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-4W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-4m02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureChange/value"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-4202Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-1W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-1m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-1202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mov-2G02Ed2oWYT3SkUO8w" type="5002">
+      <children xmi:type="notation:Node" xmi:id="_Mov-5G02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//FeatureChange/apply"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-5W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-5m02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//FeatureChange/applyAndReverse"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-5202Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-2W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-2m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-2202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Mov-0W02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//FeatureChange"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mov-0m02Ed2oWYT3SkUO8w" x="192" y="204"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Mov-6G02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_Mov-6202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_Mov-7G02Ed2oWYT3SkUO8w" type="5001">
+      <children xmi:type="notation:Node" xmi:id="_Mov-9G02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ListChange/kind"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-9W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-9m02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ListChange/dataValues"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-9202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov--G02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ListChange/index"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov--W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov--m02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ListChange/moveToIndex"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov--202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov-_G02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ListChange/values"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-_W02Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-7W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-7m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-7202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mov-8G02Ed2oWYT3SkUO8w" type="5002">
+      <children xmi:type="notation:Node" xmi:id="_Mov-_m02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ListChange/apply"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov-_202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_Mov_AG02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ListChange/applyAndReverse"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_Mov_AW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Mov-8W02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mov-8m02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mov-8202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Mov-6W02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//ListChange"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mov-6m02Ed2oWYT3SkUO8w" x="144" y="396"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Mo5vwG02Ed2oWYT3SkUO8w" type="1005">
+    <children xmi:type="notation:Node" xmi:id="_MpWbsG02Ed2oWYT3SkUO8w" type="4010"/>
+    <children xmi:type="notation:Node" xmi:id="_MpfloG02Ed2oWYT3SkUO8w" type="5008">
+      <children xmi:type="notation:Node" xmi:id="_MpzHoG02Ed2oWYT3SkUO8w" type="2006">
+        <element xmi:type="ecore:EEnumLiteral" href="Change.ecore#//ChangeKind/ADD"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHoW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHom02Ed2oWYT3SkUO8w" type="2006">
+        <element xmi:type="ecore:EEnumLiteral" href="Change.ecore#//ChangeKind/REMOVE"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHo202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHpG02Ed2oWYT3SkUO8w" type="2006">
+        <element xmi:type="ecore:EEnumLiteral" href="Change.ecore#//ChangeKind/MOVE"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHpW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MpfloW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mpflom02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mpflo202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Mo5vwW02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="8047085" lineColor="0"/>
+    <element xmi:type="ecore:EEnum" href="Change.ecore#//ChangeKind"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mo5vwm02Ed2oWYT3SkUO8w" x="12" y="447"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_MpzHpm02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_MpzHqW02Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_MpzHqm02Ed2oWYT3SkUO8w" type="5001">
+      <children xmi:type="notation:Node" xmi:id="_MpzHsm02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ResourceChange/resourceURI"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHs202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHtG02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ResourceChange/resource"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHtW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHtm02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//ResourceChange/value"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHt202Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MpzHq202Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MpzHrG02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MpzHrW02Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_MpzHrm02Ed2oWYT3SkUO8w" type="5002">
+      <children xmi:type="notation:Node" xmi:id="_MpzHuG02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ResourceChange/apply"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHuW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHum02Ed2oWYT3SkUO8w" type="2002">
+        <element xmi:type="ecore:EOperation" href="Change.ecore#//ResourceChange/applyAndReverse"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHu202Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MpzHr202Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MpzHsG02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MpzHsW02Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_MpzHp202Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//ResourceChange"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MpzHqG02Ed2oWYT3SkUO8w" x="12" y="120"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_MpzHvG02Ed2oWYT3SkUO8w" type="1001">
+    <children xmi:type="notation:Node" xmi:id="_MpzHv202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_MpzHwG02Ed2oWYT3SkUO8w" type="5001">
+      <children xmi:type="notation:Node" xmi:id="_MpzHyG02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureMapEntry/featureName"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHyW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHym02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureMapEntry/dataValue"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHy202Ed2oWYT3SkUO8w"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_MpzHzG02Ed2oWYT3SkUO8w" type="2001">
+        <element xmi:type="ecore:EAttribute" href="Change.ecore#//FeatureMapEntry/value"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_MpzHzW02Ed2oWYT3SkUO8w"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MpzHwW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MpzHwm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MpzHw202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_MpzHxG02Ed2oWYT3SkUO8w" type="5002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MpzHxW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MpzHxm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MpzHx202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_MpzHvW02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="Change.ecore#//FeatureMapEntry"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MpzHvm02Ed2oWYT3SkUO8w" x="468" y="396"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_St0fkG02Ed2oWYT3SkUO8w" type="1001">
+    <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_SvKjYG02Ed2oWYT3SkUO8w" source="Shortcut">
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_SvKjYW02Ed2oWYT3SkUO8w" key="modelID" value="EcoreTools"/>
+    </eAnnotations>
+    <children xmi:type="notation:Node" xmi:id="_Sua8gG02Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_Sua8gW02Ed2oWYT3SkUO8w" visible="false" type="5001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Sua8gm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Sua8g202Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Sua8hG02Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Sua8hW02Ed2oWYT3SkUO8w" visible="false" type="5002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Sua8hm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Sua8h202Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Sua8iG02Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_St0fkW02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="platform:/resource/org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_St0fkm02Ed2oWYT3SkUO8w" x="540" y="144"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_TNQ0oG02Ed2oWYT3SkUO8w" type="1001">
+    <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_TNalsm02Ed2oWYT3SkUO8w" source="Shortcut">
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_TNals202Ed2oWYT3SkUO8w" key="modelID" value="EcoreTools"/>
+    </eAnnotations>
+    <children xmi:type="notation:Node" xmi:id="_TNQ0o202Ed2oWYT3SkUO8w" type="4001"/>
+    <children xmi:type="notation:Node" xmi:id="_TNQ0pG02Ed2oWYT3SkUO8w" visible="false" type="5001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_TNQ0pW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_TNQ0pm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_TNQ0p202Ed2oWYT3SkUO8w"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_TNQ0qG02Ed2oWYT3SkUO8w" visible="false" type="5002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_TNQ0qW02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_TNQ0qm02Ed2oWYT3SkUO8w"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_TNQ0q202Ed2oWYT3SkUO8w"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_TNQ0oW02Ed2oWYT3SkUO8w" fontHeight="10" fillColor="13761016" lineColor="0"/>
+    <element xmi:type="ecore:EClass" href="platform:/resource/org.eclipse.emf.ecore/model/Ecore.ecore#//EStructuralFeature"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TNQ0om02Ed2oWYT3SkUO8w" x="432" y="276" width="169"/>
+  </children>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_MfXZQW02Ed2oWYT3SkUO8w"/>
+  <element xmi:type="ecore:EPackage" href="Change.ecore#/"/>
+  <edges xmi:type="notation:Edge" xmi:id="_MqY9gG02Ed2oWYT3SkUO8w" type="3002" source="_ModD0G02Ed2oWYT3SkUO8w" target="_Mov-xG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiugG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiugW02Ed2oWYT3SkUO8w" x="-10" y="-49"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiugm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqiug202Ed2oWYT3SkUO8w" x="-9" y="18"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqY9gW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_MqY9gm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ChangeDescription/objectChanges"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_MqY9g202Ed2oWYT3SkUO8w" points="[26, 63, -6, -85]$[26, 108, -6, -40]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGEm02Ed2oWYT3SkUO8w" id="(0.24817519,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGE202Ed2oWYT3SkUO8w" id="(0.5,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_MqiuhG02Ed2oWYT3SkUO8w" type="3002" source="_ModD0G02Ed2oWYT3SkUO8w" target="_MpzHpm02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiuiG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiuiW02Ed2oWYT3SkUO8w" x="6" y="-56"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiuim02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqiui202Ed2oWYT3SkUO8w" x="6" y="16"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqiuhW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Mqiuhm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ChangeDescription/resourceChanges"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Mqiuh202Ed2oWYT3SkUO8w" points="[-68, 24, 128, -186]$[-212, 24, -16, -186]$[-212, 108, -16, -102]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGGm02Ed2oWYT3SkUO8w" id="(0.49635038,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGG202Ed2oWYT3SkUO8w" id="(0.49673203,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_MqiujG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-xG02Ed2oWYT3SkUO8w" target="_Mov-0G02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiukG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiukW02Ed2oWYT3SkUO8w" x="-9" y="-27"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiukm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqiuk202Ed2oWYT3SkUO8w" x="-9" y="13"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqiujW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Mqiujm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//EObjectToChangesMapEntry/value"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Mqiuj202Ed2oWYT3SkUO8w" points="[-6, 40, -23, -162]$[-6, 84, -23, -118]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGFm02Ed2oWYT3SkUO8w" id="(0.5,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGF202Ed2oWYT3SkUO8w" id="(0.59116024,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_MqiulG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-0G02Ed2oWYT3SkUO8w" target="_Mov-6G02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiumG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiumW02Ed2oWYT3SkUO8w" x="-16" y="-39"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiumm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqium202Ed2oWYT3SkUO8w" x="-16" y="17"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqiulW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Mqiulm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//FeatureChange/listChanges"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Mqiul202Ed2oWYT3SkUO8w" points="[-5, 118, 54, -208]$[-5, 192, 54, -134]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGEG02Ed2oWYT3SkUO8w" id="(0.49723756,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGEW02Ed2oWYT3SkUO8w" id="(0.45882353,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_MqiunG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-6G02Ed2oWYT3SkUO8w" target="_MpzHvG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiuoG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiuoW02Ed2oWYT3SkUO8w" x="-55" y="-16"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiuom02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqiuo202Ed2oWYT3SkUO8w" y="16"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqiunW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Mqiunm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ListChange/featureMapEntryValues"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Mqiun202Ed2oWYT3SkUO8w" points="[85, 72, -232, -7]$[239, 72, -78, -7]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGGG02Ed2oWYT3SkUO8w" id="(0.5,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGGW02Ed2oWYT3SkUO8w" id="(0.4968153,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_MqiupG02Ed2oWYT3SkUO8w" type="3002" source="_MpzHpm02Ed2oWYT3SkUO8w" target="_Mov-6G02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_MqiuqG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_MqiuqW02Ed2oWYT3SkUO8w" x="4" y="-42"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Mqiuqm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Mqiuq202Ed2oWYT3SkUO8w" x="-48" y="-42"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_MqiupW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Mqiupm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ResourceChange/listChanges"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Mqiup202Ed2oWYT3SkUO8w" points="[-16, 102, -228, -308]$[-16, 300, -228, -110]$[56, 300, -156, -110]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGFG02Ed2oWYT3SkUO8w" id="(0.49673203,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGtGFW02Ed2oWYT3SkUO8w" id="(0.91764706,1.0)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VljhsG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-xG02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VljhtG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VljhtW02Ed2oWYT3SkUO8w" x="-10" y="-10"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vljhtm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vljht202Ed2oWYT3SkUO8w" x="-12" y="11"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VljhsW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vljhsm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//EObjectToChangesMapEntry/key"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vljhs202Ed2oWYT3SkUO8w" points="[55, -20, -569, 204]$[469, -168, -155, 56]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VljhuG02Ed2oWYT3SkUO8w" type="3002" source="_MpzHvG02Ed2oWYT3SkUO8w" target="_TNQ0oG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VljhvG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VljhvW02Ed2oWYT3SkUO8w" x="-8" y="-24"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vljhvm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vljhv202Ed2oWYT3SkUO8w" x="-7" y="19"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VljhuW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vljhum02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//FeatureMapEntry/feature"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vljhu202Ed2oWYT3SkUO8w" points="[3, -39, 33, 100]$[3, -119, 33, 20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VljhwG02Ed2oWYT3SkUO8w" type="3002" source="_MpzHvG02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VljhxG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VljhxW02Ed2oWYT3SkUO8w" x="-20" y="-53"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vljhxm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vljhx202Ed2oWYT3SkUO8w" x="-44" y="-25"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VljhwW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vljhwm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//FeatureMapEntry/referenceValue"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vljhw202Ed2oWYT3SkUO8w" points="[66, -39, 22, 232]$[66, -251, 22, 20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VlsroG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-6G02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VlsrpG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VlsrpW02Ed2oWYT3SkUO8w" x="-227" y="-94"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vlsrpm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vlsrp202Ed2oWYT3SkUO8w" x="-227" y="-21"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VlsroW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vlsrom02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ListChange/referenceValues"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vlsro202Ed2oWYT3SkUO8w" points="[85, 62, -276, 361]$[407, 62, 46, 361]$[407, -279, 46, 20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VlsrqG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-6G02Ed2oWYT3SkUO8w" target="_TNQ0oG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VlsrrG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VlsrrW02Ed2oWYT3SkUO8w" x="8" y="-28"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vlsrrm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vlsrr202Ed2oWYT3SkUO8w" x="8" y="19"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VlsrqW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vlsrqm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ListChange/feature"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vlsrq202Ed2oWYT3SkUO8w" points="[85, -43, -202, 124]$[227, -43, -60, 124]$[227, -147, -60, 20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_Vl2coG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-0G02Ed2oWYT3SkUO8w" target="_TNQ0oG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_Vl2cpG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vl2cpW02Ed2oWYT3SkUO8w" x="-19" y="-13"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vl2cpm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vl2cp202Ed2oWYT3SkUO8w" x="-16" y="11"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_Vl2coW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vl2com02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//FeatureChange/feature"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vl2co202Ed2oWYT3SkUO8w" points="[91, 27, -502, -153]$[485, 147, -108, -33]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_Vl2cqG02Ed2oWYT3SkUO8w" type="3002" source="_Mov-0G02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_Vl2crG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vl2crW02Ed2oWYT3SkUO8w" x="-53" y="-15"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Vl2crm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Vl2cr202Ed2oWYT3SkUO8w" x="23" y="-15"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_Vl2cqW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Vl2cqm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//FeatureChange/referenceValue"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vl2cq202Ed2oWYT3SkUO8w" points="[91, -48, -217, 51]$[270, -48, -38, 51]$[270, -79, -38, 20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VmANoG02Ed2oWYT3SkUO8w" type="3002" source="_ModD0G02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VmANpG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VmANpW02Ed2oWYT3SkUO8w" x="3" y="55"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_VmANpm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VmANp202Ed2oWYT3SkUO8w" x="3" y="-17"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VmANoW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_VmANom02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ChangeDescription/objectsToDetach"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VmANo202Ed2oWYT3SkUO8w" points="[69, 17, -237, -104]$[268, 17, -38, -104]$[268, 101, -38, -20]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VmANqG02Ed2oWYT3SkUO8w" type="3002" source="_ModD0G02Ed2oWYT3SkUO8w" target="_St0fkG02Ed2oWYT3SkUO8w">
+    <children xmi:type="notation:Node" xmi:id="_VmANrG02Ed2oWYT3SkUO8w" type="4011">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VmANrW02Ed2oWYT3SkUO8w" x="-61" y="47"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_VmANrm02Ed2oWYT3SkUO8w" type="4012">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VmANr202Ed2oWYT3SkUO8w" x="-36" y="24"/>
+    </children>
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VmANqW02Ed2oWYT3SkUO8w" routing="Rectilinear" lineColor="0"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_VmANqm02Ed2oWYT3SkUO8w" fontHeight="10"/>
+    <element xmi:type="ecore:EReference" href="Change.ecore#//ChangeDescription/objectsToAttach"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VmANq202Ed2oWYT3SkUO8w" points="[69, -7, -237, -128]$[352, -7, 46, -128]$[352, 101, 46, -20]"/>
+  </edges>
+</notation:Diagram>
diff --git a/org.eclipse.emf.ecore.change/model/Change.genmodel b/org.eclipse.emf.ecore.change/model/Change.genmodel
new file mode 100644
index 0000000..0c660ad
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/model/Change.genmodel
@@ -0,0 +1,78 @@
+<?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.ecore.change/src"
+    creationCommands="false" editorDirectory="" modelPluginID="org.eclipse.emf.ecore.change"
+    runtimeJar="true" modelName="Change" modelPluginClass="org.eclipse.emf.ecore.change.ChangePlugin"
+    updateClasspath="false" testsDirectory="" importerID="org.eclipse.emf.importer.rose"
+    complianceLevel="5.0" language="en" usedGenPackages="../../org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore">
+  <foreignModel>Change.mdl</foreignModel>
+  <foreignModel>VABASE_PLUGINS_PATH</foreignModel>
+  <foreignModel>../..</foreignModel>
+  <genPackages prefix="Change" basePackage="org.eclipse.emf.ecore" disposableProviderFactory="true"
+      ecorePackage="Change.ecore#/">
+    <genEnums ecoreEnum="Change.ecore#//ChangeKind">
+      <genEnumLiterals ecoreEnumLiteral="Change.ecore#//ChangeKind/ADD"/>
+      <genEnumLiterals ecoreEnumLiteral="Change.ecore#//ChangeKind/REMOVE"/>
+      <genEnumLiterals ecoreEnumLiteral="Change.ecore#//ChangeKind/MOVE"/>
+    </genEnums>
+    <genClasses ecoreClass="Change.ecore#//ChangeDescription">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//ChangeDescription/objectChanges"/>
+      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//ChangeDescription/objectsToDetach"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//ChangeDescription/objectsToAttach"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//ChangeDescription/resourceChanges"/>
+      <genOperations ecoreOperation="Change.ecore#//ChangeDescription/apply"/>
+      <genOperations ecoreOperation="Change.ecore#//ChangeDescription/applyAndReverse"/>
+    </genClasses>
+    <genClasses ecoreClass="Change.ecore#//EObjectToChangesMapEntry">
+      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//EObjectToChangesMapEntry/key"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//EObjectToChangesMapEntry/value"/>
+    </genClasses>
+    <genClasses ecoreClass="Change.ecore#//FeatureChange">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureChange/featureName"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureChange/dataValue"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureChange/set"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureChange/value"/>
+      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//FeatureChange/feature"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//FeatureChange/referenceValue"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//FeatureChange/listChanges"/>
+      <genOperations ecoreOperation="Change.ecore#//FeatureChange/apply">
+        <genParameters ecoreParameter="Change.ecore#//FeatureChange/apply/originalObject"/>
+      </genOperations>
+      <genOperations ecoreOperation="Change.ecore#//FeatureChange/applyAndReverse">
+        <genParameters ecoreParameter="Change.ecore#//FeatureChange/applyAndReverse/originalObject"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="Change.ecore#//ListChange">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ListChange/kind"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ListChange/dataValues"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ListChange/index"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ListChange/moveToIndex"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ListChange/values"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//ListChange/referenceValues"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//ListChange/feature"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//ListChange/featureMapEntryValues"/>
+      <genOperations ecoreOperation="Change.ecore#//ListChange/apply">
+        <genParameters ecoreParameter="Change.ecore#//ListChange/apply/originalList"/>
+      </genOperations>
+      <genOperations ecoreOperation="Change.ecore#//ListChange/applyAndReverse">
+        <genParameters ecoreParameter="Change.ecore#//ListChange/applyAndReverse/originalList"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="Change.ecore#//ResourceChange">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ResourceChange/resourceURI"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ResourceChange/resource"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//ResourceChange/value"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Change.ecore#//ResourceChange/listChanges"/>
+      <genOperations ecoreOperation="Change.ecore#//ResourceChange/apply"/>
+      <genOperations ecoreOperation="Change.ecore#//ResourceChange/applyAndReverse"/>
+    </genClasses>
+    <genClasses ecoreClass="Change.ecore#//FeatureMapEntry">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureMapEntry/featureName"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureMapEntry/dataValue"/>
+      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute Change.ecore#//FeatureMapEntry/value"/>
+      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//FeatureMapEntry/feature"/>
+      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference Change.ecore#//FeatureMapEntry/referenceValue"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/org.eclipse.emf.ecore.change/model/Change.mdl b/org.eclipse.emf.ecore.change/model/Change.mdl
new file mode 100644
index 0000000..b735b6b
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/model/Change.mdl
@@ -0,0 +1,638 @@
+
+(object Petal
+    version    	42
+    _written   	"Rose 4.5.8163.3"
+    charSet    	0)
+
+(object Design "Logical View"
+    is_unit    	TRUE
+    is_loaded  	TRUE
+    defaults   	(object defaults
+	rightMargin 	0.250000
+	leftMargin 	0.250000
+	topMargin  	0.250000
+	bottomMargin 	0.500000
+	pageOverlap 	0.250000
+	clipIconLabels 	TRUE
+	autoResize 	FALSE
+	snapToGrid 	TRUE
+	gridX      	16
+	gridY      	16
+	defaultFont 	(object Font
+	    size       	10
+	    face       	"Arial"
+	    bold       	FALSE
+	    italics    	FALSE
+	    underline  	FALSE
+	    strike     	FALSE
+	    color      	0
+	    default_color 	TRUE)
+	showMessageNum 	1
+	showClassOfObject 	TRUE
+	notation   	"Unified")
+    root_usecase_package 	(object Class_Category "Use Case View"
+	quid       	"3FAA8E8700BE"
+	exportControl 	"Public"
+	global     	TRUE
+	logical_models 	(list unit_reference_list)
+	logical_presentations 	(list unit_reference_list
+	    (object UseCaseDiagram "Main"
+		quid       	"3FAA8E8700EF"
+		title      	"Main"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list))))
+    root_category 	(object Class_Category "Logical View"
+	quid       	"3FAA8E8700BD"
+	exportControl 	"Public"
+	global     	TRUE
+	subsystem  	"Component View"
+	quidu      	"3FAA8E8700BF"
+	logical_models 	(list unit_reference_list
+	    (object Class_Category "change"
+		is_unit    	TRUE
+		is_loaded  	FALSE
+		file_name  	"$VABASE_PLUGINS_PATH\\org.eclipse.emf.ecore.change\\model\\org.eclipse.emf.ecore.Change.cat"
+		quid       	"4FAA8E8B0306")
+	    (object Class_Category "ecore"
+		is_unit    	TRUE
+		is_loaded  	FALSE
+		file_name  	"$VABASE_PLUGINS_PATH\\org.eclipse.emf.ecore\\model\\org.eclipse.emf.Ecore.cat"
+		quid       	"39A5ED04004E"))
+	logical_presentations 	(list unit_reference_list
+	    (object ClassDiagram "Main"
+		quid       	"3FAA8E8700D0"
+		title      	"Main"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list
+		    (object CategoryView "Logical View::ecore" @1
+			location   	(1200, 432)
+			label      	(object ItemLabel
+			    Parent_View 	@1
+			    location   	(1056, 348)
+			    fill_color 	13434879
+			    nlines     	2
+			    max_width  	288
+			    justify    	0
+			    label      	"ecore")
+			icon_style 	"Icon"
+			line_color 	3342489
+			fill_color 	13434879
+			quidu      	"39A5ED04004E"
+			width      	300
+			height     	180)
+		    (object CategoryView "Logical View::change" @2
+			location   	(592, 432)
+			label      	(object ItemLabel
+			    Parent_View 	@2
+			    location   	(448, 348)
+			    fill_color 	13434879
+			    nlines     	2
+			    max_width  	288
+			    justify    	0
+			    label      	"change")
+			icon_style 	"Icon"
+			line_color 	3342489
+			fill_color 	13434879
+			quidu      	"4FAA8E8B0306"
+			width      	300
+			height     	180)))))
+    root_subsystem 	(object SubSystem "Component View"
+	quid       	"3FAA8E8700BF"
+	physical_models 	(list unit_reference_list)
+	physical_presentations 	(list unit_reference_list
+	    (object Module_Diagram "Main"
+		quid       	"3FAA8E8700EE"
+		title      	"Main"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list))))
+    process_structure 	(object Processes
+	quid       	"3FAA8E8700C0"
+	ProcsNDevs 	(list
+	    (object Process_Diagram "Deployment View"
+		quid       	"3FAA8E8700C2"
+		title      	"Deployment View"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list))))
+    properties 	(object Properties
+	attributes 	(list Attribute_Set
+	    (object Attribute
+		tool       	"DDL"
+		name       	"propertyId"
+		value      	"809135966")
+	    (object Attribute
+		tool       	"DDL"
+		name       	"default__Project"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"DDL"
+			name       	"Directory"
+			value      	"AUTO GENERATE")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"DataBase"
+			value      	("DataBaseSet" 800))
+		    (object Attribute
+			tool       	"DDL"
+			name       	"DataBaseSet"
+			value      	(list Attribute_Set
+			    (object Attribute
+				tool       	"DDL"
+				name       	"ANSI"
+				value      	800)
+			    (object Attribute
+				tool       	"DDL"
+				name       	"Oracle"
+				value      	801)
+			    (object Attribute
+				tool       	"DDL"
+				name       	"SQLServer"
+				value      	802)
+			    (object Attribute
+				tool       	"DDL"
+				name       	"Sybase"
+				value      	803)
+			    (object Attribute
+				tool       	"DDL"
+				name       	"Watcom"
+				value      	804)))
+		    (object Attribute
+			tool       	"DDL"
+			name       	"PrimaryKeyColumnName"
+			value      	"Id")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"PrimaryKeyColumnType"
+			value      	"NUMBER(5)")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"ViewName"
+			value      	"V_")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"TableName"
+			value      	"T_")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"InheritSuffix"
+			value      	"_V")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"DropClause"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"BaseViews"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"DDLScriptFilename"
+			value      	"DDL1.SQL")))
+	    (object Attribute
+		tool       	"DDL"
+		name       	"default__Attribute"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"DDL"
+			name       	"ColumnType"
+			value      	"VARCHAR")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"Length"
+			value      	"")
+		    (object Attribute
+			tool       	"DDL"
+			name       	"NullsOK"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"PrimaryKey"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"Unique"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"CompositeUnique"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"DDL"
+			name       	"CheckConstraint"
+			value      	"")))
+	    (object Attribute
+		tool       	"DDL"
+		name       	"HiddenTool"
+		value      	FALSE)
+	    (object Attribute
+		tool       	"IDL"
+		name       	"propertyId"
+		value      	"809135966")
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Project"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CreateMissingDirectories"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"StopOnError"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"Directory"
+			value      	"AUTO GENERATE")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GeneratePreserveRegions"
+			value      	TRUE)))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Class"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"ImplementationType"
+			value      	"")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"ConstValue"
+			value      	"")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateDefaultSpecifier"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"DefaultSpecifier"
+			value      	"")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IDLElement"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IDLSpecificationType"
+			value      	("IDLSpecSet" 22))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IDLSpecSet"
+			value      	(list Attribute_Set
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Interface"
+				value      	22)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Typedef"
+				value      	54)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Enumeration"
+				value      	8)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Const"
+				value      	71)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Exception"
+				value      	61)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Struct"
+				value      	51)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Union"
+				value      	81)))))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Module-Spec"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"Generate"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CmIdentification"
+			value      	(value Text "  %X%  @(#) plugins/org.eclipse.emf.ecore.change/model/Change.mdl, emf.ecore.change, org.eclipse.dev"))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CopyrightNotice"
+			value      	(value Text ""))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"FileName"
+			value      	"AUTO GENERATE")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateIDLModule"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"InclusionProtectionSymbol"
+			value      	"AUTO GENERATE")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"AdditionalIncludes"
+			value      	(value Text ""))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IncludeBySimpleName"
+			value      	FALSE)))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Module-Body"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CmIdentification"
+			value      	(value Text "  %X%  @(#) plugins/org.eclipse.emf.ecore.change/model/Change.mdl, emf.ecore.change, org.eclipse.dev"))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CopyrightNotice"
+			value      	(value Text ""))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"FileName"
+			value      	"AUTO GENERATE")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"AdditionalIncludes"
+			value      	(value Text ""))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IncludeBySimpleName"
+			value      	FALSE)))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Operation"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"OperationIsOneWay"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"Context"
+			value      	"")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"Raises"
+			value      	"")))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Attribute"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"CaseSpecifier"
+			value      	"")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateDataMember"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"DataMemberName"
+			value      	"$relationship")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IsReadOnly"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IsConst"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"ConstValue"
+			value      	"")))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Has"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"NameIfUnlabeled"
+			value      	"the_$supplier")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateDataMember"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"DataMemberName"
+			value      	"$relationship")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateForwardReference"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IsReadOnly"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"BoundedHasRelType"
+			value      	("HasRelTypeSet" 47))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"HasRelTypeSet"
+			value      	(list Attribute_Set
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Array"
+				value      	24)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Sequence"
+				value      	47)))))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Role"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"NameIfUnlabeled"
+			value      	"the_$supplier")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateDataMember"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"DataMemberName"
+			value      	"$relationship")
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateForwardReference"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"IsReadOnly"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"IDL"
+			name       	"BoundedRoleType"
+			value      	("AssocTypeSet" 47))
+		    (object Attribute
+			tool       	"IDL"
+			name       	"AssocTypeSet"
+			value      	(list Attribute_Set
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Array"
+				value      	24)
+			    (object Attribute
+				tool       	"IDL"
+				name       	"Sequence"
+				value      	47)))))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Uses"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"GenerateForwardReference"
+			value      	FALSE)))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"default__Subsystem"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"IDL"
+			name       	"Directory"
+			value      	"AUTO GENERATE")))
+	    (object Attribute
+		tool       	"IDL"
+		name       	"HiddenTool"
+		value      	FALSE)
+	    (object Attribute
+		tool       	"SCC"
+		name       	"HiddenTool"
+		value      	FALSE)
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"propertyId"
+		value      	"809135969")
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"default__Category"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"packageName"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"nsPrefix"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"nsURI"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"basePackage"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"prefix"
+			value      	"")))
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"default__Class"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"classifierName"
+			value      	"")))
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"default__Operation"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"operationName"
+			value      	"")))
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"default__Attribute"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"attributeName"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isTransient"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isVolatile"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isChangeable"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isUnsettable"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isUnique"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isID"
+			value      	FALSE)))
+	    (object Attribute
+		tool       	"Ecore"
+		name       	"default__Role"
+		value      	(list Attribute_Set
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"referenceName"
+			value      	"")
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isTransient"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isVolatile"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isChangeable"
+			value      	TRUE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isUnsettable"
+			value      	FALSE)
+		    (object Attribute
+			tool       	"Ecore"
+			name       	"isResolveProxies"
+			value      	TRUE))))
+	quid       	"3FAA8E8700C1"))
diff --git a/org.eclipse.emf.ecore.change/model/org.eclipse.emf.ecore.Change.cat b/org.eclipse.emf.ecore.change/model/org.eclipse.emf.ecore.Change.cat
new file mode 100644
index 0000000..e3a54dd
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/model/org.eclipse.emf.ecore.Change.cat
@@ -0,0 +1,1614 @@
+
+(object Petal
+    version    	42
+    _written   	"Rose 4.5.8163.3"
+    charSet    	0)
+
+(object Class_Category "change"
+    is_unit    	TRUE
+    is_loaded  	TRUE
+    attributes 	(list Attribute_Set
+	(object Attribute
+	    tool       	"Ecore"
+	    name       	"nsPrefix"
+	    value      	"change")
+	(object Attribute
+	    tool       	"Ecore"
+	    name       	"nsURI"
+	    value      	"http://www.eclipse.org/emf/2003/Change")
+	(object Attribute
+	    tool       	"Ecore"
+	    name       	"basePackage"
+	    value      	"org.eclipse.emf.ecore")
+	(object Attribute
+	    tool       	"Ecore"
+	    name       	"prefix"
+	    value      	"Change"))
+    quid       	"4FAA8E8B0306"
+    exportControl 	"Public"
+    logical_models 	(list unit_reference_list
+	(object Class "ChangeDescription"
+	    quid       	"4FAB6F110198"
+	    operations 	(list Operations
+		(object Operation "apply"
+		    quid       	"3FD0B060005D"
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0)
+		(object Operation "applyAndReverse"
+		    quid       	"40351FD8025A"
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0)))
+	(object Class "EObjectToChangesMapEntry"
+	    quid       	"4FAD15770120"
+	    stereotype 	"MapEntry")
+	(object Class "FeatureChange"
+	    quid       	"4FC39D6D0177"
+	    operations 	(list Operations
+		(object Operation "apply"
+		    quid       	"4FC3A73B034D"
+		    parameters 	(list Parameters
+			(object Parameter "originalObject"
+			    type       	"EObject"))
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0)
+		(object Operation "applyAndReverse"
+		    quid       	"40368EBA005F"
+		    parameters 	(list Parameters
+			(object Parameter "originalObject"
+			    type       	"EObject"))
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0))
+	    class_attributes 	(list class_attribute_list
+		(object ClassAttribute "featureName"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isUnsettable"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"4FC39D770316"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "dataValue"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"4FC3D98B0072"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "set"
+		    quid       	"4FC4C6CA0314"
+		    type       	"boolean"
+		    initv      	"true"
+		    exportControl 	"Public")
+		(object ClassAttribute "value"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isChangeable"
+			    value      	FALSE))
+		    quid       	"3FDEF82800D5"
+		    type       	"EJavaObject"
+		    exportControl 	"Public"
+		    derived    	TRUE)))
+	(object Class "ListChange"
+	    quid       	"4FC3AC580114"
+	    operations 	(list Operations
+		(object Operation "apply"
+		    quid       	"4FC3AE2D00F1"
+		    parameters 	(list Parameters
+			(object Parameter "originalList"
+			    type       	"EEList<EJavaObject>"))
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0)
+		(object Operation "applyAndReverse"
+		    quid       	"40368EEF0213"
+		    parameters 	(list Parameters
+			(object Parameter "originalList"
+			    type       	"EEList<EJavaObject>"))
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0))
+	    class_attributes 	(list class_attribute_list
+		(object ClassAttribute "kind"
+		    quid       	"4FC3AFCB0010"
+		    type       	"ChangeKind"
+		    exportControl 	"Public")
+		(object ClassAttribute "dataValues"
+		    attributes 	(list Attribute_Set)
+		    quid       	"4FC3DA6703C2"
+		    stereotype 	"0..*"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "index"
+		    quid       	"4FC3B07402B2"
+		    type       	"int"
+		    initv      	"-1"
+		    exportControl 	"Public")
+		(object ClassAttribute "moveToIndex"
+		    quid       	"4FC3B0970095"
+		    type       	"int"
+		    exportControl 	"Public")
+		(object ClassAttribute "values"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"3FDF44C7002F"
+		    stereotype 	"0..*"
+		    type       	"EJavaObject"
+		    exportControl 	"Public"
+		    derived    	TRUE)))
+	(object Class "ChangeKind"
+	    quid       	"4FC3B0190365"
+	    stereotype 	"enumeration"
+	    class_attributes 	(list class_attribute_list
+		(object ClassAttribute "ADD"
+		    quid       	"4FC3B03802F1"
+		    exportControl 	"Public")
+		(object ClassAttribute "REMOVE"
+		    quid       	"4FC3B04902A6"
+		    exportControl 	"Public")
+		(object ClassAttribute "MOVE"
+		    quid       	"4FC3B04C0156"
+		    exportControl 	"Public")))
+	(object Class "ResourceChange"
+	    quid       	"40351FED0214"
+	    operations 	(list Operations
+		(object Operation "apply"
+		    quid       	"40362BBC0249"
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0)
+		(object Operation "applyAndReverse"
+		    quid       	"40368F1603B4"
+		    concurrency 	"Sequential"
+		    opExportControl 	"Public"
+		    uid        	0))
+	    class_attributes 	(list class_attribute_list
+		(object ClassAttribute "resourceURI"
+		    quid       	"40351FF9013F"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "resource"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE))
+		    quid       	"4036404403BA"
+		    type       	"EResource"
+		    exportControl 	"Public"
+		    derived    	TRUE)
+		(object ClassAttribute "value"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isChangeable"
+			    value      	FALSE))
+		    quid       	"40353363034E"
+		    type       	"EEList<?>"
+		    exportControl 	"Public"
+		    derived    	TRUE)))
+	(object Class "FeatureMapEntry"
+	    quid       	"426F82D30210"
+	    class_attributes 	(list class_attribute_list
+		(object ClassAttribute "featureName"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isUnsettable"
+			    value      	TRUE))
+		    quid       	"426F82DE0216"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "dataValue"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"426F82E3010E"
+		    type       	"String"
+		    exportControl 	"Public")
+		(object ClassAttribute "value"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isChangeable"
+			    value      	FALSE))
+		    quid       	"426F82E700D8"
+		    type       	"EJavaObject"
+		    exportControl 	"Public"
+		    derived    	TRUE)))
+	(object Association "$UNNAMED$0"
+	    quid       	"4FAD034903D3"
+	    roles      	(list role_list
+		(object Role "changeSummary"
+		    quid       	"4FAD034A033E"
+		    label      	"changeSummary"
+		    supplier   	"Logical View::change::ChangeDescription"
+		    quidu      	"4FAB6F110198"
+		    is_aggregate 	TRUE)
+		(object Role "objectChanges"
+		    quid       	"4FAD034A0348"
+		    label      	"objectChanges"
+		    supplier   	"Logical View::change::EObjectToChangesMapEntry"
+		    quidu      	"4FAD15770120"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$1"
+	    quid       	"4FAD03BD02DF"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$2"
+		    quid       	"4FAD03BE01C8"
+		    supplier   	"Logical View::change::ChangeDescription"
+		    quidu      	"4FAB6F110198")
+		(object Role "objectsToDetach"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isResolveProxies"
+			    value      	FALSE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isTransient"
+			    value      	TRUE))
+		    quid       	"4FAD03BE01C9"
+		    label      	"objectsToDetach"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "0..n")
+		    is_navigable 	TRUE))
+	    derived    	TRUE)
+	(object Association "$UNNAMED$3"
+	    quid       	"4FAD04280293"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$4"
+		    quid       	"4FAD04290208"
+		    supplier   	"Logical View::change::EObjectToChangesMapEntry"
+		    quidu      	"4FAD15770120")
+		(object Role "key"
+		    quid       	"4FAD04290209"
+		    label      	"key"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "1")
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$5"
+	    quid       	"4FAD161403E1"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$6"
+		    quid       	"4FAD16160376"
+		    supplier   	"Logical View::change::EObjectToChangesMapEntry"
+		    quidu      	"4FAD15770120"
+		    is_aggregate 	TRUE)
+		(object Role "value"
+		    quid       	"4FAD16160380"
+		    label      	"value"
+		    supplier   	"Logical View::change::FeatureChange"
+		    quidu      	"4FC39D6D0177"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$7"
+	    quid       	"4FAD1D57013C"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$8"
+		    quid       	"4FAD1D5A00FA"
+		    supplier   	"Logical View::change::ChangeDescription"
+		    quidu      	"4FAB6F110198"
+		    is_aggregate 	TRUE)
+		(object Role "objectsToAttach"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isResolveProxies"
+			    value      	FALSE))
+		    quid       	"4FAD1D5A0104"
+		    label      	"objectsToAttach"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$9"
+	    quid       	"4FC39DAE0383"
+	    roles      	(list role_list
+		(object Role "feature"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isUnsettable"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"4FC39DB200B8"
+		    label      	"feature"
+		    supplier   	"Logical View::ecore::EStructuralFeature"
+		    quidu      	"3903D59D0230"
+		    client_cardinality 	(value cardinality "1")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$10"
+		    quid       	"4FC39DB200B9"
+		    supplier   	"Logical View::change::FeatureChange"
+		    quidu      	"4FC39D6D0177")))
+	(object Association "$UNNAMED$11"
+	    quid       	"4FC3AB31020B"
+	    roles      	(list role_list
+		(object Role "referenceValue"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"4FC3AB3202F2"
+		    label      	"referenceValue"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "0..1")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$12"
+		    quid       	"4FC3AB3202FC"
+		    supplier   	"Logical View::change::FeatureChange"
+		    quidu      	"4FC39D6D0177")))
+	(object Association "$UNNAMED$13"
+	    quid       	"4FC3AC8D0139"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$14"
+		    quid       	"4FC3AC8E025D"
+		    supplier   	"Logical View::change::FeatureChange"
+		    quidu      	"4FC39D6D0177"
+		    is_aggregate 	TRUE)
+		(object Role "listChanges"
+		    attributes 	(list Attribute_Set)
+		    quid       	"4FC3AC8E025E"
+		    label      	"listChanges"
+		    supplier   	"Logical View::change::ListChange"
+		    quidu      	"4FC3AC580114"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$15"
+	    quid       	"4FC3B15301CC"
+	    roles      	(list role_list
+		(object Role "referenceValues"
+		    attributes 	(list Attribute_Set)
+		    quid       	"4FC3B15501BB"
+		    label      	"referenceValues"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "0..n")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$16"
+		    quid       	"4FC3B15501C5"
+		    supplier   	"Logical View::change::ListChange"
+		    quidu      	"4FC3AC580114")))
+	(object Association "$UNNAMED$17"
+	    quid       	"4FC7BC400269"
+	    roles      	(list role_list
+		(object Role "feature"
+		    attributes 	(list Attribute_Set)
+		    quid       	"4FC7BC420095"
+		    label      	"feature"
+		    supplier   	"Logical View::ecore::EStructuralFeature"
+		    quidu      	"3903D59D0230"
+		    client_cardinality 	(value cardinality "0..1")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$18"
+		    quid       	"4FC7BC4200B3"
+		    supplier   	"Logical View::change::ListChange"
+		    quidu      	"4FC3AC580114")))
+	(object Association "$UNNAMED$19"
+	    quid       	"4035206F02C5"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$20"
+		    quid       	"403520710051"
+		    supplier   	"Logical View::change::ChangeDescription"
+		    quidu      	"4FAB6F110198"
+		    is_aggregate 	TRUE)
+		(object Role "resourceChanges"
+		    quid       	"403520710052"
+		    label      	"resourceChanges"
+		    supplier   	"Logical View::change::ResourceChange"
+		    quidu      	"40351FED0214"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$21"
+	    quid       	"403520B2027B"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$22"
+		    quid       	"403520B401AC"
+		    supplier   	"Logical View::change::ResourceChange"
+		    quidu      	"40351FED0214"
+		    is_aggregate 	TRUE)
+		(object Role "listChanges"
+		    quid       	"403520B401AD"
+		    label      	"listChanges"
+		    supplier   	"Logical View::change::ListChange"
+		    quidu      	"4FC3AC580114"
+		    client_cardinality 	(value cardinality "0..n")
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$23"
+	    quid       	"426F8309000F"
+	    roles      	(list role_list
+		(object Role "feature"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE)
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isUnsettable"
+			    value      	TRUE))
+		    quid       	"426F830A0255"
+		    label      	"feature"
+		    supplier   	"Logical View::ecore::EStructuralFeature"
+		    quidu      	"3903D59D0230"
+		    client_cardinality 	(value cardinality "1")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$24"
+		    quid       	"426F830A0256"
+		    supplier   	"Logical View::change::FeatureMapEntry"
+		    quidu      	"426F82D30210")))
+	(object Association "$UNNAMED$25"
+	    quid       	"426F8354019D"
+	    roles      	(list role_list
+		(object Role "$UNNAMED$26"
+		    quid       	"426F83550221"
+		    supplier   	"Logical View::change::ListChange"
+		    quidu      	"4FC3AC580114"
+		    is_aggregate 	TRUE)
+		(object Role "featureMapEntryValues"
+		    quid       	"426F83550222"
+		    label      	"featureMapEntryValues"
+		    supplier   	"Logical View::change::FeatureMapEntry"
+		    quidu      	"426F82D30210"
+		    Containment 	"By Value"
+		    is_navigable 	TRUE)))
+	(object Association "$UNNAMED$27"
+	    quid       	"426F83810089"
+	    roles      	(list role_list
+		(object Role "referenceValue"
+		    attributes 	(list Attribute_Set
+			(object Attribute
+			    tool       	"Ecore"
+			    name       	"isVolatile"
+			    value      	TRUE))
+		    quid       	"426F838500C1"
+		    label      	"referenceValue"
+		    supplier   	"Logical View::ecore::EObject"
+		    quidu      	"3C4F1C860123"
+		    client_cardinality 	(value cardinality "0..1")
+		    is_navigable 	TRUE)
+		(object Role "$UNNAMED$28"
+		    quid       	"426F838500C2"
+		    supplier   	"Logical View::change::FeatureMapEntry"
+		    quidu      	"426F82D30210"))))
+    logical_presentations 	(list unit_reference_list
+	(object ClassDiagram "Main"
+	    quid       	"4FB5425600D8"
+	    title      	"Main"
+	    zoom       	100
+	    max_height 	28350
+	    max_width  	21600
+	    origin_x   	0
+	    origin_y   	0
+	    items      	(list diagram_item_list
+		(object ClassView "Class" "Logical View::change::ChangeKind" @1
+		    ShowCompartmentStereotypes 	TRUE
+		    SuppressOperation 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(480, 2320)
+		    label      	(object ItemLabel
+			Parent_View 	@1
+			location   	(317, 2236)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	326
+			justify    	0
+			label      	"ChangeKind")
+		    stereotype 	(object ItemLabel
+			Parent_View 	@1
+			location   	(317, 2186)
+			fill_color 	13434879
+			anchor     	10
+			nlines     	1
+			max_width  	326
+			justify    	0
+			label      	"<<enumeration>>")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"4FC3B0190365"
+		    compartment 	(object Compartment
+			Parent_View 	@1
+			location   	(317, 2296)
+			icon_style 	"Icon"
+			fill_color 	13434879
+			anchor     	2
+			nlines     	3
+			max_width  	237)
+		    width      	344
+		    height     	292
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object ClassView "Class" "Logical View::change::ResourceChange" @2
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(496, 880)
+		    label      	(object ItemLabel
+			Parent_View 	@2
+			location   	(260, 699)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	472
+			justify    	0
+			label      	"ResourceChange")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"40351FED0214"
+		    compartment 	(object Compartment
+			Parent_View 	@2
+			location   	(260, 759)
+			icon_style 	"Icon"
+			fill_color 	13434879
+			anchor     	2
+			nlines     	6
+			max_width  	469)
+		    width      	490
+		    height     	386
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object ClassView "Class" "Logical View::ecore::EStructuralFeature" @3
+		    ShowCompartmentStereotypes 	TRUE
+		    SuppressAttribute 	TRUE
+		    SuppressOperation 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(2240, 1536)
+		    font       	(object Font
+			italics    	TRUE)
+		    label      	(object ItemLabel
+			Parent_View 	@3
+			location   	(2051, 1486)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	378
+			justify    	0
+			label      	"EStructuralFeature")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"3903D59D0230"
+		    width      	396
+		    height     	124
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object ClassView "Class" "Logical View::change::EObjectToChangesMapEntry" @4
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(1296, 768)
+		    label      	(object ItemLabel
+			Parent_View 	@4
+			location   	(1019, 738)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	554
+			justify    	0
+			label      	"EObjectToChangesMapEntry")
+		    stereotype 	(object ItemLabel
+			Parent_View 	@4
+			location   	(1019, 688)
+			fill_color 	13434879
+			anchor     	10
+			nlines     	1
+			max_width  	554
+			justify    	0
+			label      	"<<MapEntry>>")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"4FAD15770120"
+		    width      	572
+		    height     	184
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object ClassView "Class" "Logical View::change::FeatureChange" @5
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    ShowOperationSignature 	TRUE
+		    location   	(1296, 1408)
+		    label      	(object ItemLabel
+			Parent_View 	@5
+			location   	(885, 1202)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	822
+			justify    	0
+			label      	"FeatureChange")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"4FC39D6D0177"
+		    compartment 	(object Compartment
+			Parent_View 	@5
+			location   	(885, 1262)
+			icon_style 	"Icon"
+			fill_color 	13434879
+			anchor     	2
+			nlines     	7
+			max_width  	828)
+		    width      	840
+		    height     	436
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object AssociationViewNew "$UNNAMED$5" @6
+		    location   	(1294, 1025)
+		    stereotype 	TRUE
+		    quidu      	"4FAD161403E1"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$6" @7
+			    Parent_View 	@6
+			    location   	(-82, -687)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD16160376"
+			    client     	@6
+			    supplier   	@4
+			    line_style 	3
+			    origin_attachment 	(1294, 1025)
+			    terminal_attachment 	(1294, 860))
+			(object RoleView "value" @8
+			    Parent_View 	@6
+			    location   	(-82, -687)
+			    label      	(object SegLabel @9
+				Parent_View 	@8
+				location   	(1214, 1080)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	120
+				justify    	0
+				label      	"+value"
+				pctDist    	0.333333
+				height     	81
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD16160380"
+			    client     	@6
+			    supplier   	@5
+			    line_style 	3
+			    origin_attachment 	(1294, 1025)
+			    terminal_attachment 	(1294, 1190)
+			    label      	(object SegLabel @10
+				Parent_View 	@8
+				location   	(1359, 1081)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	70
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.342466
+				height     	65
+				orientation 	0))))
+		(object AssociationViewNew "$UNNAMED$9" @11
+		    location   	(1879, 1534)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4FC39DAE0383"
+		    roleview_list 	(list RoleViews
+			(object RoleView "feature" @12
+			    Parent_View 	@11
+			    location   	(503, -786)
+			    label      	(object SegLabel @13
+				Parent_View 	@12
+				location   	(1912, 1494)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	144
+				justify    	0
+				label      	"+feature"
+				pctDist    	0.202454
+				height     	40
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC39DB200B8"
+			    client     	@11
+			    supplier   	@3
+			    line_style 	3
+			    origin_attachment 	(1879, 1534)
+			    terminal_attachment 	(2042, 1534)
+			    label      	(object SegLabel @14
+				Parent_View 	@12
+				location   	(1970, 1581)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"1"
+				pctDist    	0.558282
+				height     	47
+				orientation 	1))
+			(object RoleView "$UNNAMED$10" @15
+			    Parent_View 	@11
+			    location   	(503, -786)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC39DB200B9"
+			    client     	@11
+			    supplier   	@5
+			    line_style 	3
+			    origin_attachment 	(1879, 1534)
+			    terminal_attachment 	(1716, 1534))))
+		(object ClassView "Class" "Logical View::change::ChangeDescription" @16
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    ShowOperationSignature 	TRUE
+		    location   	(1296, 224)
+		    label      	(object ItemLabel
+			Parent_View 	@16
+			location   	(1101, 118)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	390
+			justify    	0
+			label      	"ChangeDescription")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"4FAB6F110198"
+		    compartment 	(object Compartment
+			Parent_View 	@16
+			location   	(1101, 178)
+			icon_style 	"Icon"
+			fill_color 	16777215
+			anchor     	2
+			nlines     	3
+			max_width  	396)
+		    width      	408
+		    height     	236
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object AssociationViewNew "$UNNAMED$0" @17
+		    location   	(1294, 509)
+		    stereotype 	TRUE
+		    quidu      	"4FAD034903D3"
+		    roleview_list 	(list RoleViews
+			(object RoleView "changeSummary" @18
+			    Parent_View 	@17
+			    location   	(-434, -851)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD034A033E"
+			    client     	@17
+			    supplier   	@16
+			    line_style 	3
+			    origin_attachment 	(1294, 509)
+			    terminal_attachment 	(1294, 342))
+			(object RoleView "objectChanges" @19
+			    Parent_View 	@17
+			    location   	(-434, -851)
+			    label      	(object SegLabel @20
+				Parent_View 	@19
+				location   	(1129, 572)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	300
+				justify    	0
+				label      	"+objectChanges"
+				pctDist    	0.377246
+				height     	165
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD034A0348"
+			    client     	@17
+			    supplier   	@4
+			    line_style 	3
+			    origin_attachment 	(1294, 509)
+			    terminal_attachment 	(1294, 676)
+			    label      	(object SegLabel @21
+				Parent_View 	@19
+				location   	(1355, 573)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	70
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.390244
+				height     	61
+				orientation 	0))))
+		(object AssociationViewNew "$UNNAMED$19" @22
+		    location   	(554, 222)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4035206F02C5"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$20" @23
+			    Parent_View 	@22
+			    location   	(186, -498)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"403520710051"
+			    client     	@22
+			    supplier   	@16
+			    line_style 	3
+			    origin_attachment 	(554, 222)
+			    terminal_attachment 	(1092, 222))
+			(object RoleView "resourceChanges" @24
+			    Parent_View 	@22
+			    location   	(186, -498)
+			    label      	(object SegLabel @25
+				Parent_View 	@24
+				location   	(285, 578)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	348
+				justify    	0
+				label      	"+resourceChanges"
+				pctDist    	0.799242
+				height     	197
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"403520710052"
+			    client     	@22
+			    supplier   	@2
+			    vertices   	(list Points
+				(554, 222)
+				(481, 222)
+				(481, 687))
+			    line_style 	3
+			    origin_attachment 	(554, 222)
+			    terminal_attachment 	(481, 687)
+			    label      	(object SegLabel @26
+				Parent_View 	@24
+				location   	(550, 577)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	112
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.797398
+				height     	69
+				orientation 	0))))
+		(object ClassView "Class" "Logical View::change::ListChange" @27
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    ShowOperationSignature 	TRUE
+		    location   	(1264, 2208)
+		    label      	(object ItemLabel
+			Parent_View 	@27
+			location   	(755, 1977)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	1018
+			justify    	0
+			label      	"ListChange")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"4FC3AC580114"
+		    compartment 	(object Compartment
+			Parent_View 	@27
+			location   	(755, 2037)
+			icon_style 	"Icon"
+			fill_color 	13434879
+			anchor     	2
+			nlines     	8
+			max_width  	1015)
+		    width      	1036
+		    height     	486
+		    annotation 	8
+		    autoResize 	TRUE)
+		(object AssociationViewNew "$UNNAMED$13" @28
+		    location   	(1280, 1795)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4FC3AC8D0139"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$14" @29
+			    Parent_View 	@28
+			    location   	(368, -637)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3AC8E025D"
+			    client     	@28
+			    supplier   	@5
+			    line_style 	0)
+			(object RoleView "listChanges" @30
+			    Parent_View 	@28
+			    location   	(368, -637)
+			    label      	(object SegLabel @31
+				Parent_View 	@30
+				location   	(1138, 1841)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	240
+				justify    	0
+				label      	"+listChanges"
+				pctDist    	0.299363
+				height     	141
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3AC8E025E"
+			    client     	@28
+			    supplier   	@27
+			    line_style 	0
+			    label      	(object SegLabel @32
+				Parent_View 	@30
+				location   	(1346, 1849)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	112
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.303571
+				height     	68
+				orientation 	0))))
+		(object AssociationViewNew "$UNNAMED$17" @33
+		    location   	(2122, 1943)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4FC7BC400269"
+		    roleview_list 	(list RoleViews
+			(object RoleView "feature" @34
+			    Parent_View 	@33
+			    location   	(874, -345)
+			    label      	(object SegLabel @35
+				Parent_View 	@34
+				location   	(2023, 1652)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	144
+				justify    	0
+				label      	"+feature"
+				pctDist    	0.842779
+				height     	100
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC7BC420095"
+			    client     	@33
+			    supplier   	@3
+			    line_style 	3
+			    origin_attachment 	(2122, 1943)
+			    terminal_attachment 	(2122, 1598)
+			    label      	(object SegLabel @36
+				Parent_View 	@34
+				location   	(2062, 1702)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"0..1"
+				pctDist    	0.700422
+				height     	61
+				orientation 	0))
+			(object RoleView "$UNNAMED$18" @37
+			    Parent_View 	@33
+			    location   	(874, -345)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC7BC4200B3"
+			    client     	@33
+			    supplier   	@27
+			    vertices   	(list Points
+				(2122, 1943)
+				(2122, 2003)
+				(1782, 2003))
+			    line_style 	3
+			    origin_attachment 	(2122, 1943)
+			    terminal_attachment 	(1782, 2003))))
+		(object AssociationViewNew "$UNNAMED$21" @38
+		    location   	(459, 1703)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"403520B2027B"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$22" @39
+			    Parent_View 	@38
+			    location   	(-805, -457)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"403520B401AC"
+			    client     	@38
+			    supplier   	@2
+			    line_style 	3
+			    origin_attachment 	(459, 1703)
+			    terminal_attachment 	(459, 1073))
+			(object RoleView "listChanges" @40
+			    Parent_View 	@38
+			    location   	(-805, -457)
+			    label      	(object SegLabel @41
+				Parent_View 	@40
+				location   	(589, 2007)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	240
+				justify    	0
+				label      	"+listChanges"
+				pctDist    	0.752407
+				height     	41
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"403520B401AD"
+			    client     	@38
+			    supplier   	@27
+			    vertices   	(list Points
+				(459, 1703)
+				(459, 2047)
+				(746, 2047))
+			    line_style 	3
+			    origin_attachment 	(459, 1703)
+			    terminal_attachment 	(746, 2047)
+			    label      	(object SegLabel @42
+				Parent_View 	@40
+				location   	(655, 2087)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.856563
+				height     	40
+				orientation 	1))))
+		(object ClassView "Class" "Logical View::ecore::EObject" @43
+		    ShowCompartmentStereotypes 	TRUE
+		    SuppressAttribute 	TRUE
+		    SuppressOperation 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(2448, 752)
+		    label      	(object ItemLabel
+			Parent_View 	@43
+			location   	(2239, 683)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	419
+			justify    	0
+			label      	"EObject")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"3C4F1C860123"
+		    width      	437
+		    height     	162
+		    annotation 	8)
+		(object AssociationViewNew "$UNNAMED$3" @44
+		    location   	(1906, 741)
+		    stereotype 	TRUE
+		    quidu      	"4FAD04280293"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$4" @45
+			    Parent_View 	@44
+			    location   	(1426, -1067)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD04290208"
+			    client     	@44
+			    supplier   	@4
+			    line_style 	3
+			    origin_attachment 	(1906, 741)
+			    terminal_attachment 	(1582, 741))
+			(object RoleView "key" @46
+			    Parent_View 	@44
+			    location   	(1426, -1067)
+			    label      	(object SegLabel @47
+				Parent_View 	@46
+				location   	(2124, 698)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	96
+				justify    	0
+				label      	"+key"
+				pctDist    	0.674923
+				height     	44
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD04290209"
+			    client     	@44
+			    supplier   	@43
+			    line_style 	3
+			    origin_attachment 	(1906, 741)
+			    terminal_attachment 	(2230, 741)
+			    label      	(object SegLabel @48
+				Parent_View 	@46
+				location   	(2156, 790)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"1"
+				pctDist    	0.774081
+				height     	49
+				orientation 	1))))
+		(object AssociationViewNew "$UNNAMED$11" @49
+		    location   	(2236, 1262)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4FC3AB31020B"
+		    roleview_list 	(list RoleViews
+			(object RoleView "referenceValue" @50
+			    Parent_View 	@49
+			    location   	(700, -850)
+			    label      	(object SegLabel @51
+				Parent_View 	@50
+				location   	(2127, 1219)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	300
+				justify    	0
+				label      	"+referenceValue"
+				pctDist    	-1.195652
+				height     	44
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3AB3202F2"
+			    client     	@49
+			    supplier   	@43
+			    vertices   	(list Points
+				(2236, 1262)
+				(2328, 1262)
+				(2328, 833))
+			    line_style 	3
+			    origin_attachment 	(2236, 1262)
+			    terminal_attachment 	(2328, 833)
+			    label      	(object SegLabel @52
+				Parent_View 	@50
+				location   	(2392, 1240)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"0..1"
+				pctDist    	0.218814
+				height     	64
+				orientation 	1))
+			(object RoleView "$UNNAMED$12" @53
+			    Parent_View 	@49
+			    location   	(700, -850)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3AB3202FC"
+			    client     	@49
+			    supplier   	@5
+			    line_style 	3
+			    origin_attachment 	(2236, 1262)
+			    terminal_attachment 	(1716, 1262))))
+		(object AssociationViewNew "$UNNAMED$7" @54
+		    location   	(2081, 276)
+		    stereotype 	TRUE
+		    quidu      	"4FAD1D57013C"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$8" @55
+			    Parent_View 	@54
+			    location   	(-191, -1564)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD1D5A00FA"
+			    client     	@54
+			    supplier   	@16
+			    line_style 	3
+			    origin_attachment 	(2081, 276)
+			    terminal_attachment 	(1500, 276))
+			(object RoleView "objectsToAttach" @56
+			    Parent_View 	@54
+			    location   	(-191, -1564)
+			    label      	(object SegLabel @57
+				Parent_View 	@56
+				location   	(2079, 324)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	324
+				justify    	0
+				label      	"+objectsToAttach"
+				pctDist    	-0.010811
+				height     	48
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD1D5A0104"
+			    client     	@54
+			    supplier   	@43
+			    vertices   	(list Points
+				(2081, 276)
+				(2266, 276)
+				(2266, 671))
+			    line_style 	3
+			    origin_attachment 	(2081, 276)
+			    terminal_attachment 	(2266, 671)
+			    label      	(object SegLabel @58
+				Parent_View 	@56
+				location   	(2333, 326)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	113
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.405172
+				height     	67
+				orientation 	0))))
+		(object AssociationViewNew "$UNNAMED$1" @59
+		    location   	(2323, 148)
+		    stereotype 	TRUE
+		    quidu      	"4FAD03BD02DF"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$2" @60
+			    Parent_View 	@59
+			    location   	(1843, -1660)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD03BE01C8"
+			    client     	@59
+			    supplier   	@16
+			    line_style 	3
+			    origin_attachment 	(2323, 148)
+			    terminal_attachment 	(1500, 148))
+			(object RoleView "objectsToDetach" @61
+			    Parent_View 	@59
+			    location   	(1843, -1660)
+			    label      	(object SegLabel @62
+				Parent_View 	@61
+				location   	(2428, 191)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	336
+				justify    	0
+				label      	"+objectsToDetach"
+				pctDist    	0.127737
+				height     	43
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FAD03BE01C9"
+			    client     	@59
+			    supplier   	@43
+			    vertices   	(list Points
+				(2323, 148)
+				(2622, 148)
+				(2622, 671))
+			    line_style 	3
+			    origin_attachment 	(2323, 148)
+			    terminal_attachment 	(2622, 671)
+			    label      	(object SegLabel @63
+				Parent_View 	@61
+				location   	(2680, 194)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	70
+				justify    	0
+				label      	"0..*"
+				pctDist    	0.420925
+				height     	58
+				orientation 	0))))
+		(object AssociationViewNew "$UNNAMED$15" @64
+		    location   	(2637, 2470)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"4FC3B15301CC"
+		    roleview_list 	(list RoleViews
+			(object RoleView "referenceValues" @65
+			    Parent_View 	@64
+			    location   	(1405, -218)
+			    label      	(object SegLabel @66
+				Parent_View 	@65
+				location   	(2438, 2539)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	324
+				justify    	0
+				label      	"+referenceValues"
+				pctDist    	-0.042417
+				height     	200
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3B15501BB"
+			    client     	@64
+			    supplier   	@43
+			    line_style 	3
+			    origin_attachment 	(2637, 2470)
+			    terminal_attachment 	(2637, 833)
+			    label      	(object SegLabel @67
+				Parent_View 	@65
+				location   	(2582, 2687)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"0..*"
+				pctDist    	-0.132962
+				height     	56
+				orientation 	0))
+			(object RoleView "$UNNAMED$16" @68
+			    Parent_View 	@64
+			    location   	(1405, -218)
+			    label      	(object SegLabel @69
+				Parent_View 	@68
+				location   	(1445, 2546)
+				hidden     	TRUE
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	60
+				justify    	0
+				label      	""
+				pctDist    	0.800000
+				height     	42
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"4FC3B15501C5"
+			    client     	@64
+			    supplier   	@27
+			    vertices   	(list Points
+				(2637, 2470)
+				(2637, 2587)
+				(1253, 2587)
+				(1253, 2451))
+			    line_style 	3
+			    origin_attachment 	(2637, 2470)
+			    terminal_attachment 	(1253, 2451))))
+		(object ClassView "Class" "Logical View::change::FeatureMapEntry" @70
+		    ShowCompartmentStereotypes 	TRUE
+		    IncludeAttribute 	TRUE
+		    IncludeOperation 	TRUE
+		    location   	(2176, 2256)
+		    label      	(object ItemLabel
+			Parent_View 	@70
+			location   	(1904, 2124)
+			fill_color 	13434879
+			nlines     	1
+			max_width  	545
+			justify    	0
+			label      	"FeatureMapEntry")
+		    icon_style 	"Icon"
+		    line_color 	3342489
+		    fill_color 	13434879
+		    quidu      	"426F82D30210"
+		    compartment 	(object Compartment
+			Parent_View 	@70
+			location   	(1904, 2184)
+			icon_style 	"Icon"
+			fill_color 	13434879
+			anchor     	2
+			nlines     	4
+			max_width  	437)
+		    width      	563
+		    height     	288
+		    annotation 	8)
+		(object AssociationViewNew "$UNNAMED$23" @71
+		    location   	(2337, 1855)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"426F8309000F"
+		    roleview_list 	(list RoleViews
+			(object RoleView "feature" @72
+			    Parent_View 	@71
+			    location   	(289, -401)
+			    label      	(object SegLabel @73
+				Parent_View 	@72
+				location   	(2424, 1666)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	144
+				justify    	0
+				label      	"+feature"
+				pctDist    	0.739300
+				height     	87
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F830A0255"
+			    client     	@71
+			    supplier   	@3
+			    line_style 	3
+			    origin_attachment 	(2337, 1855)
+			    terminal_attachment 	(2337, 1598)
+			    label      	(object SegLabel @74
+				Parent_View 	@72
+				location   	(2376, 1735)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"1"
+				pctDist    	0.470817
+				height     	39
+				orientation 	1))
+			(object RoleView "$UNNAMED$24" @75
+			    Parent_View 	@71
+			    location   	(289, -401)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F830A0256"
+			    client     	@71
+			    supplier   	@70
+			    line_style 	3
+			    origin_attachment 	(2337, 1855)
+			    terminal_attachment 	(2337, 2112))))
+		(object AssociationViewNew "$UNNAMED$25" @76
+		    location   	(1838, 2340)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"426F8354019D"
+		    roleview_list 	(list RoleViews
+			(object RoleView "$UNNAMED$26" @77
+			    Parent_View 	@76
+			    location   	(-322, 84)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F83550221"
+			    client     	@76
+			    supplier   	@27
+			    line_style 	3
+			    origin_attachment 	(1838, 2340)
+			    terminal_attachment 	(1782, 2340))
+			(object RoleView "featureMapEntryValues" @78
+			    Parent_View 	@76
+			    location   	(-322, 84)
+			    label      	(object SegLabel @79
+				Parent_View 	@78
+				location   	(1957, 2506)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	444
+				justify    	0
+				label      	"+featureMapEntryValues"
+				pctDist    	2.090909
+				height     	166
+				orientation 	1)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F83550222"
+			    client     	@76
+			    supplier   	@70
+			    line_style 	3
+			    origin_attachment 	(1838, 2340)
+			    terminal_attachment 	(1895, 2340))))
+		(object AssociationViewNew "$UNNAMED$27" @80
+		    location   	(2506, 1570)
+		    stereotype 	TRUE
+		    line_color 	3342489
+		    quidu      	"426F83810089"
+		    roleview_list 	(list RoleViews
+			(object RoleView "referenceValue" @81
+			    Parent_View 	@80
+			    location   	(346, -686)
+			    label      	(object SegLabel @82
+				Parent_View 	@81
+				location   	(2322, 1372)
+				anchor     	1
+				anchor_loc 	1
+				nlines     	1
+				max_width  	300
+				justify    	0
+				label      	"+referenceValue"
+				pctDist    	0.269231
+				height     	185
+				orientation 	0)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F838500C1"
+			    client     	@80
+			    supplier   	@43
+			    line_style 	3
+			    origin_attachment 	(2506, 1570)
+			    terminal_attachment 	(2506, 833)
+			    label      	(object SegLabel @83
+				Parent_View 	@81
+				location   	(2560, 1386)
+				anchor     	2
+				anchor_loc 	1
+				nlines     	1
+				max_width  	15
+				justify    	0
+				label      	"0..1"
+				pctDist    	0.251344
+				height     	54
+				orientation 	1))
+			(object RoleView "$UNNAMED$28" @84
+			    Parent_View 	@80
+			    location   	(346, -686)
+			    stereotype 	TRUE
+			    line_color 	3342489
+			    quidu      	"426F838500C2"
+			    client     	@80
+			    supplier   	@70
+			    vertices   	(list Points
+				(2506, 1570)
+				(2506, 2259)
+				(2457, 2259))
+			    line_style 	3
+			    origin_attachment 	(2506, 1570)
+			    terminal_attachment 	(2457, 2259))))))))
diff --git a/org.eclipse.emf.ecore.change/plugin.properties b/org.eclipse.emf.ecore.change/plugin.properties
new file mode 100644
index 0000000..4d9a9ac
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/plugin.properties
@@ -0,0 +1,21 @@
+# /**
+#  * <copyright>
+#  *
+#  * Copyright (c) 2003-2008 IBM Corporation 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:
+#  *   IBM - Initial API and implementation
+#  *
+#  * </copyright>
+#  *
+#  * $Id: plugin.properties,v 1.5 2009/04/07 18:58:55 davidms Exp $
+#  */
+
+# NLS_MESSAGEFORMAT_VAR
+
+pluginName = EMF Change Model
+providerName = Eclipse Modeling Project
diff --git a/org.eclipse.emf.ecore.change/plugin.xml b/org.eclipse.emf.ecore.change/plugin.xml
new file mode 100644
index 0000000..e28a59e
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+  <extension point="org.eclipse.emf.ecore.generated_package">
+    <package uri="http://www.eclipse.org/emf/2003/Change" class="org.eclipse.emf.ecore.change.ChangePackage" genModel="model/Change.genmodel" />
+  </extension>
+</plugin>
\ No newline at end of file
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeDescription.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeDescription.java
new file mode 100644
index 0000000..d531256
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeDescription.java
@@ -0,0 +1,115 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeDescription.java,v 1.8 2007/06/12 15:07:31 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Description</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectChanges <em>Object Changes</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToDetach <em>Objects To Detach</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToAttach <em>Objects To Attach</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ChangeDescription#getResourceChanges <em>Resource Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeDescription()
+ * @model
+ * @generated
+ */
+public interface ChangeDescription extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Object Changes</b></em>' map.
+   * The key is of type {@link org.eclipse.emf.ecore.EObject},
+   * and the value is of type list of {@link org.eclipse.emf.ecore.change.FeatureChange},
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Object Changes</em>' map.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeDescription_ObjectChanges()
+   * @model mapType="org.eclipse.emf.ecore.change.EObjectToChangesMapEntry<org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.change.FeatureChange>"
+   * @generated
+   */
+  EMap<EObject, EList<FeatureChange>> getObjectChanges();
+
+  /**
+   * Returns the value of the '<em><b>Objects To Detach</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * Returns the list of objects that will be detached when this Change Description
+   * is applied.  The list is calculated every time this method is called.
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Objects To Detach</em>' reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeDescription_ObjectsToDetach()
+   * @model resolveProxies="false" transient="true" derived="true"
+   * @generated
+   */
+  EList<EObject> getObjectsToDetach();
+
+  /**
+   * Returns the value of the '<em><b>Objects To Attach</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Objects To Attach</em>' containment reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeDescription_ObjectsToAttach()
+   * @model containment="true"
+   * @generated
+   */
+  EList<EObject> getObjectsToAttach();
+
+  /**
+   * Returns the value of the '<em><b>Resource Changes</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.change.ResourceChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Resource Changes</em>' containment reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeDescription_ResourceChanges()
+   * @model containment="true"
+   * @generated
+   */
+  EList<ResourceChange> getResourceChanges();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void apply();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void applyAndReverse();
+
+} // ChangeDescription
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeFactory.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeFactory.java
new file mode 100644
index 0000000..3de41a2
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeFactory.java
@@ -0,0 +1,108 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeFactory.java,v 1.5 2006/12/29 18:21:50 marcelop Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+
+
+/**
+ * <!-- 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.ecore.change.ChangePackage
+ * @generated
+ */
+public interface ChangeFactory extends EFactory{
+  /**
+   * The singleton instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  ChangeFactory eINSTANCE = org.eclipse.emf.ecore.change.impl.ChangeFactoryImpl.init();
+
+  /**
+   * Returns a new object of class '<em>Description</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Description</em>'.
+   * @generated
+   */
+  ChangeDescription createChangeDescription();
+
+  /**
+   * Returns a new object of class '<em>Feature Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Feature Change</em>'.
+   * @generated
+   */
+  FeatureChange createFeatureChange();
+
+  FeatureChange createFeatureChange(EStructuralFeature feature, Object oldValue, boolean oldIsSet);
+
+  /**
+   * Returns a new object of class '<em>List Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>List Change</em>'.
+   * @generated
+   */
+  ListChange createListChange();
+
+  /**
+   * Returns a new object of class '<em>Resource Change</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Resource Change</em>'.
+   * @generated
+   */
+  ResourceChange createResourceChange();
+
+  ResourceChange createResourceChange(Resource resource, EList<Object> oldValue);
+
+  /**
+   * Returns a new object of class '<em>Feature Map Entry</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Feature Map Entry</em>'.
+   * @generated
+   */
+  FeatureMapEntry createFeatureMapEntry();
+
+  FeatureMapEntry createFeatureMapEntry(EStructuralFeature feature, Object value);
+
+  /**
+   * Returns the package supported by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the package supported by this factory.
+   * @generated
+   */
+  ChangePackage getChangePackage();
+
+  Map.Entry<EObject, EList<FeatureChange>> createEObjectToChangesMapEntry(EObject eObject);
+
+} //ChangeFactory
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeKind.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeKind.java
new file mode 100644
index 0000000..d0da29a
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangeKind.java
@@ -0,0 +1,253 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeKind.java,v 1.5 2006/12/29 18:21:50 marcelop Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getChangeKind()
+ * @model
+ * @generated
+ */
+public enum ChangeKind implements Enumerator
+{
+  /**
+   * The '<em><b>ADD</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #ADD
+   * @generated
+   * @ordered
+   */
+  ADD_LITERAL(0, "ADD", "ADD"),
+
+  /**
+   * The '<em><b>REMOVE</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #REMOVE
+   * @generated
+   * @ordered
+   */
+  REMOVE_LITERAL(1, "REMOVE", "REMOVE"),
+
+  /**
+   * The '<em><b>MOVE</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #MOVE
+   * @generated
+   * @ordered
+   */
+  MOVE_LITERAL(2, "MOVE", "MOVE");
+
+  /**
+   * The '<em><b>ADD</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #ADD_LITERAL
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int ADD = 0;
+
+  /**
+   * The '<em><b>REMOVE</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #REMOVE_LITERAL
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int REMOVE = 1;
+
+  /**
+   * The '<em><b>MOVE</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #MOVE_LITERAL
+   * @model
+   * @generated
+   * @ordered
+   */
+  public static final int MOVE = 2;
+
+  /**
+   * An array of all the '<em><b>Kind</b></em>' enumerators.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static final ChangeKind[] VALUES_ARRAY =
+    new ChangeKind[]
+    {
+      ADD_LITERAL,
+      REMOVE_LITERAL,
+      MOVE_LITERAL,
+    };
+
+  /**
+   * A public read-only list of all the '<em><b>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>Kind</b></em>' literal with the specified literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @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>Kind</b></em>' literal with the specified name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @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>Kind</b></em>' literal with the specified integer value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static ChangeKind get(int value)
+  {
+    switch (value)
+    {
+      case ADD: return ADD_LITERAL;
+      case REMOVE: return REMOVE_LITERAL;
+      case MOVE: return MOVE_LITERAL;
+    }
+    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;
+  }
+}
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePackage.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePackage.java
new file mode 100644
index 0000000..a53600f
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePackage.java
@@ -0,0 +1,1207 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2004 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangePackage.java,v 1.8 2005/11/23 18:10:07 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+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 enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.ecore.change.ChangeFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ChangePackage extends EPackage{
+  /**
+   * The package name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNAME = "change";
+
+  /**
+   * The package namespace URI.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_URI = "http://www.eclipse.org/emf/2003/Change";
+
+  /**
+   * The package namespace name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_PREFIX = "change";
+
+  /**
+   * The singleton instance of the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  ChangePackage eINSTANCE = org.eclipse.emf.ecore.change.impl.ChangePackageImpl.init();
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl <em>Description</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getChangeDescription()
+   * @generated
+   */
+  int CHANGE_DESCRIPTION = 0;
+
+  /**
+   * The feature id for the '<em><b>Object Changes</b></em>' map.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_DESCRIPTION__OBJECT_CHANGES = 0;
+
+  /**
+   * The feature id for the '<em><b>Objects To Detach</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_DESCRIPTION__OBJECTS_TO_DETACH = 1;
+
+  /**
+   * The feature id for the '<em><b>Objects To Attach</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH = 2;
+
+  /**
+   * The feature id for the '<em><b>Resource Changes</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_DESCRIPTION__RESOURCE_CHANGES = 3;
+
+  /**
+   * The number of structural features of the '<em>Description</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int CHANGE_DESCRIPTION_FEATURE_COUNT = 4;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl <em>EObject To Changes Map Entry</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getEObjectToChangesMapEntry()
+   * @generated
+   */
+  int EOBJECT_TO_CHANGES_MAP_ENTRY = 1;
+
+  /**
+   * The feature id for the '<em><b>Key</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EOBJECT_TO_CHANGES_MAP_ENTRY__KEY = 0;
+
+  /**
+   * The feature id for the '<em><b>Value</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE = 1;
+
+  /**
+   * The number of structural features of the '<em>EObject To Changes Map Entry</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EOBJECT_TO_CHANGES_MAP_ENTRY_FEATURE_COUNT = 2;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl <em>Feature Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.FeatureChangeImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getFeatureChange()
+   * @generated
+   */
+  int FEATURE_CHANGE = 2;
+
+  /**
+   * The feature id for the '<em><b>Feature Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__FEATURE_NAME = 0;
+
+  /**
+   * The feature id for the '<em><b>Data Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__DATA_VALUE = 1;
+
+  /**
+   * The feature id for the '<em><b>Set</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__SET = 2;
+
+  /**
+   * The feature id for the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__VALUE = 3;
+
+  /**
+   * The feature id for the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__FEATURE = 4;
+
+  /**
+   * The feature id for the '<em><b>Reference Value</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__REFERENCE_VALUE = 5;
+
+  /**
+   * The feature id for the '<em><b>List Changes</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE__LIST_CHANGES = 6;
+
+  /**
+   * The number of structural features of the '<em>Feature Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_CHANGE_FEATURE_COUNT = 7;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl <em>List Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.ListChangeImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getListChange()
+   * @generated
+   */
+  int LIST_CHANGE = 3;
+
+  /**
+   * The feature id for the '<em><b>Kind</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__KIND = 0;
+
+  /**
+   * The feature id for the '<em><b>Data Values</b></em>' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__DATA_VALUES = 1;
+
+  /**
+   * The feature id for the '<em><b>Index</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__INDEX = 2;
+
+  /**
+   * The feature id for the '<em><b>Move To Index</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__MOVE_TO_INDEX = 3;
+
+  /**
+   * The feature id for the '<em><b>Values</b></em>' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__VALUES = 4;
+
+  /**
+   * The feature id for the '<em><b>Reference Values</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__REFERENCE_VALUES = 5;
+
+  /**
+   * The feature id for the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__FEATURE = 6;
+
+  /**
+   * The feature id for the '<em><b>Feature Map Entry Values</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES = 7;
+
+  /**
+   * The number of structural features of the '<em>List Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int LIST_CHANGE_FEATURE_COUNT = 8;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl <em>Resource Change</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.ResourceChangeImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getResourceChange()
+   * @generated
+   */
+  int RESOURCE_CHANGE = 4;
+
+  /**
+   * The feature id for the '<em><b>Resource URI</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RESOURCE_CHANGE__RESOURCE_URI = 0;
+
+  /**
+   * The feature id for the '<em><b>Resource</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RESOURCE_CHANGE__RESOURCE = 1;
+
+  /**
+   * The feature id for the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RESOURCE_CHANGE__VALUE = 2;
+
+  /**
+   * The feature id for the '<em><b>List Changes</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RESOURCE_CHANGE__LIST_CHANGES = 3;
+
+  /**
+   * The number of structural features of the '<em>Resource Change</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RESOURCE_CHANGE_FEATURE_COUNT = 4;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl <em>Feature Map Entry</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getFeatureMapEntry()
+   * @generated
+   */
+  int FEATURE_MAP_ENTRY = 5;
+
+  /**
+   * The feature id for the '<em><b>Feature Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY__FEATURE_NAME = 0;
+
+  /**
+   * The feature id for the '<em><b>Data Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY__DATA_VALUE = 1;
+
+  /**
+   * The feature id for the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY__VALUE = 2;
+
+  /**
+   * The feature id for the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY__FEATURE = 3;
+
+  /**
+   * The feature id for the '<em><b>Reference Value</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY__REFERENCE_VALUE = 4;
+
+  /**
+   * The number of structural features of the '<em>Feature Map Entry</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int FEATURE_MAP_ENTRY_FEATURE_COUNT = 5;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.emf.ecore.change.ChangeKind <em>Kind</em>}' enum.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.change.ChangeKind
+   * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getChangeKind()
+   * @generated
+   */
+  int CHANGE_KIND = 6;
+
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.ecore.change.ChangeDescription <em>Description</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Description</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeDescription
+   * @generated
+   */
+  EClass getChangeDescription();
+
+  /**
+   * Returns the meta object for the map '{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectChanges <em>Object Changes</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the map '<em>Object Changes</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeDescription#getObjectChanges()
+   * @see #getChangeDescription()
+   * @generated
+   */
+  EReference getChangeDescription_ObjectChanges();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToDetach <em>Objects To Detach</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Objects To Detach</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToDetach()
+   * @see #getChangeDescription()
+   * @generated
+   */
+  EReference getChangeDescription_ObjectsToDetach();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToAttach <em>Objects To Attach</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Objects To Attach</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeDescription#getObjectsToAttach()
+   * @see #getChangeDescription()
+   * @generated
+   */
+  EReference getChangeDescription_ObjectsToAttach();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.ecore.change.ChangeDescription#getResourceChanges <em>Resource Changes</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Resource Changes</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeDescription#getResourceChanges()
+   * @see #getChangeDescription()
+   * @generated
+   */
+  EReference getChangeDescription_ResourceChanges();
+
+  /**
+   * Returns the meta object for class '{@link java.util.Map.Entry <em>EObject To Changes Map Entry</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>EObject To Changes Map Entry</em>'.
+   * @see java.util.Map.Entry
+   * @model keyType="org.eclipse.emf.ecore.EObject" keyRequired="true"
+   *        valueType="org.eclipse.emf.ecore.change.FeatureChange" valueContainment="true" valueMany="true"
+   * @generated
+   */
+  EClass getEObjectToChangesMapEntry();
+
+  /**
+   * Returns the meta object for the reference '{@link java.util.Map.Entry <em>Key</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Key</em>'.
+   * @see java.util.Map.Entry
+   * @see #getEObjectToChangesMapEntry()
+   * @generated
+   */
+  EReference getEObjectToChangesMapEntry_Key();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link java.util.Map.Entry <em>Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Value</em>'.
+   * @see java.util.Map.Entry
+   * @see #getEObjectToChangesMapEntry()
+   * @generated
+   */
+  EReference getEObjectToChangesMapEntry_Value();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.ecore.change.FeatureChange <em>Feature Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Feature Change</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange
+   * @generated
+   */
+  EClass getFeatureChange();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeatureName <em>Feature Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Feature Name</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getFeatureName()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EAttribute getFeatureChange_FeatureName();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureChange#getDataValue <em>Data Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Data Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getDataValue()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EAttribute getFeatureChange_DataValue();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureChange#isSet <em>Set</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Set</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#isSet()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EAttribute getFeatureChange_Set();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureChange#getValue <em>Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getValue()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EAttribute getFeatureChange_Value();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeature <em>Feature</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Feature</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getFeature()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EReference getFeatureChange_Feature();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.ecore.change.FeatureChange#getReferenceValue <em>Reference Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Reference Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getReferenceValue()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EReference getFeatureChange_ReferenceValue();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.ecore.change.FeatureChange#getListChanges <em>List Changes</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>List Changes</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureChange#getListChanges()
+   * @see #getFeatureChange()
+   * @generated
+   */
+  EReference getFeatureChange_ListChanges();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.ecore.change.ListChange <em>List Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>List Change</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange
+   * @generated
+   */
+  EClass getListChange();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ListChange#getKind <em>Kind</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Kind</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getKind()
+   * @see #getListChange()
+   * @generated
+   */
+  EAttribute getListChange_Kind();
+
+  /**
+   * Returns the meta object for the attribute list '{@link org.eclipse.emf.ecore.change.ListChange#getDataValues <em>Data Values</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute list '<em>Data Values</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getDataValues()
+   * @see #getListChange()
+   * @generated
+   */
+  EAttribute getListChange_DataValues();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ListChange#getIndex <em>Index</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Index</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getIndex()
+   * @see #getListChange()
+   * @generated
+   */
+  EAttribute getListChange_Index();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ListChange#getMoveToIndex <em>Move To Index</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Move To Index</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getMoveToIndex()
+   * @see #getListChange()
+   * @generated
+   */
+  EAttribute getListChange_MoveToIndex();
+
+  /**
+   * Returns the meta object for the attribute list '{@link org.eclipse.emf.ecore.change.ListChange#getValues <em>Values</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute list '<em>Values</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getValues()
+   * @see #getListChange()
+   * @generated
+   */
+  EAttribute getListChange_Values();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.emf.ecore.change.ListChange#getReferenceValues <em>Reference Values</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Reference Values</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getReferenceValues()
+   * @see #getListChange()
+   * @generated
+   */
+  EReference getListChange_ReferenceValues();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.ecore.change.ListChange#getFeature <em>Feature</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Feature</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getFeature()
+   * @see #getListChange()
+   * @generated
+   */
+  EReference getListChange_Feature();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.ecore.change.ListChange#getFeatureMapEntryValues <em>Feature Map Entry Values</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Feature Map Entry Values</em>'.
+   * @see org.eclipse.emf.ecore.change.ListChange#getFeatureMapEntryValues()
+   * @see #getListChange()
+   * @generated
+   */
+  EReference getListChange_FeatureMapEntryValues();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.ecore.change.ResourceChange <em>Resource Change</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Resource Change</em>'.
+   * @see org.eclipse.emf.ecore.change.ResourceChange
+   * @generated
+   */
+  EClass getResourceChange();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ResourceChange#getResourceURI <em>Resource URI</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Resource URI</em>'.
+   * @see org.eclipse.emf.ecore.change.ResourceChange#getResourceURI()
+   * @see #getResourceChange()
+   * @generated
+   */
+  EAttribute getResourceChange_ResourceURI();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ResourceChange#getResource <em>Resource</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Resource</em>'.
+   * @see org.eclipse.emf.ecore.change.ResourceChange#getResource()
+   * @see #getResourceChange()
+   * @generated
+   */
+  EAttribute getResourceChange_Resource();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.ResourceChange#getValue <em>Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Value</em>'.
+   * @see org.eclipse.emf.ecore.change.ResourceChange#getValue()
+   * @see #getResourceChange()
+   * @generated
+   */
+  EAttribute getResourceChange_Value();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.emf.ecore.change.ResourceChange#getListChanges <em>List Changes</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>List Changes</em>'.
+   * @see org.eclipse.emf.ecore.change.ResourceChange#getListChanges()
+   * @see #getResourceChange()
+   * @generated
+   */
+  EReference getResourceChange_ListChanges();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.emf.ecore.change.FeatureMapEntry <em>Feature Map Entry</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Feature Map Entry</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry
+   * @generated
+   */
+  EClass getFeatureMapEntry();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName <em>Feature Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Feature Name</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName()
+   * @see #getFeatureMapEntry()
+   * @generated
+   */
+  EAttribute getFeatureMapEntry_FeatureName();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getDataValue <em>Data Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Data Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry#getDataValue()
+   * @see #getFeatureMapEntry()
+   * @generated
+   */
+  EAttribute getFeatureMapEntry_DataValue();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getValue <em>Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry#getValue()
+   * @see #getFeatureMapEntry()
+   * @generated
+   */
+  EAttribute getFeatureMapEntry_Value();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature <em>Feature</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Feature</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature()
+   * @see #getFeatureMapEntry()
+   * @generated
+   */
+  EReference getFeatureMapEntry_Feature();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getReferenceValue <em>Reference Value</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Reference Value</em>'.
+   * @see org.eclipse.emf.ecore.change.FeatureMapEntry#getReferenceValue()
+   * @see #getFeatureMapEntry()
+   * @generated
+   */
+  EReference getFeatureMapEntry_ReferenceValue();
+
+  /**
+   * Returns the meta object for enum '{@link org.eclipse.emf.ecore.change.ChangeKind <em>Kind</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for enum '<em>Kind</em>'.
+   * @see org.eclipse.emf.ecore.change.ChangeKind
+   * @generated
+   */
+  EEnum getChangeKind();
+
+  /**
+   * 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
+   */
+  ChangeFactory getChangeFactory();
+
+  /**
+   * <!-- 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 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.ecore.change.impl.ChangeDescriptionImpl <em>Description</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getChangeDescription()
+     * @generated
+     */
+    EClass CHANGE_DESCRIPTION = eINSTANCE.getChangeDescription();
+
+    /**
+     * The meta object literal for the '<em><b>Object Changes</b></em>' map feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE_DESCRIPTION__OBJECT_CHANGES = eINSTANCE.getChangeDescription_ObjectChanges();
+
+    /**
+     * The meta object literal for the '<em><b>Objects To Detach</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE_DESCRIPTION__OBJECTS_TO_DETACH = eINSTANCE.getChangeDescription_ObjectsToDetach();
+
+    /**
+     * The meta object literal for the '<em><b>Objects To Attach</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH = eINSTANCE.getChangeDescription_ObjectsToAttach();
+
+    /**
+     * The meta object literal for the '<em><b>Resource Changes</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference CHANGE_DESCRIPTION__RESOURCE_CHANGES = eINSTANCE.getChangeDescription_ResourceChanges();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl <em>EObject To Changes Map Entry</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getEObjectToChangesMapEntry()
+     * @generated
+     */
+    EClass EOBJECT_TO_CHANGES_MAP_ENTRY = eINSTANCE.getEObjectToChangesMapEntry();
+
+    /**
+     * The meta object literal for the '<em><b>Key</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EOBJECT_TO_CHANGES_MAP_ENTRY__KEY = eINSTANCE.getEObjectToChangesMapEntry_Key();
+
+    /**
+     * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE = eINSTANCE.getEObjectToChangesMapEntry_Value();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl <em>Feature Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.FeatureChangeImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getFeatureChange()
+     * @generated
+     */
+    EClass FEATURE_CHANGE = eINSTANCE.getFeatureChange();
+
+    /**
+     * The meta object literal for the '<em><b>Feature Name</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_CHANGE__FEATURE_NAME = eINSTANCE.getFeatureChange_FeatureName();
+
+    /**
+     * The meta object literal for the '<em><b>Data Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_CHANGE__DATA_VALUE = eINSTANCE.getFeatureChange_DataValue();
+
+    /**
+     * The meta object literal for the '<em><b>Set</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_CHANGE__SET = eINSTANCE.getFeatureChange_Set();
+
+    /**
+     * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_CHANGE__VALUE = eINSTANCE.getFeatureChange_Value();
+
+    /**
+     * The meta object literal for the '<em><b>Feature</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_CHANGE__FEATURE = eINSTANCE.getFeatureChange_Feature();
+
+    /**
+     * The meta object literal for the '<em><b>Reference Value</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_CHANGE__REFERENCE_VALUE = eINSTANCE.getFeatureChange_ReferenceValue();
+
+    /**
+     * The meta object literal for the '<em><b>List Changes</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_CHANGE__LIST_CHANGES = eINSTANCE.getFeatureChange_ListChanges();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl <em>List Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.ListChangeImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getListChange()
+     * @generated
+     */
+    EClass LIST_CHANGE = eINSTANCE.getListChange();
+
+    /**
+     * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LIST_CHANGE__KIND = eINSTANCE.getListChange_Kind();
+
+    /**
+     * The meta object literal for the '<em><b>Data Values</b></em>' attribute list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LIST_CHANGE__DATA_VALUES = eINSTANCE.getListChange_DataValues();
+
+    /**
+     * The meta object literal for the '<em><b>Index</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LIST_CHANGE__INDEX = eINSTANCE.getListChange_Index();
+
+    /**
+     * The meta object literal for the '<em><b>Move To Index</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LIST_CHANGE__MOVE_TO_INDEX = eINSTANCE.getListChange_MoveToIndex();
+
+    /**
+     * The meta object literal for the '<em><b>Values</b></em>' attribute list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute LIST_CHANGE__VALUES = eINSTANCE.getListChange_Values();
+
+    /**
+     * The meta object literal for the '<em><b>Reference Values</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference LIST_CHANGE__REFERENCE_VALUES = eINSTANCE.getListChange_ReferenceValues();
+
+    /**
+     * The meta object literal for the '<em><b>Feature</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference LIST_CHANGE__FEATURE = eINSTANCE.getListChange_Feature();
+
+    /**
+     * The meta object literal for the '<em><b>Feature Map Entry Values</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES = eINSTANCE.getListChange_FeatureMapEntryValues();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl <em>Resource Change</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.ResourceChangeImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getResourceChange()
+     * @generated
+     */
+    EClass RESOURCE_CHANGE = eINSTANCE.getResourceChange();
+
+    /**
+     * The meta object literal for the '<em><b>Resource URI</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute RESOURCE_CHANGE__RESOURCE_URI = eINSTANCE.getResourceChange_ResourceURI();
+
+    /**
+     * The meta object literal for the '<em><b>Resource</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute RESOURCE_CHANGE__RESOURCE = eINSTANCE.getResourceChange_Resource();
+
+    /**
+     * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute RESOURCE_CHANGE__VALUE = eINSTANCE.getResourceChange_Value();
+
+    /**
+     * The meta object literal for the '<em><b>List Changes</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RESOURCE_CHANGE__LIST_CHANGES = eINSTANCE.getResourceChange_ListChanges();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl <em>Feature Map Entry</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getFeatureMapEntry()
+     * @generated
+     */
+    EClass FEATURE_MAP_ENTRY = eINSTANCE.getFeatureMapEntry();
+
+    /**
+     * The meta object literal for the '<em><b>Feature Name</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_MAP_ENTRY__FEATURE_NAME = eINSTANCE.getFeatureMapEntry_FeatureName();
+
+    /**
+     * The meta object literal for the '<em><b>Data Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_MAP_ENTRY__DATA_VALUE = eINSTANCE.getFeatureMapEntry_DataValue();
+
+    /**
+     * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute FEATURE_MAP_ENTRY__VALUE = eINSTANCE.getFeatureMapEntry_Value();
+
+    /**
+     * The meta object literal for the '<em><b>Feature</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_MAP_ENTRY__FEATURE = eINSTANCE.getFeatureMapEntry_Feature();
+
+    /**
+     * The meta object literal for the '<em><b>Reference Value</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference FEATURE_MAP_ENTRY__REFERENCE_VALUE = eINSTANCE.getFeatureMapEntry_ReferenceValue();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.emf.ecore.change.ChangeKind <em>Kind</em>}' enum.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.change.ChangeKind
+     * @see org.eclipse.emf.ecore.change.impl.ChangePackageImpl#getChangeKind()
+     * @generated
+     */
+    EEnum CHANGE_KIND = eINSTANCE.getChangeKind();
+
+  }
+
+} //ChangePackage
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePlugin.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePlugin.java
new file mode 100644
index 0000000..5402c3c
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ChangePlugin.java
@@ -0,0 +1,107 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2005-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangePlugin.java,v 1.3 2006/12/29 18:21:50 marcelop Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the Change model plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ChangePlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final ChangePlugin INSTANCE = new ChangePlugin();
+
+  /**
+   * 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 ChangePlugin()
+  {
+    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/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureChange.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureChange.java
new file mode 100644
index 0000000..a17c75f
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureChange.java
@@ -0,0 +1,253 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: FeatureChange.java,v 1.6 2007/06/12 15:07:30 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Feature Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getFeatureName <em>Feature Name</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getDataValue <em>Data Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#isSet <em>Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getReferenceValue <em>Reference Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureChange#getListChanges <em>List Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange()
+ * @model
+ * @generated
+ */
+public interface FeatureChange extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Feature Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature Name</em>' attribute.
+   * @see #isSetFeatureName()
+   * @see #unsetFeatureName()
+   * @see #setFeatureName(String)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_FeatureName()
+   * @model unsettable="true" volatile="true"
+   * @generated
+   */
+  String getFeatureName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeatureName <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Feature Name</em>' attribute.
+   * @see #isSetFeatureName()
+   * @see #unsetFeatureName()
+   * @see #getFeatureName()
+   * @generated
+   */
+  void setFeatureName(String value);
+
+  /**
+   * Unsets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeatureName <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSetFeatureName()
+   * @see #getFeatureName()
+   * @see #setFeatureName(String)
+   * @generated
+   */
+  void unsetFeatureName();
+
+  /**
+   * Returns whether the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeatureName <em>Feature Name</em>}' attribute is set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return whether the value of the '<em>Feature Name</em>' attribute is set.
+   * @see #unsetFeatureName()
+   * @see #getFeatureName()
+   * @see #setFeatureName(String)
+   * @generated
+   */
+  boolean isSetFeatureName();
+
+  /**
+   * Returns the value of the '<em><b>Data Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Data Value</em>' attribute.
+   * @see #setDataValue(String)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_DataValue()
+   * @model volatile="true"
+   * @generated
+   */
+  String getDataValue();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getDataValue <em>Data Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Data Value</em>' attribute.
+   * @see #getDataValue()
+   * @generated
+   */
+  void setDataValue(String value);
+
+  /**
+   * Returns the value of the '<em><b>Set</b></em>' attribute.
+   * The default value is <code>"true"</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Set</em>' attribute.
+   * @see #setSet(boolean)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_Set()
+   * @model default="true"
+   * @generated
+   */
+  boolean isSet();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#isSet <em>Set</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Set</em>' attribute.
+   * @see #isSet()
+   * @generated
+   */
+  void setSet(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature</em>' reference.
+   * @see #isSetFeature()
+   * @see #unsetFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_Feature()
+   * @model unsettable="true" required="true" volatile="true"
+   * @generated
+   */
+  EStructuralFeature getFeature();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeature <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Feature</em>' reference.
+   * @see #isSetFeature()
+   * @see #unsetFeature()
+   * @see #getFeature()
+   * @generated
+   */
+  void setFeature(EStructuralFeature value);
+
+  /**
+   * Unsets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeature <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSetFeature()
+   * @see #getFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @generated
+   */
+  void unsetFeature();
+
+  /**
+   * Returns whether the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getFeature <em>Feature</em>}' reference is set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return whether the value of the '<em>Feature</em>' reference is set.
+   * @see #unsetFeature()
+   * @see #getFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @generated
+   */
+  boolean isSetFeature();
+
+  /**
+   * Returns the value of the '<em><b>Reference Value</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Reference Value</em>' reference.
+   * @see #setReferenceValue(EObject)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_ReferenceValue()
+   * @model volatile="true"
+   * @generated
+   */
+  EObject getReferenceValue();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureChange#getReferenceValue <em>Reference Value</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Reference Value</em>' reference.
+   * @see #getReferenceValue()
+   * @generated
+   */
+  void setReferenceValue(EObject value);
+
+  /**
+   * Returns the value of the '<em><b>List Changes</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.change.ListChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>List Changes</em>' containment reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_ListChanges()
+   * @model containment="true"
+   * @generated
+   */
+  EList<ListChange> getListChanges();
+
+  /**
+   * Returns the value of the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Value</em>' attribute.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureChange_Value()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  Object getValue();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void apply(EObject originalObject);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void applyAndReverse(EObject originalObject);
+
+} // FeatureChange
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureMapEntry.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureMapEntry.java
new file mode 100644
index 0000000..00f7ff0
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/FeatureMapEntry.java
@@ -0,0 +1,197 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: FeatureMapEntry.java,v 1.2 2006/12/29 18:21:50 marcelop Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Feature Map Entry</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName <em>Feature Name</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getDataValue <em>Data Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getReferenceValue <em>Reference Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry()
+ * @model
+ * @generated
+ */
+public interface FeatureMapEntry extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Feature Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature Name</em>' attribute.
+   * @see #isSetFeatureName()
+   * @see #unsetFeatureName()
+   * @see #setFeatureName(String)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry_FeatureName()
+   * @model unsettable="true" volatile="true"
+   * @generated
+   */
+  String getFeatureName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Feature Name</em>' attribute.
+   * @see #isSetFeatureName()
+   * @see #unsetFeatureName()
+   * @see #getFeatureName()
+   * @generated
+   */
+  void setFeatureName(String value);
+
+  /**
+   * Unsets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSetFeatureName()
+   * @see #getFeatureName()
+   * @see #setFeatureName(String)
+   * @generated
+   */
+  void unsetFeatureName();
+
+  /**
+   * Returns whether the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeatureName <em>Feature Name</em>}' attribute is set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return whether the value of the '<em>Feature Name</em>' attribute is set.
+   * @see #unsetFeatureName()
+   * @see #getFeatureName()
+   * @see #setFeatureName(String)
+   * @generated
+   */
+  boolean isSetFeatureName();
+
+  /**
+   * Returns the value of the '<em><b>Data Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Data Value</em>' attribute.
+   * @see #setDataValue(String)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry_DataValue()
+   * @model volatile="true"
+   * @generated
+   */
+  String getDataValue();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getDataValue <em>Data Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Data Value</em>' attribute.
+   * @see #getDataValue()
+   * @generated
+   */
+  void setDataValue(String value);
+
+  /**
+   * Returns the value of the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Value</em>' attribute.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry_Value()
+   * @model transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  Object getValue();
+
+  /**
+   * Returns the value of the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature</em>' reference.
+   * @see #isSetFeature()
+   * @see #unsetFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry_Feature()
+   * @model unsettable="true" required="true" volatile="true"
+   * @generated
+   */
+  EStructuralFeature getFeature();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Feature</em>' reference.
+   * @see #isSetFeature()
+   * @see #unsetFeature()
+   * @see #getFeature()
+   * @generated
+   */
+  void setFeature(EStructuralFeature value);
+
+  /**
+   * Unsets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSetFeature()
+   * @see #getFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @generated
+   */
+  void unsetFeature();
+
+  /**
+   * Returns whether the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getFeature <em>Feature</em>}' reference is set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return whether the value of the '<em>Feature</em>' reference is set.
+   * @see #unsetFeature()
+   * @see #getFeature()
+   * @see #setFeature(EStructuralFeature)
+   * @generated
+   */
+  boolean isSetFeature();
+
+  /**
+   * Returns the value of the '<em><b>Reference Value</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Reference Value</em>' reference.
+   * @see #setReferenceValue(EObject)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getFeatureMapEntry_ReferenceValue()
+   * @model volatile="true"
+   * @generated
+   */
+  EObject getReferenceValue();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.FeatureMapEntry#getReferenceValue <em>Reference Value</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Reference Value</em>' reference.
+   * @see #getReferenceValue()
+   * @generated
+   */
+  void setReferenceValue(EObject value);
+
+} // FeatureMapEntry
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ListChange.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ListChange.java
new file mode 100644
index 0000000..b8250cf
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ListChange.java
@@ -0,0 +1,206 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ListChange.java,v 1.9 2008/10/23 17:22:40 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>List Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getDataValues <em>Data Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getIndex <em>Index</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getMoveToIndex <em>Move To Index</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getValues <em>Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getReferenceValues <em>Reference Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ListChange#getFeatureMapEntryValues <em>Feature Map Entry Values</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange()
+ * @model
+ * @generated
+ */
+public interface ListChange extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Kind</b></em>' attribute.
+   * The literals are from the enumeration {@link org.eclipse.emf.ecore.change.ChangeKind}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Kind</em>' attribute.
+   * @see org.eclipse.emf.ecore.change.ChangeKind
+   * @see #setKind(ChangeKind)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_Kind()
+   * @model
+   * @generated
+   */
+  ChangeKind getKind();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ListChange#getKind <em>Kind</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Kind</em>' attribute.
+   * @see org.eclipse.emf.ecore.change.ChangeKind
+   * @see #getKind()
+   * @generated
+   */
+  void setKind(ChangeKind value);
+
+  /**
+   * Returns the value of the '<em><b>Data Values</b></em>' attribute list.
+   * The list contents are of type {@link java.lang.String}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Data Values</em>' attribute list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_DataValues()
+   * @model unique="false"
+   * @generated
+   */
+  EList<String> getDataValues();
+
+  /**
+   * Returns the value of the '<em><b>Index</b></em>' attribute.
+   * The default value is <code>"-1"</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Index</em>' attribute.
+   * @see #setIndex(int)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_Index()
+   * @model default="-1"
+   * @generated
+   */
+  int getIndex();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ListChange#getIndex <em>Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Index</em>' attribute.
+   * @see #getIndex()
+   * @generated
+   */
+  void setIndex(int value);
+
+  /**
+   * Returns the value of the '<em><b>Move To Index</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Move To Index</em>' attribute.
+   * @see #setMoveToIndex(int)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_MoveToIndex()
+   * @model
+   * @generated
+   */
+  int getMoveToIndex();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ListChange#getMoveToIndex <em>Move To Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Move To Index</em>' attribute.
+   * @see #getMoveToIndex()
+   * @generated
+   */
+  void setMoveToIndex(int value);
+
+  /**
+   * Returns the value of the '<em><b>Reference Values</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Reference Values</em>' reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_ReferenceValues()
+   * @model
+   * @generated
+   */
+  EList<EObject> getReferenceValues();
+
+  /**
+   * Returns the value of the '<em><b>Feature</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature</em>' reference.
+   * @see #setFeature(EStructuralFeature)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_Feature()
+   * @model
+   * @generated
+   */
+  EStructuralFeature getFeature();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ListChange#getFeature <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Feature</em>' reference.
+   * @see #getFeature()
+   * @generated
+   */
+  void setFeature(EStructuralFeature value);
+
+  /**
+   * Returns the value of the '<em><b>Feature Map Entry Values</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.change.FeatureMapEntry}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Feature Map Entry Values</em>' containment reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_FeatureMapEntryValues()
+   * @model containment="true"
+   * @generated
+   */
+  EList<FeatureMapEntry> getFeatureMapEntryValues();
+
+  /**
+   * Returns the value of the '<em><b>Values</b></em>' attribute list.
+   * The list contents are of type {@link java.lang.Object}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Values</em>' attribute list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getListChange_Values()
+   * @model transient="true" volatile="true" derived="true"
+   * @generated
+   */
+  EList<Object> getValues();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model originalListMany="false"
+   * @generated
+   */
+  void apply(EList<Object> originalList);
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model originalListMany="false"
+   * @generated
+   */
+  void applyAndReverse(EList<Object> originalList);
+
+} // ListChange
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ResourceChange.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ResourceChange.java
new file mode 100644
index 0000000..778262f
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/ResourceChange.java
@@ -0,0 +1,127 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ResourceChange.java,v 1.5 2007/06/12 15:07:31 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Resource Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.ResourceChange#getResourceURI <em>Resource URI</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ResourceChange#getResource <em>Resource</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ResourceChange#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.ResourceChange#getListChanges <em>List Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.emf.ecore.change.ChangePackage#getResourceChange()
+ * @model
+ * @generated
+ */
+public interface ResourceChange extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Resource URI</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Resource URI</em>' attribute.
+   * @see #setResourceURI(String)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getResourceChange_ResourceURI()
+   * @model
+   * @generated
+   */
+  String getResourceURI();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ResourceChange#getResourceURI <em>Resource URI</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Resource URI</em>' attribute.
+   * @see #getResourceURI()
+   * @generated
+   */
+  void setResourceURI(String value);
+
+  /**
+   * Returns the value of the '<em><b>Resource</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Resource</em>' attribute.
+   * @see #setResource(Resource)
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getResourceChange_Resource()
+   * @model transient="true" derived="true"
+   * @generated
+   */
+  Resource getResource();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.ecore.change.ResourceChange#getResource <em>Resource</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Resource</em>' attribute.
+   * @see #getResource()
+   * @generated
+   */
+  void setResource(Resource value);
+
+  /**
+   * Returns the value of the '<em><b>Value</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Value</em>' attribute.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getResourceChange_Value()
+   * @model many="false" transient="true" changeable="false" volatile="true" derived="true"
+   * @generated
+   */
+  EList<?> getValue();
+
+  /**
+   * Returns the value of the '<em><b>List Changes</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.emf.ecore.change.ListChange}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>List Changes</em>' containment reference list.
+   * @see org.eclipse.emf.ecore.change.ChangePackage#getResourceChange_ListChanges()
+   * @model containment="true"
+   * @generated
+   */
+  EList<ListChange> getListChanges();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void apply();
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @model
+   * @generated
+   */
+  void applyAndReverse();
+
+} // ResourceChange
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/doc-files/ChangeAPI.gif b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/doc-files/ChangeAPI.gif
new file mode 100644
index 0000000..c22d7f7
Binary files /dev/null and b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/doc-files/ChangeAPI.gif differ
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeDescriptionImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeDescriptionImpl.java
new file mode 100644
index 0000000..6cc1c45
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeDescriptionImpl.java
@@ -0,0 +1,718 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeDescriptionImpl.java,v 1.21 2008/05/04 17:03:41 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.change.ResourceChange;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectEList;
+import org.eclipse.emf.ecore.util.EcoreEMap;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Description</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectChanges <em>Object Changes</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectsToDetach <em>Objects To Detach</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectsToAttach <em>Objects To Attach</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getResourceChanges <em>Resource Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ChangeDescriptionImpl extends EObjectImpl implements ChangeDescription
+{
+  /**
+   * The cached value of the '{@link #getObjectChanges() <em>Object Changes</em>}' map.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getObjectChanges()
+   * @generated
+   * @ordered
+   */
+  protected EMap<EObject, EList<FeatureChange>> objectChanges;
+
+  /**
+   * The cached value of the '{@link #getObjectsToDetach() <em>Objects To Detach</em>}' reference list.
+   * <!-- begin-user-doc -->
+   * The Objects to Detach list is first calculated when the {@link #getObjectsToDetach()}
+   * method is invoked and reset when new changes are described.
+   * <!-- end-user-doc -->
+   * @see #getObjectsToDetach()
+   * @generated
+   * @ordered
+   */
+  protected EList<EObject> objectsToDetach;
+  
+  /**
+   * The cached value of the '{@link #getObjectsToAttach() <em>Objects To Attach</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getObjectsToAttach()
+   * @generated
+   * @ordered
+   */
+  protected EList<EObject> objectsToAttach;
+
+  /**
+   * The cached value of the '{@link #getResourceChanges() <em>Resource Changes</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getResourceChanges()
+   * @generated
+   * @ordered
+   */
+  protected EList<ResourceChange> resourceChanges;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ChangeDescriptionImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.CHANGE_DESCRIPTION;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EMap<EObject, EList<FeatureChange>> getObjectChanges()
+  {
+    if (objectChanges == null)
+    {
+      objectChanges = new EcoreEMap<EObject,EList<FeatureChange>>(ChangePackage.Literals.EOBJECT_TO_CHANGES_MAP_ENTRY, EObjectToChangesMapEntryImpl.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES);
+    }
+    return objectChanges;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<EObject> getObjectsToDetachGen()
+  {
+    if (objectsToDetach == null)
+    {
+      objectsToDetach = new EObjectEList<EObject>(EObject.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH);
+    }
+    return objectsToDetach;
+  }
+
+  protected static List<EObject> getContainedEObjects(List<FeatureMap.Entry> featureMapEntries)
+  {
+    List<EObject> result = new ArrayList<EObject>();
+    for (FeatureMap.Entry entry : featureMapEntries)
+    {
+      EStructuralFeature feature = entry.getEStructuralFeature();
+      if (feature instanceof EReference && ((EReference)feature).isContainment())
+      {
+        result.add((EObject)entry.getValue()); 
+      }
+    }
+    return result;
+  }
+
+  public EList<EObject> getObjectsToDetach()
+  {
+    List<EObject> objectsBeforeChange = new UniqueEList.FastCompare<EObject>();
+    List<EObject> objectsAfterChange = new UniqueEList.FastCompare<EObject>();
+
+    if (!getObjectChanges().isEmpty())
+    {
+      preApply(false);
+
+      for (Map.Entry<EObject,EList<FeatureChange>> entry : getObjectChanges())
+      {
+        EObject objectToChange = entry.getKey(); 
+        for (FeatureChange featureChange : entry.getValue())
+        {
+          EStructuralFeature feature = featureChange.getFeature();
+          if (feature != null && FeatureMapUtil.isFeatureMap(feature))
+          {
+            @SuppressWarnings("unchecked") List<FeatureMap.Entry> beforeValue = (List<FeatureMap.Entry>)featureChange.getValue();
+            objectsBeforeChange.addAll(getContainedEObjects(beforeValue));
+            @SuppressWarnings("unchecked") 
+            List<FeatureMap.Entry> afterValue = (List<FeatureMap.Entry>)objectToChange.eGet(feature);
+            objectsAfterChange.addAll(getContainedEObjects(afterValue));
+          }
+          else if (feature instanceof EReference && ((EReference)feature).isContainment())
+          {
+            if (feature.isMany())
+            {
+              @SuppressWarnings("unchecked") List<EObject> beforeValue = (List<EObject>)featureChange.getValue();
+              objectsBeforeChange.addAll(beforeValue);
+              @SuppressWarnings("unchecked") List<EObject> afterValue = (List<EObject>)objectToChange.eGet(feature);
+              objectsAfterChange.addAll(afterValue);
+            }
+            else
+            {
+              Object value = featureChange.getValue();
+              if (value != null) objectsBeforeChange.add((EObject)value);
+              value = objectToChange.eGet(feature);
+              if (value != null) objectsAfterChange.add((EObject)value);
+            }
+          }
+        }
+      }
+    }
+    
+    if (!getResourceChanges().isEmpty())
+    {
+      for (ResourceChange resourceChange : getResourceChanges())
+      {
+        Resource resource = resourceChange.getResource();
+        if (resource == null)
+        {
+          resource = eResource();
+        }
+        
+        if (resource != null)
+        {
+          EList<EObject> currentContentCopy = new BasicEList<EObject>(resource.getContents());
+          for (ListChange listChange : resourceChange.getListChanges())
+          {
+            @SuppressWarnings("unchecked") EList<Object> list = (EList<Object>)(EList<?>)currentContentCopy;
+            listChange.apply(list);
+          }
+        
+          objectsBeforeChange.addAll(currentContentCopy);
+          objectsAfterChange.addAll(resource.getContents());
+        }
+      }
+    }
+    
+    // Isolating the new objects
+    objectsAfterChange.removeAll(objectsBeforeChange);
+    
+    // getObjectsToDetachGen() should be changed only if required
+    getObjectsToDetachGen().retainAll(objectsAfterChange);
+    getObjectsToDetachGen().addAll(objectsAfterChange);
+    
+    return getObjectsToDetachGen();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<EObject> getObjectsToAttach()
+  {
+    if (objectsToAttach == null)
+    {
+      objectsToAttach = new EObjectContainmentEList<EObject>(EObject.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH);
+    }
+    return objectsToAttach;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<ResourceChange> getResourceChanges()
+  {
+    if (resourceChanges == null)
+    {
+      resourceChanges = new EObjectContainmentEList<ResourceChange>(ResourceChange.class, this, ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES);
+    }
+    return resourceChanges;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void apply()
+  {
+    preApply(false);
+
+    // Apply the change.
+    //
+    for (Map.Entry<EObject,EList<FeatureChange>> entry : getObjectChanges())
+    {
+      EObject objectToChange = entry.getKey();
+      for (FeatureChange featureChange : entry.getValue())
+      {
+        featureChange.apply(objectToChange);
+      }
+    }
+
+    for (ResourceChange resourceChange : getResourceChanges())
+    {
+      resourceChange.apply();
+    }
+
+    // Delete the change information because it is invalid now that the objects have been changed.
+    //
+    getObjectsToAttach().clear();
+    getObjectChanges().clear();
+    getResourceChanges().clear();
+    oldContainmentInformation = null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void applyAndReverse()
+  {
+    preApply(true);
+    
+    List<EObject> objectsBeforeApply = new UniqueEList.FastCompare<EObject>();
+    List<EObject> objectsAfterApply = new UniqueEList.FastCompare<EObject>();
+    
+    // Apply the change and reverse the change information.
+    //
+    for (Map.Entry<EObject, EList<FeatureChange>> entry : getObjectChanges())
+    {
+      EObject objectToChange = entry.getKey();
+      for (FeatureChange featureChange : entry.getValue())
+      {
+        EStructuralFeature feature  = featureChange.getFeature();
+
+        int featureKind = 
+          feature != null && FeatureMapUtil.isFeatureMap(feature) ?
+            3 :
+            feature instanceof EReference && ((EReference)feature).isContainment() ? 
+              feature.isMany() ? 
+                1 : 
+                2 : 
+            0;
+        switch (featureKind)
+        {
+          case 1:
+          {
+            @SuppressWarnings("unchecked") List<EObject> beforeValue = (List<EObject>)objectToChange.eGet(feature);
+            objectsBeforeApply.addAll(beforeValue);
+            break;
+          }
+          case 2:
+          {
+            Object value = objectToChange.eGet(feature);
+            if (value != null)
+            {
+              objectsBeforeApply.add((EObject)objectToChange.eGet(feature));
+            }
+            break;
+          }            
+          case 3:
+          {
+            @SuppressWarnings("unchecked") List<FeatureMap.Entry> beforeValue = (List<FeatureMap.Entry>)objectToChange.eGet(feature);
+            objectsBeforeApply.addAll(getContainedEObjects(beforeValue));
+            break;
+          }
+        }
+               
+        featureChange.applyAndReverse(objectToChange);
+        
+        switch (featureKind)
+        {
+          case 1:
+          {
+            @SuppressWarnings("unchecked") List<EObject> afterValue = (List<EObject>)objectToChange.eGet(feature);
+            objectsAfterApply.addAll(afterValue);
+            break;
+          }
+          case 2:
+          {
+            Object value = objectToChange.eGet(feature);
+            if (value != null)
+            {
+              objectsAfterApply.add((EObject)objectToChange.eGet(feature));
+            }
+            break;
+          }            
+          case 3:
+          {
+            @SuppressWarnings("unchecked") List<FeatureMap.Entry> afterValue = (List<FeatureMap.Entry>)objectToChange.eGet(feature);
+            objectsAfterApply.addAll(getContainedEObjects(afterValue));
+            break;
+          }
+        }
+      }
+    }
+
+    for (ResourceChange resourceChange : getResourceChanges())
+    {
+      Resource resource = resourceChange.getResource();
+      if (resource != null)
+      {
+        objectsBeforeApply.addAll(resource.getContents());
+      }
+      resourceChange.applyAndReverse();
+      if (resource != null)
+      {
+        objectsAfterApply.addAll(resource.getContents());
+      }
+    }
+    
+    // The next line leaves objectsBeforeApply with all the objects that were
+    // added during the last recording.
+    objectsBeforeApply.removeAll(objectsAfterApply);
+    
+    // Reverse the objects to attach and detach lists.
+    //
+    getObjectsToAttach().clear();
+    for (EObject eObject : objectsBeforeApply)
+    {
+      if (eObject.eContainer() == null && eObject.eResource() == null)
+      {
+        getObjectsToAttach().add(eObject);
+      }
+    }
+    oldContainmentInformation = null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
+        return ((InternalEList<?>)getObjectChanges()).basicRemove(otherEnd, msgs);
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
+        return ((InternalEList<?>)getObjectsToAttach()).basicRemove(otherEnd, msgs);
+      case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
+        return ((InternalEList<?>)getResourceChanges()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  protected void preApply(boolean reverse)
+  {
+    // Make sure the changed values of bidirectional reference lists are cached before we
+    //  start to apply the change.
+    //
+    for (Map.Entry<EObject, EList<FeatureChange>> entry : getObjectChanges())
+    {
+      EObject objectToChange = entry.getKey();
+      @SuppressWarnings("unchecked") EList<FeatureChangeImpl> value = (EList<FeatureChangeImpl>)(EList<?>)entry.getValue();
+      for (FeatureChangeImpl featureChange : value)
+      {
+        featureChange.preApply(objectToChange, reverse);
+        if (reverse || featureChange.isSet())
+        {
+          EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)featureChange.getFeature();
+          if (internalFeature != null &&
+                (internalFeature.isFeatureMap() ||
+                  (internalFeature.isMany() && (internalFeature.getEOpposite() != null || internalFeature.isContainment()))))
+          {
+            if (reverse)
+            {
+              // This case will be handled special during apply
+              //
+              EList<Object> applyToList = new BasicEList<Object>((EList<?>)objectToChange.eGet(internalFeature));
+              for (ListChange listChange : featureChange.getListChanges())
+              {
+                listChange.applyAndReverse(applyToList);
+              }
+              featureChange.setValue(applyToList); // caches the list value.
+            }
+            else
+            {
+              featureChange.getValue(); // caches the list value.
+            }
+          }
+        }
+      }
+    }
+    
+    if (resourceChanges != null)
+    {
+      @SuppressWarnings("unchecked") EList<ResourceChangeImpl> resourceChanges = (EList)getResourceChanges();
+      for (ResourceChangeImpl resourceChange : resourceChanges)
+      {
+        Resource resource = resourceChange.getResource();
+        if (resource != null)
+        {
+          resourceChange.preApply(reverse);
+          if (reverse)
+          {
+            EList<Object> applyToList = new BasicEList<Object>(resourceChange.getResource().getContents());
+            for (ListChange listChange : resourceChange.getListChanges())
+            {
+              listChange.applyAndReverse(applyToList);
+            }
+            resourceChange.setValue(applyToList); // caches the list value.
+          }
+          else
+          {
+            resourceChange.getValue(); // caches the list value.
+          }
+        }
+      }
+    }
+  }
+
+  protected Map<EObject, OldContainmentInformation> oldContainmentInformation;
+
+  protected static class OldContainmentInformation
+  {
+    public EObject container;
+    public EReference containmentFeature;
+
+    public OldContainmentInformation(EObject container, EReference containmentFeature)
+    {
+      this.container = container;
+      this.containmentFeature = containmentFeature;
+    }
+  }
+
+  protected Map<EObject, OldContainmentInformation> getOldContainmentInformation()
+  {
+    if (oldContainmentInformation == null)
+    {
+      HashMap<EObject, OldContainmentInformation> containmentInformation = new HashMap<EObject, OldContainmentInformation>();
+      for (Map.Entry<EObject, EList<FeatureChange>> entry : getObjectChanges())
+      {
+        List<FeatureChange> featureChanges = entry.getValue();
+        for (FeatureChange featureChange : featureChanges)
+        {
+          EStructuralFeature feature = featureChange.getFeature();
+          if (FeatureMapUtil.isFeatureMap(feature))
+          {
+            EObject container = entry.getKey();
+            @SuppressWarnings("unchecked") List<FeatureMap.Entry> featureMap = (List<FeatureMap.Entry>)featureChange.getValue();
+            for (FeatureMap.Entry featureMapEntry : featureMap)
+            {
+              EStructuralFeature featureMapEntryFeature = featureMapEntry.getEStructuralFeature();
+              if (featureMapEntryFeature instanceof EReference && ((EReference)featureMapEntryFeature).isContainment())
+              {
+                EObject eObject = (EObject)featureMapEntry.getValue();
+                if (eObject != null && (eObject.eContainer() != container || eObject.eContainmentFeature() != featureMapEntryFeature))
+                {
+                  containmentInformation.put(eObject, new OldContainmentInformation(container, (EReference)featureMapEntryFeature));
+                }
+              }
+            }
+          }
+          else if (feature instanceof EReference && ((EReference)feature).isContainment())
+          {
+            EObject container = entry.getKey();
+            if (feature.isMany())
+            {
+              @SuppressWarnings("unchecked") List<EObject> list = ((List<EObject>)featureChange.getValue());
+              for (EObject eObject : list)
+              {
+                if (eObject.eContainer() != container || eObject.eContainmentFeature() != feature)
+                {
+                  containmentInformation.put(eObject, new OldContainmentInformation(container, (EReference)feature));
+                }
+              }
+            }
+            else
+            {
+              EObject eObject = (EObject)featureChange.getValue();
+              if (eObject != null && (eObject.eContainer() != container || eObject.eContainmentFeature() != feature))
+              {
+                containmentInformation.put(eObject, new OldContainmentInformation(container, (EReference)feature));
+              }
+            }
+          }
+        }
+      }
+
+      for (EObject eObject : getObjectsToDetach())
+      {
+        containmentInformation.put(eObject, new OldContainmentInformation(null, null));
+      }
+      oldContainmentInformation = containmentInformation;
+    }
+
+    return oldContainmentInformation;
+  }
+
+  public EObject getOldContainer(EObject eObject)
+  {
+    OldContainmentInformation oldContainmentInformation = getOldContainmentInformation().get(eObject);
+    if (oldContainmentInformation == null)
+    {
+      return eObject.eContainer();
+    }
+    else
+    {
+      return oldContainmentInformation.container;
+    }
+  }
+
+  public EReference getOldContainmentFeature(EObject eObject)
+  {
+    OldContainmentInformation oldContainmentInformation = getOldContainmentInformation().get(eObject);
+    if (oldContainmentInformation == null)
+    {
+      return eObject.eContainmentFeature();
+    }
+    else
+    {
+      return oldContainmentInformation.containmentFeature;
+    }
+  }
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
+        if (coreType) return getObjectChanges();
+        else return getObjectChanges().map();
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
+        return getObjectsToDetach();
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
+        return getObjectsToAttach();
+      case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
+        return getResourceChanges();
+    }
+    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 ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
+        ((EStructuralFeature.Setting)getObjectChanges()).set(newValue);
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
+        getObjectsToDetach().clear();
+        getObjectsToDetach().addAll((Collection<? extends EObject>)newValue);
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
+        getObjectsToAttach().clear();
+        getObjectsToAttach().addAll((Collection<? extends EObject>)newValue);
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
+        getResourceChanges().clear();
+        getResourceChanges().addAll((Collection<? extends ResourceChange>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
+        getObjectChanges().clear();
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
+        getObjectsToDetach().clear();
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
+        getObjectsToAttach().clear();
+        return;
+      case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
+        getResourceChanges().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
+        return objectChanges != null && !objectChanges.isEmpty();
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
+        return objectsToDetach != null && !objectsToDetach.isEmpty();
+      case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
+        return objectsToAttach != null && !objectsToAttach.isEmpty();
+      case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
+        return resourceChanges != null && !resourceChanges.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+} //ChangeDescriptionImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeFactoryImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeFactoryImpl.java
new file mode 100644
index 0000000..6834fa0
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangeFactoryImpl.java
@@ -0,0 +1,268 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeFactoryImpl.java,v 1.9 2006/12/29 18:21:50 marcelop Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.change.*;
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.emf.ecore.resource.Resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ChangeFactoryImpl extends EFactoryImpl implements ChangeFactory
+{
+  /**
+   * Creates the default factory implementation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static ChangeFactory init()
+  {
+    try
+    {
+      ChangeFactory theChangeFactory = (ChangeFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/emf/2003/Change"); 
+      if (theChangeFactory != null)
+      {
+        return theChangeFactory;
+      }
+    }
+    catch (Exception exception)
+    {
+      EcorePlugin.INSTANCE.log(exception);
+    }
+    return new ChangeFactoryImpl();
+  }
+
+  /**
+   * Creates an instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeFactoryImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EObject create(EClass eClass)
+  {
+    switch (eClass.getClassifierID())
+    {
+      case ChangePackage.CHANGE_DESCRIPTION: return createChangeDescription();
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY: return (EObject)createEObjectToChangesMapEntry();
+      case ChangePackage.FEATURE_CHANGE: return createFeatureChange();
+      case ChangePackage.LIST_CHANGE: return createListChange();
+      case ChangePackage.RESOURCE_CHANGE: return createResourceChange();
+      case ChangePackage.FEATURE_MAP_ENTRY: return createFeatureMapEntry();
+      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 ChangePackage.CHANGE_KIND:
+        return createChangeKindFromString(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 ChangePackage.CHANGE_KIND:
+        return convertChangeKindToString(eDataType, instanceValue);
+      default:
+        throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeDescription createChangeDescription()
+  {
+    ChangeDescriptionImpl changeDescription = new ChangeDescriptionImpl();
+    return changeDescription;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Map.Entry<EObject, EList<FeatureChange>> createEObjectToChangesMapEntry()
+  {
+    EObjectToChangesMapEntryImpl eObjectToChangesMapEntry = new EObjectToChangesMapEntryImpl();
+    return eObjectToChangesMapEntry;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public FeatureChange createFeatureChange()
+  {
+    FeatureChangeImpl featureChange = new FeatureChangeImpl();
+    return featureChange;
+  }
+
+  public FeatureChange createFeatureChange(EStructuralFeature feature, Object oldValue, boolean oldIsSet)
+  {
+    FeatureChangeImpl featureChange = new FeatureChangeImpl(feature, oldValue, oldIsSet);
+    return featureChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ListChange createListChange()
+  {
+    ListChangeImpl listChange = new ListChangeImpl();
+    return listChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ResourceChange createResourceChange()
+  {
+    ResourceChangeImpl resourceChange = new ResourceChangeImpl();
+    return resourceChange;
+  }
+
+  public ResourceChange createResourceChange(Resource resource, EList<Object> oldValue)
+  {
+    ResourceChangeImpl resourceChange = new ResourceChangeImpl(resource, oldValue);
+    return resourceChange;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public FeatureMapEntry createFeatureMapEntry()
+  {
+    FeatureMapEntryImpl featureMapEntry = new FeatureMapEntryImpl();
+    return featureMapEntry;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeKind createChangeKindFromString(EDataType eDataType, String initialValue)
+  {
+    ChangeKind result = ChangeKind.get(initialValue);
+    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+    return result;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String convertChangeKindToString(EDataType eDataType, Object instanceValue)
+  {
+    return instanceValue == null ? null : instanceValue.toString();
+  }
+
+  public FeatureMapEntry createFeatureMapEntry(EStructuralFeature feature, Object value)
+  {
+    FeatureMapEntryImpl featureMapEntry = new FeatureMapEntryImpl(feature, value);
+    return featureMapEntry;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangePackage getChangePackage()
+  {
+    return (ChangePackage)getEPackage();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @deprecated
+   * @generated
+   */
+  @Deprecated
+  public static ChangePackage getPackage()
+  {
+    return ChangePackage.eINSTANCE;
+  }
+
+  public Map.Entry<EObject, EList<FeatureChange>> createEObjectToChangesMapEntry(EObject eObject)
+  {
+    EObjectToChangesMapEntryImpl eObjectToChangesMapEntry = new EObjectToChangesMapEntryImpl();
+    eObjectToChangesMapEntry.setKey(eObject);
+    return eObjectToChangesMapEntry;
+  }
+
+} //ChangeFactoryImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangePackageImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangePackageImpl.java
new file mode 100644
index 0000000..6a5d130
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ChangePackageImpl.java
@@ -0,0 +1,768 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangePackageImpl.java,v 1.18 2009/05/12 15:54:41 davidms Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.FeatureMapEntry;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.change.ResourceChange;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+import org.eclipse.emf.ecore.util.EObjectValidator;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ChangePackageImpl extends EPackageImpl implements ChangePackage
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass changeDescriptionEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass eObjectToChangesMapEntryEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass featureChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass listChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass resourceChangeEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass featureMapEntryEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EEnum changeKindEEnum = 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.ecore.change.ChangePackage#eNS_URI
+   * @see #init()
+   * @generated
+   */
+  private ChangePackageImpl()
+  {
+    super(eNS_URI, ChangeFactory.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 ChangePackage#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 ChangePackage initGen()
+  {
+    if (isInited) return (ChangePackage)EPackage.Registry.INSTANCE.getEPackage(ChangePackage.eNS_URI);
+
+    // Obtain or create and register package
+    ChangePackageImpl theChangePackage = (ChangePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ChangePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ChangePackageImpl());
+
+    isInited = true;
+
+    // Initialize simple dependencies
+    EcorePackage.eINSTANCE.eClass();
+
+    // Create package meta-data objects
+    theChangePackage.createPackageContents();
+
+    // Initialize created meta-data
+    theChangePackage.initializePackageContents();
+
+    // Mark meta-data to indicate it can't be changed
+    theChangePackage.freeze();
+
+  
+    // Update the registry and return the package
+    EPackage.Registry.INSTANCE.put(ChangePackage.eNS_URI, theChangePackage);
+    return theChangePackage;
+  }
+
+  public static ChangePackage init()
+  {
+    final ChangePackage changePackage = initGen();
+
+    // Register package validator
+    //
+    EValidator.Registry.INSTANCE.put
+      (changePackage, 
+       new EValidator.Descriptor()
+       {
+         public EValidator getEValidator()
+         {
+           return
+             new EObjectValidator()
+             {
+               @Override
+               protected EPackage getEPackage()
+               {
+                 return changePackage;
+               }
+
+               @Override
+               protected boolean validate_MultiplicityConforms
+                 (EObject eObject, EStructuralFeature eStructuralFeature, DiagnosticChain diagnostics, Map<Object, Object> context)
+               {
+                 // The "feature" feature doesn't have to be set because it can be computed from the feature name.  It only needs to be non-null.
+                 //
+                 return
+                   eStructuralFeature == ChangePackage.Literals.FEATURE_CHANGE__FEATURE && ((FeatureChange)eObject).getFeature() != null ||
+                     super.validate_MultiplicityConforms(eObject, eStructuralFeature, diagnostics, context);
+               }
+             };
+         }
+       });
+    
+    return changePackage;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getChangeDescription()
+  {
+    return changeDescriptionEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChangeDescription_ObjectChanges()
+  {
+    return (EReference)changeDescriptionEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChangeDescription_ObjectsToDetach()
+  {
+    return (EReference)changeDescriptionEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChangeDescription_ObjectsToAttach()
+  {
+    return (EReference)changeDescriptionEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getChangeDescription_ResourceChanges()
+  {
+    return (EReference)changeDescriptionEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getEObjectToChangesMapEntry()
+  {
+    return eObjectToChangesMapEntryEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEObjectToChangesMapEntry_Key()
+  {
+    return (EReference)eObjectToChangesMapEntryEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getEObjectToChangesMapEntry_Value()
+  {
+    return (EReference)eObjectToChangesMapEntryEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getFeatureChange()
+  {
+    return featureChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureChange_FeatureName()
+  {
+    return (EAttribute)featureChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureChange_DataValue()
+  {
+    return (EAttribute)featureChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureChange_Set()
+  {
+    return (EAttribute)featureChangeEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureChange_Value()
+  {
+    return (EAttribute)featureChangeEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeatureChange_Feature()
+  {
+    return (EReference)featureChangeEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeatureChange_ReferenceValue()
+  {
+    return (EReference)featureChangeEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeatureChange_ListChanges()
+  {
+    return (EReference)featureChangeEClass.getEStructuralFeatures().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getListChange()
+  {
+    return listChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getListChange_Kind()
+  {
+    return (EAttribute)listChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getListChange_DataValues()
+  {
+    return (EAttribute)listChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getListChange_Index()
+  {
+    return (EAttribute)listChangeEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getListChange_MoveToIndex()
+  {
+    return (EAttribute)listChangeEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getListChange_Values()
+  {
+    return (EAttribute)listChangeEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getListChange_ReferenceValues()
+  {
+    return (EReference)listChangeEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getListChange_Feature()
+  {
+    return (EReference)listChangeEClass.getEStructuralFeatures().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getListChange_FeatureMapEntryValues()
+  {
+    return (EReference)listChangeEClass.getEStructuralFeatures().get(7);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getResourceChange()
+  {
+    return resourceChangeEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getResourceChange_ResourceURI()
+  {
+    return (EAttribute)resourceChangeEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getResourceChange_Resource()
+  {
+    return (EAttribute)resourceChangeEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getResourceChange_Value()
+  {
+    return (EAttribute)resourceChangeEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getResourceChange_ListChanges()
+  {
+    return (EReference)resourceChangeEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getFeatureMapEntry()
+  {
+    return featureMapEntryEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureMapEntry_FeatureName()
+  {
+    return (EAttribute)featureMapEntryEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureMapEntry_DataValue()
+  {
+    return (EAttribute)featureMapEntryEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getFeatureMapEntry_Value()
+  {
+    return (EAttribute)featureMapEntryEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeatureMapEntry_Feature()
+  {
+    return (EReference)featureMapEntryEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getFeatureMapEntry_ReferenceValue()
+  {
+    return (EReference)featureMapEntryEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EEnum getChangeKind()
+  {
+    return changeKindEEnum;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeFactory getChangeFactory()
+  {
+    return (ChangeFactory)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
+    changeDescriptionEClass = createEClass(CHANGE_DESCRIPTION);
+    createEReference(changeDescriptionEClass, CHANGE_DESCRIPTION__OBJECT_CHANGES);
+    createEReference(changeDescriptionEClass, CHANGE_DESCRIPTION__OBJECTS_TO_DETACH);
+    createEReference(changeDescriptionEClass, CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH);
+    createEReference(changeDescriptionEClass, CHANGE_DESCRIPTION__RESOURCE_CHANGES);
+
+    eObjectToChangesMapEntryEClass = createEClass(EOBJECT_TO_CHANGES_MAP_ENTRY);
+    createEReference(eObjectToChangesMapEntryEClass, EOBJECT_TO_CHANGES_MAP_ENTRY__KEY);
+    createEReference(eObjectToChangesMapEntryEClass, EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE);
+
+    featureChangeEClass = createEClass(FEATURE_CHANGE);
+    createEAttribute(featureChangeEClass, FEATURE_CHANGE__FEATURE_NAME);
+    createEAttribute(featureChangeEClass, FEATURE_CHANGE__DATA_VALUE);
+    createEAttribute(featureChangeEClass, FEATURE_CHANGE__SET);
+    createEAttribute(featureChangeEClass, FEATURE_CHANGE__VALUE);
+    createEReference(featureChangeEClass, FEATURE_CHANGE__FEATURE);
+    createEReference(featureChangeEClass, FEATURE_CHANGE__REFERENCE_VALUE);
+    createEReference(featureChangeEClass, FEATURE_CHANGE__LIST_CHANGES);
+
+    listChangeEClass = createEClass(LIST_CHANGE);
+    createEAttribute(listChangeEClass, LIST_CHANGE__KIND);
+    createEAttribute(listChangeEClass, LIST_CHANGE__DATA_VALUES);
+    createEAttribute(listChangeEClass, LIST_CHANGE__INDEX);
+    createEAttribute(listChangeEClass, LIST_CHANGE__MOVE_TO_INDEX);
+    createEAttribute(listChangeEClass, LIST_CHANGE__VALUES);
+    createEReference(listChangeEClass, LIST_CHANGE__REFERENCE_VALUES);
+    createEReference(listChangeEClass, LIST_CHANGE__FEATURE);
+    createEReference(listChangeEClass, LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES);
+
+    resourceChangeEClass = createEClass(RESOURCE_CHANGE);
+    createEAttribute(resourceChangeEClass, RESOURCE_CHANGE__RESOURCE_URI);
+    createEAttribute(resourceChangeEClass, RESOURCE_CHANGE__RESOURCE);
+    createEAttribute(resourceChangeEClass, RESOURCE_CHANGE__VALUE);
+    createEReference(resourceChangeEClass, RESOURCE_CHANGE__LIST_CHANGES);
+
+    featureMapEntryEClass = createEClass(FEATURE_MAP_ENTRY);
+    createEAttribute(featureMapEntryEClass, FEATURE_MAP_ENTRY__FEATURE_NAME);
+    createEAttribute(featureMapEntryEClass, FEATURE_MAP_ENTRY__DATA_VALUE);
+    createEAttribute(featureMapEntryEClass, FEATURE_MAP_ENTRY__VALUE);
+    createEReference(featureMapEntryEClass, FEATURE_MAP_ENTRY__FEATURE);
+    createEReference(featureMapEntryEClass, FEATURE_MAP_ENTRY__REFERENCE_VALUE);
+
+    // Create enums
+    changeKindEEnum = createEEnum(CHANGE_KIND);
+  }
+
+  /**
+   * <!-- 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
+
+    // Initialize classes and features; add operations and parameters
+    initEClass(changeDescriptionEClass, ChangeDescription.class, "ChangeDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getChangeDescription_ObjectChanges(), this.getEObjectToChangesMapEntry(), null, "objectChanges", null, 0, -1, ChangeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getChangeDescription_ObjectsToDetach(), theEcorePackage.getEObject(), null, "objectsToDetach", null, 0, -1, ChangeDescription.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getChangeDescription_ObjectsToAttach(), theEcorePackage.getEObject(), null, "objectsToAttach", null, 0, -1, ChangeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getChangeDescription_ResourceChanges(), this.getResourceChange(), null, "resourceChanges", null, 0, -1, ChangeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    addEOperation(changeDescriptionEClass, null, "apply", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    addEOperation(changeDescriptionEClass, null, "applyAndReverse", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(eObjectToChangesMapEntryEClass, Map.Entry.class, "EObjectToChangesMapEntry", !IS_ABSTRACT, !IS_INTERFACE, !IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getEObjectToChangesMapEntry_Key(), theEcorePackage.getEObject(), null, "key", null, 1, 1, Map.Entry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getEObjectToChangesMapEntry_Value(), this.getFeatureChange(), null, "value", null, 0, -1, Map.Entry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(featureChangeEClass, FeatureChange.class, "FeatureChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getFeatureChange_FeatureName(), ecorePackage.getEString(), "featureName", null, 0, 1, FeatureChange.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getFeatureChange_DataValue(), ecorePackage.getEString(), "dataValue", null, 0, 1, FeatureChange.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getFeatureChange_Set(), ecorePackage.getEBoolean(), "set", "true", 0, 1, FeatureChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getFeatureChange_Value(), theEcorePackage.getEJavaObject(), "value", null, 0, 1, FeatureChange.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getFeatureChange_Feature(), theEcorePackage.getEStructuralFeature(), null, "feature", null, 1, 1, FeatureChange.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getFeatureChange_ReferenceValue(), theEcorePackage.getEObject(), null, "referenceValue", null, 0, 1, FeatureChange.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getFeatureChange_ListChanges(), this.getListChange(), null, "listChanges", null, 0, -1, FeatureChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    EOperation op = addEOperation(featureChangeEClass, null, "apply", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEObject(), "originalObject", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = addEOperation(featureChangeEClass, null, "applyAndReverse", 0, 1, IS_UNIQUE, IS_ORDERED);
+    addEParameter(op, theEcorePackage.getEObject(), "originalObject", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(listChangeEClass, ListChange.class, "ListChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getListChange_Kind(), this.getChangeKind(), "kind", null, 0, 1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getListChange_DataValues(), ecorePackage.getEString(), "dataValues", null, 0, -1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getListChange_Index(), ecorePackage.getEInt(), "index", "-1", 0, 1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getListChange_MoveToIndex(), ecorePackage.getEInt(), "moveToIndex", null, 0, 1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getListChange_Values(), theEcorePackage.getEJavaObject(), "values", null, 0, -1, ListChange.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getListChange_ReferenceValues(), theEcorePackage.getEObject(), null, "referenceValues", null, 0, -1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getListChange_Feature(), theEcorePackage.getEStructuralFeature(), null, "feature", null, 0, 1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getListChange_FeatureMapEntryValues(), this.getFeatureMapEntry(), null, "featureMapEntryValues", null, 0, -1, ListChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    op = addEOperation(listChangeEClass, null, "apply", 0, 1, IS_UNIQUE, IS_ORDERED);
+    EGenericType g1 = createEGenericType(theEcorePackage.getEEList());
+    EGenericType g2 = createEGenericType(theEcorePackage.getEJavaObject());
+    g1.getETypeArguments().add(g2);
+    addEParameter(op, g1, "originalList", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    op = addEOperation(listChangeEClass, null, "applyAndReverse", 0, 1, IS_UNIQUE, IS_ORDERED);
+    g1 = createEGenericType(theEcorePackage.getEEList());
+    g2 = createEGenericType(theEcorePackage.getEJavaObject());
+    g1.getETypeArguments().add(g2);
+    addEParameter(op, g1, "originalList", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(resourceChangeEClass, ResourceChange.class, "ResourceChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getResourceChange_ResourceURI(), ecorePackage.getEString(), "resourceURI", null, 0, 1, ResourceChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getResourceChange_Resource(), theEcorePackage.getEResource(), "resource", null, 0, 1, ResourceChange.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    g1 = createEGenericType(theEcorePackage.getEEList());
+    g2 = createEGenericType();
+    g1.getETypeArguments().add(g2);
+    initEAttribute(getResourceChange_Value(), g1, "value", null, 0, 1, ResourceChange.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getResourceChange_ListChanges(), this.getListChange(), null, "listChanges", null, 0, -1, ResourceChange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    addEOperation(resourceChangeEClass, null, "apply", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    addEOperation(resourceChangeEClass, null, "applyAndReverse", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+    initEClass(featureMapEntryEClass, FeatureMapEntry.class, "FeatureMapEntry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getFeatureMapEntry_FeatureName(), ecorePackage.getEString(), "featureName", null, 0, 1, FeatureMapEntry.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getFeatureMapEntry_DataValue(), ecorePackage.getEString(), "dataValue", null, 0, 1, FeatureMapEntry.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getFeatureMapEntry_Value(), theEcorePackage.getEJavaObject(), "value", null, 0, 1, FeatureMapEntry.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+    initEReference(getFeatureMapEntry_Feature(), theEcorePackage.getEStructuralFeature(), null, "feature", null, 1, 1, FeatureMapEntry.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getFeatureMapEntry_ReferenceValue(), theEcorePackage.getEObject(), null, "referenceValue", null, 0, 1, FeatureMapEntry.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.ADD_LITERAL);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.REMOVE_LITERAL);
+    addEEnumLiteral(changeKindEEnum, ChangeKind.MOVE_LITERAL);
+
+    // Create resource
+    createResource(eNS_URI);
+  }
+
+} //ChangePackageImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/EObjectToChangesMapEntryImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/EObjectToChangesMapEntryImpl.java
new file mode 100644
index 0000000..896c16e
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/EObjectToChangesMapEntryImpl.java
@@ -0,0 +1,375 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: EObjectToChangesMapEntryImpl.java,v 1.15 2007/02/20 17:43:02 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.BasicEMap;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>EObject To Changes Map Entry</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl#getTypedKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.EObjectToChangesMapEntryImpl#getTypedValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class EObjectToChangesMapEntryImpl extends EObjectImpl implements BasicEMap.Entry<EObject,EList<FeatureChange>>
+{
+  /**
+   * The bit of {@link #eFlags} that is used to represent if key is a proxy.
+   */
+  protected static final int EPROXY_KEY = ELAST_EOBJECT_FLAG << 1;
+  
+  /**
+   * The cached value of the '{@link #getTypedKey() <em>Key</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTypedKey()
+   * @generated
+   * @ordered
+   */
+  protected EObject key;
+
+  /**
+   * The cached value of the '{@link #getTypedValue() <em>Value</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTypedValue()
+   * @generated
+   * @ordered
+   */
+  protected EList<FeatureChange> value;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EObjectToChangesMapEntryImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.EOBJECT_TO_CHANGES_MAP_ENTRY;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EObject getTypedKeyGen()
+  {
+    if (key != null && key.eIsProxy())
+    {
+      InternalEObject oldKey = (InternalEObject)key;
+      key = eResolveProxy(oldKey);
+      if (key != oldKey)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY, oldKey, key));
+      }
+    }
+    return key;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EObject getTypedKey()
+  {
+    if ((eFlags & EPROXY_KEY) != 0)
+    {
+      EObject newKey = getTypedKeyGen();
+      if (!newKey.eIsProxy())
+      {
+        eFlags &= ~EPROXY_KEY;
+      }
+    }
+    return key;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EObject basicGetTypedKey()
+  {
+    return key;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setTypedKeyGen(EObject newKey)
+  {
+    EObject oldKey = key;
+    key = newKey;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY, oldKey, key));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setTypedKey(EObject newKey)
+  {
+    setTypedKeyGen(newKey);
+    if (key != null)
+    {
+      eFlags |= EPROXY_KEY;
+    }
+    else
+    {
+      eFlags &= ~EPROXY_KEY;
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<FeatureChange> getTypedValue()
+  {
+    if (value == null)
+    {
+      value = new EObjectContainmentEList<FeatureChange>(FeatureChange.class, this, ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE);
+    }
+    return value;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE:
+        return ((InternalEList<?>)getTypedValue()).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 ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY:
+        if (resolve) return getTypedKey();
+        return basicGetTypedKey();
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE:
+        return getTypedValue();
+    }
+    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 ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY:
+        setTypedKey((EObject)newValue);
+        return;
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE:
+        getTypedValue().clear();
+        getTypedValue().addAll((Collection<? extends FeatureChange>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY:
+        setTypedKey((EObject)null);
+        return;
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE:
+        getTypedValue().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__KEY:
+        return key != null;
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY__VALUE:
+        return value != null && !value.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected int hash = -1;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public int getHash()
+  {
+    if (hash == -1)
+    {
+      Object theKey = getKey();
+      hash = (theKey == null ? 0 : theKey.hashCode());
+    }
+    return hash;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setHash(int hash)
+  {
+    this.hash = hash;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EObject getKey()
+  {
+    return getTypedKey();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setKey(EObject key)
+  {
+    setTypedKey(key);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<FeatureChange> getValue()
+  {
+    return getTypedValue();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<FeatureChange> setValue(EList<FeatureChange> value)
+  {
+    EList<FeatureChange> oldValue = getValue();
+    getTypedValue().clear();
+    getTypedValue().addAll(value);
+    return oldValue;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  public EMap<EObject, EList<FeatureChange>> getEMap()
+  {
+    EObject container = eContainer();
+    return container == null ? null : (EMap<EObject, EList<FeatureChange>>)container.eGet(eContainmentFeature());
+  }
+
+} //EObjectToChangesMapEntryImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureChangeImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureChangeImpl.java
new file mode 100644
index 0000000..9214c61
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureChangeImpl.java
@@ -0,0 +1,806 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: FeatureChangeImpl.java,v 1.35 2008/12/22 14:26:03 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+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.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.ETypedElement;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Feature Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getFeatureName <em>Feature Name</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getDataValue <em>Data Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#isSet <em>Set</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getReferenceValue <em>Reference Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureChangeImpl#getListChanges <em>List Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FeatureChangeImpl extends EObjectImpl implements FeatureChange
+{
+  /**
+   * The bit of {@link #eFlags} that is used to represent if feature is a proxy.
+   */
+  protected static final int EPROXY_FEATURECHANGE = ELAST_EOBJECT_FLAG << 1;
+  
+  /**
+   * The default value of the '{@link #getFeatureName() <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFeatureName()
+   * @generated
+   * @ordered
+   */
+  protected static final String FEATURE_NAME_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #getDataValue() <em>Data Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getDataValue()
+   * @generated
+   * @ordered
+   */
+  protected static final String DATA_VALUE_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #isSet() <em>Set</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSet()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean SET_EDEFAULT = true;
+
+  /**
+   * The cached value of the '{@link #isSet() <em>Set</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isSet()
+   * @generated
+   * @ordered
+   */
+  protected boolean set = SET_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getValue()
+   * @generated
+   * @ordered
+   */
+  protected static final Object VALUE_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getListChanges() <em>List Changes</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getListChanges()
+   * @generated
+   * @ordered
+   */
+  protected EList<ListChange> listChanges;
+  
+  protected EStructuralFeature feature = null;
+  
+  protected String featureName = null;
+
+  protected Object value = null;
+  
+  protected String valueString = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected FeatureChangeImpl()
+  {
+    super();
+  }
+
+  protected FeatureChangeImpl(EStructuralFeature feature, Object value, boolean isSet)
+  {
+    this();
+    this.feature = feature;
+    setValue(value);
+    this.set = isSet;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.FEATURE_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getFeatureName()
+  {
+    return feature == null ? featureName : feature.getName();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setFeatureName(String newFeatureName)
+  {
+    featureName = newFeatureName;
+    feature = null;
+    eFlags &= ~EPROXY_FEATURECHANGE; 
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void unsetFeatureName()
+  {
+    setFeatureName(null);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public boolean isSetFeatureName()
+  {
+    return 
+      featureName != null ||
+        feature != null &&
+         eContainer() instanceof EObjectToChangesMapEntryImpl;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getDataValue()
+  {
+    if (valueString == null)
+    {
+      EStructuralFeature feature = getFeature();
+      if (feature instanceof EAttribute && !feature.isMany())
+      {
+        EDataType type = (EDataType)feature.getEType();
+        valueString = EcoreUtil.convertToString(type, value);
+      }
+    }
+    return valueString;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setDataValue(String newDataValue)
+  {
+    String oldDataValue = getDataValue();
+    valueString = newDataValue;
+    value = null;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__DATA_VALUE, oldDataValue, newDataValue));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isSet()
+  {
+    return set;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setSet(boolean newSet)
+  {
+    boolean oldSet = set;
+    set = newSet;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__SET, oldSet, set));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EStructuralFeature getFeature()
+  {
+    if (feature == null)
+    {
+      if (featureName != null && eContainer() instanceof EObjectToChangesMapEntryImpl)
+      {
+        feature = ((EObjectToChangesMapEntryImpl)eContainer()).getTypedKey().eClass().getEStructuralFeature(featureName);
+      }
+    }
+    else if ((eFlags & EPROXY_FEATURECHANGE) !=0)
+    {
+      EStructuralFeature oldFeature = feature;
+      feature = (EStructuralFeature)EcoreUtil.resolve(feature, this);
+      if (feature != oldFeature)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, feature));
+      }
+      eFlags &= ~ EPROXY_FEATURECHANGE;
+    }
+    return feature;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EStructuralFeature basicGetFeature()
+  {
+    return feature;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setFeature(EStructuralFeature newFeature)
+  {
+    EStructuralFeature oldFeature = basicGetFeature();
+    feature = newFeature;
+    featureName = null;
+    if (feature != null && feature.eIsProxy())
+      eFlags |= EPROXY_FEATURECHANGE;
+    else 
+      eFlags &= ~EPROXY_FEATURECHANGE;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, newFeature));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void unsetFeature()
+  {
+    setFeature(null);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public boolean isSetFeature()
+  {
+    return feature != null && !(eContainer() instanceof EObjectToChangesMapEntryImpl);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EObject getReferenceValue()
+  {
+    EObject referenceValue = basicGetReferenceValue();
+    if (referenceValue != null && referenceValue.eIsProxy())
+    {
+      EObject oldReferenceValue = referenceValue;
+      referenceValue = EcoreUtil.resolve(referenceValue, this);
+      if (referenceValue != oldReferenceValue)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, referenceValue));
+      }
+    }
+    return referenceValue;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EObject basicGetReferenceValue()
+  {
+    return (feature instanceof EReference && value instanceof EObject) ? (EObject)value : null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setReferenceValue(EObject newReferenceValue)
+  {
+    EObject oldReferenceValue = basicGetReferenceValue();
+    value = newReferenceValue;
+    valueString = null;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, newReferenceValue));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<ListChange> getListChanges()
+  {
+    if (listChanges == null)
+    {
+      listChanges = new EObjectContainmentEList<ListChange>(ListChange.class, this, ChangePackage.FEATURE_CHANGE__LIST_CHANGES);
+    }
+    return listChanges;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Object getValue()
+  {
+    EStructuralFeature feature = getFeature();
+    if (feature.getUpperBound() != 1)
+    {
+      if (value == null && eContainer() instanceof EObjectToChangesMapEntryImpl)
+      {
+        value = getListValue((EList<?>)((EObjectToChangesMapEntryImpl)eContainer()).getTypedKey().eGet(feature));
+      }
+    }
+    else if (feature instanceof EReference)
+    {
+      return getReferenceValue();
+    }
+    else if (value == null) // feature is instance of EAttribute
+    {
+      EDataType type = (EDataType)feature.getEType();
+      value = EcoreUtil.createFromString(type, valueString);
+    }
+    return value;    
+  }
+
+  protected void setValue(Object value)
+  {
+    EStructuralFeature feature = getFeature();
+    if (!eNotificationRequired() || feature.isMany())
+    {
+      valueString = null;
+      this.value = value;
+    }
+    else
+    {
+      if (feature instanceof EAttribute)
+      {
+        EDataType type = (EDataType)feature.getEType();
+        setDataValue(EcoreUtil.convertToString(type, value));
+        this.value = value;
+      }
+      else
+      {
+        setReferenceValue((EObject)value);
+      }
+    }    
+  }
+
+  protected EList<?> getListValue(EList<?> originalList)
+  {
+    if (isSet() && getFeature().getUpperBound() != 1)
+    {
+      if (value instanceof EList<?>) // cached already?
+      {
+        return (EList<?>)value;
+      }
+      
+      EList<Object> changedList =  new BasicEList<Object>(originalList);
+      apply(changedList);
+      value = changedList; // cache result
+      return changedList;
+    }
+    return ECollections.EMPTY_ELIST;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void apply(EObject originalObject)
+  {
+    apply(originalObject, false);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void applyAndReverse(EObject originalObject)
+  {
+    apply(originalObject, true);
+  }
+  
+  protected void apply(EObject originalObject, boolean reverse)
+  {
+    EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)getFeature();
+    if (internalFeature != null && internalFeature.isChangeable() && !internalFeature.isContainer())
+    {
+      if (!isSet())
+      {
+        if (reverse && internalFeature.isMany())
+        {
+          ListChange listChange = createListChange(getListChanges(), ChangeKind.ADD_LITERAL, 0);
+          if (internalFeature.getEOpposite() != null || internalFeature.isContainment())
+          {
+            listChange.getValues().addAll((EList<?>)getValue());
+          }
+          else
+          {
+            listChange.getValues().addAll((EList<?>)originalObject.eGet(internalFeature));
+          }
+        }
+        originalObject.eUnset(internalFeature);
+      }
+      else if (internalFeature.isMany())
+      {
+        if (listChanges != null)
+        {
+          if (internalFeature.isFeatureMap())
+          {
+            FeatureMap.Internal result = (FeatureMap.Internal)originalObject.eGet(internalFeature);
+            @SuppressWarnings("unchecked") EList<FeatureMap.Entry.Internal> prototype = (EList<FeatureMap.Entry.Internal>)getValue();
+            EList<FeatureMap.Entry> featureMapEntryList = new BasicEList<FeatureMap.Entry>(prototype.size());
+            for (FeatureMap.Entry.Internal entry : prototype)
+            {
+              Object entryValue = entry.getValue();
+              // Create a proper feature map entry.
+              //
+              entry = entry.createEntry(entryValue);
+              featureMapEntryList.add(entry);
+              EStructuralFeature entryFeature = entry.getEStructuralFeature();
+              if (!FeatureMapUtil.isMany(originalObject, entry.getEStructuralFeature()))
+              {
+                for (int i = 0, size = result.size(); i < size; ++i)
+                {
+                  if (result.getEStructuralFeature(i) == entryFeature && !(entryValue == null ? result.getValue(i) == null : entryValue.equals(result.getValue(i))))
+                  {
+                    result.set(i, entry);
+                  }
+                }
+              }
+            }
+            ECollections.setEList(result, featureMapEntryList);
+          }
+          else if (internalFeature.isFeatureMap() || internalFeature.getEOpposite() != null || internalFeature.isContainment())
+          {
+            // Bidirectional references need to use this less efficient approach because some
+            //  or all of the changes may already have been made from the other end.
+            //
+            @SuppressWarnings("unchecked") EList<Object> result = (EList<Object>)originalObject.eGet(internalFeature);
+            @SuppressWarnings("unchecked") EList<Object> prototype = (EList<Object>)getValue();
+            ECollections.setEList(result, prototype);
+          }
+          else
+          {
+            @SuppressWarnings("unchecked") EList<Object> applyToList = (EList<Object>)originalObject.eGet(internalFeature);
+            if (reverse)
+            {
+              applyAndReverse(applyToList);
+            }
+            else
+            {
+              apply(applyToList);
+            }
+          }
+          
+          if (reverse)
+          {
+            ECollections.reverse(getListChanges());
+          }
+        }
+      }
+      else 
+      {
+        originalObject.eSet(internalFeature, getValue());
+      }
+      
+      if (reverse)
+      {
+        setSet(newIsSet);
+        setValue(newValue);
+        
+        if (!isSet())
+        {
+          getListChanges().clear();
+        }        
+      }
+    }    
+  }
+  
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_CHANGE__LIST_CHANGES:
+        return ((InternalEList<?>)getListChanges()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  protected boolean newIsSet;
+  protected Object newValue;
+  
+  public void preApply(EObject originalObject, boolean reverse)
+  {
+    if (reverse)
+    {
+      EStructuralFeature feature = getFeature();
+      if (feature == EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES)
+      {
+        newIsSet = !((EClass)originalObject).getEGenericSuperTypes().isEmpty();
+        newValue = null;
+      }
+      else if (feature == EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE)
+      {
+        newValue = ((ETypedElement)originalObject).getEGenericType();                     
+        newIsSet = newValue != null;
+      }
+      else if (feature == EcorePackage.Literals.EOPERATION__EGENERIC_EXCEPTIONS)
+      {
+        newIsSet = !((EOperation)originalObject).getEGenericExceptions().isEmpty();
+        newValue = null;                
+      }
+      else if (feature != null)
+      {
+        newIsSet = originalObject.eIsSet(feature);
+        newValue = feature.isMany() ? null : originalObject.eGet(feature);
+      }
+    }
+  }
+
+  protected void apply(EList<Object> toList)
+  {
+    for (ListChange listChange : getListChanges())
+    {
+      listChange.apply(toList);
+    }
+  }
+
+  protected void applyAndReverse(EList<Object> toList)
+  {
+    for (ListChange listChange : getListChanges())
+    {
+      listChange.applyAndReverse(toList);
+    }
+  }
+  
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_CHANGE__FEATURE_NAME:
+        return getFeatureName();
+      case ChangePackage.FEATURE_CHANGE__DATA_VALUE:
+        return getDataValue();
+      case ChangePackage.FEATURE_CHANGE__SET:
+        return isSet();
+      case ChangePackage.FEATURE_CHANGE__VALUE:
+        return getValue();
+      case ChangePackage.FEATURE_CHANGE__FEATURE:
+        if (resolve) return getFeature();
+        return basicGetFeature();
+      case ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE:
+        if (resolve) return getReferenceValue();
+        return basicGetReferenceValue();
+      case ChangePackage.FEATURE_CHANGE__LIST_CHANGES:
+        return getListChanges();
+    }
+    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 ChangePackage.FEATURE_CHANGE__FEATURE_NAME:
+        setFeatureName((String)newValue);
+        return;
+      case ChangePackage.FEATURE_CHANGE__DATA_VALUE:
+        setDataValue((String)newValue);
+        return;
+      case ChangePackage.FEATURE_CHANGE__SET:
+        setSet((Boolean)newValue);
+        return;
+      case ChangePackage.FEATURE_CHANGE__FEATURE:
+        setFeature((EStructuralFeature)newValue);
+        return;
+      case ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE:
+        setReferenceValue((EObject)newValue);
+        return;
+      case ChangePackage.FEATURE_CHANGE__LIST_CHANGES:
+        getListChanges().clear();
+        getListChanges().addAll((Collection<? extends ListChange>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_CHANGE__FEATURE_NAME:
+        unsetFeatureName();
+        return;
+      case ChangePackage.FEATURE_CHANGE__DATA_VALUE:
+        setDataValue(DATA_VALUE_EDEFAULT);
+        return;
+      case ChangePackage.FEATURE_CHANGE__SET:
+        setSet(SET_EDEFAULT);
+        return;
+      case ChangePackage.FEATURE_CHANGE__FEATURE:
+        unsetFeature();
+        return;
+      case ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE:
+        setReferenceValue((EObject)null);
+        return;
+      case ChangePackage.FEATURE_CHANGE__LIST_CHANGES:
+        getListChanges().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_CHANGE__FEATURE_NAME:
+        return isSetFeatureName();
+      case ChangePackage.FEATURE_CHANGE__DATA_VALUE:
+        return DATA_VALUE_EDEFAULT == null ? getDataValue() != null : !DATA_VALUE_EDEFAULT.equals(getDataValue());
+      case ChangePackage.FEATURE_CHANGE__SET:
+        return set != SET_EDEFAULT;
+      case ChangePackage.FEATURE_CHANGE__VALUE:
+        return VALUE_EDEFAULT == null ? getValue() != null : !VALUE_EDEFAULT.equals(getValue());
+      case ChangePackage.FEATURE_CHANGE__FEATURE:
+        return isSetFeature();
+      case ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE:
+        return basicGetReferenceValue() != null;
+      case ChangePackage.FEATURE_CHANGE__LIST_CHANGES:
+        return listChanges != null && !listChanges.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (set: ");
+    result.append(set);
+    result.append(')');
+    return result.toString();
+  }
+
+  protected ListChange createListChange(EList<ListChange> changesList, ChangeKind kind, int index)
+  {
+    ListChange listChange = ChangeFactory.eINSTANCE.createListChange();
+    listChange.setKind(kind);
+    listChange.setIndex(index);
+    changesList.add(listChange);
+    return listChange;
+  }
+} //FeatureChangeImpl
\ No newline at end of file
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureMapEntryImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureMapEntryImpl.java
new file mode 100644
index 0000000..7e7bee3
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/FeatureMapEntryImpl.java
@@ -0,0 +1,561 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: FeatureMapEntryImpl.java,v 1.10 2007/02/12 18:51:43 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureMapEntry;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.FeatureMap;
+//import org.eclipse.emf.ecore.InternalEObject;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Feature Map Entry</b></em>'.
+ * @extends FeatureMap.Entry.Internal
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getFeatureName <em>Feature Name</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getDataValue <em>Data Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getReferenceValue <em>Reference Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FeatureMapEntryImpl extends EObjectImpl implements FeatureMapEntry, FeatureMap.Entry.Internal
+{
+  /**
+   * The bit of {@link #eFlags} that is used to represent if feature is a proxy.
+   */
+  protected static final int EPROXY_FEATURECHANGE = ELAST_EOBJECT_FLAG << 1;
+  
+  /**
+   * The default value of the '{@link #getFeatureName() <em>Feature Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFeatureName()
+   * @generated
+   * @ordered
+   */
+  protected static final String FEATURE_NAME_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #getDataValue() <em>Data Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getDataValue()
+   * @generated
+   * @ordered
+   */
+  protected static final String DATA_VALUE_EDEFAULT = null;
+
+  /**
+   * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getValue()
+   * @generated
+   * @ordered
+   */
+  protected static final Object VALUE_EDEFAULT = null;
+
+  protected EStructuralFeature feature = null;
+  
+  protected String featureName = null;
+
+  protected Object value = null;
+  
+  protected String valueString = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected FeatureMapEntryImpl()
+  {
+    super();
+  }
+
+  protected FeatureMapEntryImpl(EStructuralFeature feature, Object value)
+  {
+    this();
+    this.feature = feature;
+    setValue(value);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.FEATURE_MAP_ENTRY;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getFeatureName()
+  {
+    return feature == null ? featureName : feature.getName();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setFeatureName(String newFeatureName)
+  {
+    featureName = newFeatureName;
+    feature = null;
+    eFlags &= ~EPROXY_FEATURECHANGE; 
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void unsetFeatureName()
+  {
+    setFeatureName(null);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public boolean isSetFeatureName()
+  {
+    if (featureName != null)
+    {
+      return true;
+    }
+    else if (feature == null)
+    {
+      return false;
+    }
+    else
+    {
+      EObject greatGrandParent = getGreatGrandParent();
+      return
+        greatGrandParent instanceof EObjectToChangesMapEntryImpl &&
+          ((EObjectToChangesMapEntryImpl)greatGrandParent).getTypedKey().eClass().getEAllStructuralFeatures().contains(feature);
+    }
+  }
+  
+  protected EObject getGreatGrandParent()
+  {
+    EObject container = eContainer();
+    if (container != null)
+    {
+      container = container.eContainer();
+      if (container != null)
+      {
+        return container.eContainer();
+      }
+    }
+    return  null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public String getDataValue()
+  {
+    if (valueString == null)
+    {
+      EStructuralFeature feature = getFeature();
+      if (feature instanceof EAttribute)
+      {
+        EDataType type = (EDataType)feature.getEType();
+        valueString = EcoreUtil.convertToString(type, value);
+      }
+    }
+    return valueString;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setDataValue(String newDataValue)
+  {
+    String oldDataValue = getDataValue();
+    valueString = newDataValue;
+    value = null;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__DATA_VALUE, oldDataValue, newDataValue));
+  }
+  
+  public EStructuralFeature getEStructuralFeature()
+  {
+    return getFeature();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EStructuralFeature getFeature()
+  {
+    if (feature == null)
+    {
+      EObject greatGrandParent = getGreatGrandParent();
+      if (greatGrandParent instanceof EObjectToChangesMapEntryImpl)
+      {
+        feature = ((EObjectToChangesMapEntryImpl)greatGrandParent).getKey().eClass().getEStructuralFeature(featureName);
+      }
+    }
+    else if ((eFlags & EPROXY_FEATURECHANGE) !=0)
+    {
+      EStructuralFeature oldFeature = feature;
+      feature = (EStructuralFeature)EcoreUtil.resolve(feature, this);
+      if (feature != oldFeature)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, feature));
+      }
+      eFlags &= ~ EPROXY_FEATURECHANGE;
+    }
+    return feature;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EStructuralFeature basicGetFeature()
+  {
+    return feature;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setFeature(EStructuralFeature newFeature)
+  {
+    EStructuralFeature oldFeature = basicGetFeature();
+    feature = newFeature;
+    featureName = null;
+    if (feature != null && feature.eIsProxy())
+      eFlags |= EPROXY_FEATURECHANGE;
+    else 
+      eFlags &= ~EPROXY_FEATURECHANGE;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, newFeature));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void unsetFeature()
+  {
+    setFeature(null);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public boolean isSetFeature()
+  {
+    if (feature == null)
+    {
+      return false;
+    }
+    else
+    {
+      EObject greatGrandParent = getGreatGrandParent();
+      return 
+        !(greatGrandParent instanceof EObjectToChangesMapEntryImpl) ||
+          !((EObjectToChangesMapEntryImpl)greatGrandParent).getTypedKey().eClass().getEAllStructuralFeatures().contains(feature);
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EObject getReferenceValue()
+  {
+    EObject referenceValue = basicGetReferenceValue();
+    if (referenceValue != null && referenceValue.eIsProxy())
+    {
+      EObject oldReferenceValue = referenceValue;
+      referenceValue = EcoreUtil.resolve(referenceValue, this);
+      if (referenceValue != oldReferenceValue)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, referenceValue));
+      }
+    }
+    return referenceValue;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EObject basicGetReferenceValue()
+  {
+    return feature instanceof EReference ? (EObject)value : null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setReferenceValue(EObject newReferenceValue)
+  {
+    EObject oldReferenceValue = basicGetReferenceValue();
+    value = newReferenceValue;
+    valueString = null;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, newReferenceValue));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
+        return getFeatureName();
+      case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
+        return getDataValue();
+      case ChangePackage.FEATURE_MAP_ENTRY__VALUE:
+        return getValue();
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
+        if (resolve) return getFeature();
+        return basicGetFeature();
+      case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
+        if (resolve) return getReferenceValue();
+        return basicGetReferenceValue();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
+        setFeatureName((String)newValue);
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
+        setDataValue((String)newValue);
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
+        setFeature((EStructuralFeature)newValue);
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
+        setReferenceValue((EObject)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
+        unsetFeatureName();
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
+        setDataValue(DATA_VALUE_EDEFAULT);
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
+        unsetFeature();
+        return;
+      case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
+        setReferenceValue((EObject)null);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
+        return isSetFeatureName();
+      case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
+        return DATA_VALUE_EDEFAULT == null ? getDataValue() != null : !DATA_VALUE_EDEFAULT.equals(getDataValue());
+      case ChangePackage.FEATURE_MAP_ENTRY__VALUE:
+        return VALUE_EDEFAULT == null ? getValue() != null : !VALUE_EDEFAULT.equals(getValue());
+      case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
+        return isSetFeature();
+      case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
+        return basicGetReferenceValue() != null;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Object getValue()
+  {
+    EStructuralFeature feature = getFeature();
+    if (feature instanceof EReference)
+    {
+      return getReferenceValue();
+    }
+    else if (value == null) // feature is instance of EAttribute
+    {
+      EDataType type = (EDataType)feature.getEType();
+      value = EcoreUtil.createFromString(type, valueString);
+    }
+    return value;    
+  }
+
+  protected void setValue(Object value)
+  {
+    EStructuralFeature feature = getFeature();
+    if (!eNotificationRequired())
+    {
+      valueString = null;
+      this.value = value;
+    }
+    else
+    {
+      if (feature instanceof EAttribute)
+      {
+        EDataType type = (EDataType)feature.getEType();
+        setDataValue(valueString = EcoreUtil.convertToString(type, value));
+        this.value = value;
+      }
+      else
+      {
+        setReferenceValue((EObject)value);
+      }
+    }
+  }
+
+  protected ListChange createListChange(EList<ListChange> changesList, ChangeKind kind, int index)
+  {
+    ListChange listChange = ChangeFactory.eINSTANCE.createListChange();
+    listChange.setKind(kind);
+    listChange.setIndex(index);
+    changesList.add(listChange);
+    return listChange;
+  }
+
+  public NotificationChain inverseAdd(InternalEObject owner, int featureID, NotificationChain notifications)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseAdd(owner, getValue(), featureID, notifications);
+  }
+
+  public NotificationChain inverseRemove(InternalEObject owner, int featureID, NotificationChain notifications)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseRemove(owner, getValue(), featureID, notifications);
+  }
+
+  public NotificationChain inverseAdd(InternalEObject owner, Object otherEnd, int featureID, NotificationChain notifications)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseAdd(owner, otherEnd, featureID, notifications);
+  }
+
+  public NotificationChain inverseRemove(InternalEObject owner, Object otherEnd, int featureID, NotificationChain notifications)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseRemove(owner, otherEnd, featureID, notifications);
+  }
+
+  public void validate(Object value)
+  {
+    ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().validate(value);
+  }
+
+  public Internal createEntry(Object value)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().createEntry(value);
+  }
+
+  public Internal createEntry(InternalEObject value)
+  {
+    return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().createEntry(value);
+  }
+} //FeatureChangeImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ListChangeImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ListChangeImpl.java
new file mode 100644
index 0000000..b111096
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ListChangeImpl.java
@@ -0,0 +1,734 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ListChangeImpl.java,v 1.14 2008/12/22 14:26:03 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.DelegatingEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.FeatureMapEntry;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EDataTypeEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>List Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getDataValues <em>Data Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getIndex <em>Index</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getMoveToIndex <em>Move To Index</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getValues <em>Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getReferenceValues <em>Reference Values</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getFeature <em>Feature</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ListChangeImpl#getFeatureMapEntryValues <em>Feature Map Entry Values</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ListChangeImpl extends EObjectImpl implements ListChange
+{
+  /**
+   * 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.ADD_LITERAL;
+
+  /**
+   * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getKind()
+   * @generated
+   * @ordered
+   */
+  protected ChangeKind kind = KIND_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getDataValues() <em>Data Values</em>}' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getDataValues()
+   * @generated
+   * @ordered
+   */
+  protected EList<String> dataValues;
+
+  /**
+   * The default value of the '{@link #getIndex() <em>Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getIndex()
+   * @generated
+   * @ordered
+   */
+  protected static final int INDEX_EDEFAULT = -1;
+
+  /**
+   * The cached value of the '{@link #getIndex() <em>Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getIndex()
+   * @generated
+   * @ordered
+   */
+  protected int index = INDEX_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getMoveToIndex() <em>Move To Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getMoveToIndex()
+   * @generated
+   * @ordered
+   */
+  protected static final int MOVE_TO_INDEX_EDEFAULT = 0;
+
+  /**
+   * The cached value of the '{@link #getMoveToIndex() <em>Move To Index</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getMoveToIndex()
+   * @generated
+   * @ordered
+   */
+  protected int moveToIndex = MOVE_TO_INDEX_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getReferenceValues() <em>Reference Values</em>}' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getReferenceValues()
+   * @generated
+   * @ordered
+   */
+  protected EList<EObject> referenceValues;
+
+  /**
+   * The cached value of the '{@link #getFeature() <em>Feature</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFeature()
+   * @generated
+   * @ordered
+   */
+  protected EStructuralFeature feature;
+  
+  /**
+   * The cached value of the '{@link #getFeatureMapEntryValues() <em>Feature Map Entry Values</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFeatureMapEntryValues()
+   * @generated
+   * @ordered
+   */
+  protected EList<FeatureMapEntry> featureMapEntryValues;
+
+  /**
+   * The data value delegating list is used to ensure that the elements
+   * are properly converted to and from strings when added and removed
+   * from the dataValues list. 
+   */
+  protected EList<Object> dataValueDelegatingList = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ListChangeImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.LIST_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeKind getKind()
+  {
+    return kind;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setKind(ChangeKind newKind)
+  {
+    ChangeKind oldKind = kind;
+    kind = newKind == null ? KIND_EDEFAULT : newKind;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.LIST_CHANGE__KIND, oldKind, kind));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<String> getDataValues()
+  {
+    if (dataValues == null)
+    {
+      dataValues = new EDataTypeEList<String>(String.class, this, ChangePackage.LIST_CHANGE__DATA_VALUES);
+    }
+    return dataValues;
+  }
+
+  /**
+   * Creates the data value delegating list
+   */
+  protected EList<Object> createDataValueDelegatingList()
+  {
+    if (FeatureMapUtil.isFeatureMap(getFeature()))
+    {
+      return 
+        new DelegatingEList<Object>()
+        {
+          private static final long serialVersionUID = 1L;
+
+          @SuppressWarnings("unchecked")
+          @Override
+          protected List<Object> delegateList()
+          {
+            return (List<Object>)(List<?>)getFeatureMapEntryValues();
+          }
+          
+          @Override
+          protected Object validate(int index, Object object)
+          {
+            if (object instanceof FeatureMapEntry)
+            {
+              return object;
+            }
+            else
+            {
+              FeatureMap.Entry entry = (FeatureMap.Entry)object;
+              return createFeatureMapEntry(entry.getEStructuralFeature(), entry.getValue());
+            }
+          }
+        };
+    }
+    else
+    {
+      return 
+        new DelegatingEList<Object>()
+        {
+          private static final long serialVersionUID = 1L;
+
+          @SuppressWarnings("unchecked")
+          @Override
+          protected List<Object> delegateList()
+          {
+            return (List<Object>)(List<?>)getDataValues();
+          }
+            
+          @Override
+          protected Object resolve(int index, Object object)
+          {
+            EDataType type = (EDataType)getFeature().getEType();
+            return EcoreUtil.createFromString(type, (String)object);
+          }
+            
+          @Override
+          protected Object validate(int index, Object object)
+          {
+            EDataType type = (EDataType)getFeature().getEType();
+            return EcoreUtil.convertToString(type, object);
+          }
+        };
+    } 
+  }
+  
+  protected FeatureMapEntry createFeatureMapEntry(EStructuralFeature feature, Object value)
+  {
+    return ChangeFactory.eINSTANCE.createFeatureMapEntry(feature, value);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public int getIndex()
+  {
+    return index;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setIndex(int newIndex)
+  {
+    int oldIndex = index;
+    index = newIndex;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.LIST_CHANGE__INDEX, oldIndex, index));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public int getMoveToIndex()
+  {
+    return moveToIndex;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setMoveToIndex(int newMoveToIndex)
+  {
+    int oldMoveToIndex = moveToIndex;
+    moveToIndex = newMoveToIndex;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.LIST_CHANGE__MOVE_TO_INDEX, oldMoveToIndex, moveToIndex));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<EObject> getReferenceValues()
+  {
+    if (referenceValues == null)
+    {
+      referenceValues = new EObjectResolvingEList<EObject>(EObject.class, this, ChangePackage.LIST_CHANGE__REFERENCE_VALUES);
+    }
+    return referenceValues;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EStructuralFeature getFeatureGen()
+  {
+    if (feature != null && feature.eIsProxy())
+    {
+      InternalEObject oldFeature = (InternalEObject)feature;
+      feature = (EStructuralFeature)eResolveProxy(oldFeature);
+      if (feature != oldFeature)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.LIST_CHANGE__FEATURE, oldFeature, feature));
+      }
+    }
+    return feature;
+  }
+
+  public EStructuralFeature getFeature()
+  {
+    EStructuralFeature result = getFeatureGen();
+    if (result == null)
+    {
+      EObject container = eContainer();
+      if (container instanceof FeatureChange)
+      {
+        result = ((FeatureChange)container).getFeature();
+      }
+    }
+    return result;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EStructuralFeature basicGetFeature()
+  {
+    return feature;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setFeature(EStructuralFeature newFeature)
+  {
+    EStructuralFeature oldFeature = feature;
+    feature = newFeature;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.LIST_CHANGE__FEATURE, oldFeature, feature));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<FeatureMapEntry> getFeatureMapEntryValues()
+  {
+    if (featureMapEntryValues == null)
+    {
+      featureMapEntryValues = new EObjectContainmentEList<FeatureMapEntry>(FeatureMapEntry.class, this, ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES);
+    }
+    return featureMapEntryValues;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<Object> getValues()
+  {
+    EStructuralFeature feature = getFeature();
+    if (feature instanceof EAttribute)
+    {
+      if (dataValueDelegatingList == null)
+      {
+        dataValueDelegatingList = createDataValueDelegatingList();
+      }
+      return dataValueDelegatingList;
+    }
+    else
+    {
+      @SuppressWarnings("unchecked") EList<Object> result = (EList<Object>)(List<?>)getReferenceValues();
+      return result;
+    }
+  }
+  
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void setValues(EList<?> values)
+  {
+    EList<Object> featureValues = getValues();
+    featureValues.clear();
+    featureValues.addAll(values);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void apply(EList<Object> originalList)
+  {
+    switch (getKind().getValue())
+    {
+      case ChangeKind.ADD:
+        if (index == -1)
+        {
+          originalList.addAll(getValues());
+        }
+        else
+        {
+          originalList.addAll(index, getValues());
+        }
+        break;
+      case ChangeKind.REMOVE:
+        int removeCount = getValues().isEmpty() ? 1 : getValues().size();
+        for (int i = 0; i < removeCount; ++i)
+        {
+          originalList.remove(index);
+        }
+        break;
+      case ChangeKind.MOVE:
+        originalList.move(moveToIndex, index);
+        break;
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void applyAndReverse(EList<Object> originalList)
+  {
+    switch (getKind().getValue())
+    {
+      case ChangeKind.ADD:
+        if (index == -1)
+        {
+          index = originalList.size();
+          originalList.addAll(getValues());
+        }
+        else
+        {
+          originalList.addAll(index, getValues());
+        }
+        if (getValues().size() == 1)
+        {
+          getValues().clear();
+        }
+        setKind(ChangeKind.REMOVE_LITERAL);
+        break;
+      case ChangeKind.REMOVE:
+        if (getValues().isEmpty())
+        {
+          getValues().add(originalList.get(getIndex()));
+        }
+        int removeCount = getValues().size();
+        for (int i = 0; i < removeCount; ++i)
+        {
+          originalList.remove(index);
+        }
+        setKind(ChangeKind.ADD_LITERAL);
+        break;
+      case ChangeKind.MOVE:
+        originalList.move(moveToIndex, index);
+        int temp = moveToIndex;
+        setMoveToIndex(index);
+        setIndex(temp);
+        break;
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES:
+        return ((InternalEList<?>)getFeatureMapEntryValues()).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 ChangePackage.LIST_CHANGE__KIND:
+        return getKind();
+      case ChangePackage.LIST_CHANGE__DATA_VALUES:
+        return getDataValues();
+      case ChangePackage.LIST_CHANGE__INDEX:
+        return getIndex();
+      case ChangePackage.LIST_CHANGE__MOVE_TO_INDEX:
+        return getMoveToIndex();
+      case ChangePackage.LIST_CHANGE__VALUES:
+        return getValues();
+      case ChangePackage.LIST_CHANGE__REFERENCE_VALUES:
+        return getReferenceValues();
+      case ChangePackage.LIST_CHANGE__FEATURE:
+        if (resolve) return getFeature();
+        return basicGetFeature();
+      case ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES:
+        return getFeatureMapEntryValues();
+    }
+    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 ChangePackage.LIST_CHANGE__KIND:
+        setKind((ChangeKind)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__DATA_VALUES:
+        getDataValues().clear();
+        getDataValues().addAll((Collection<? extends String>)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__INDEX:
+        setIndex((Integer)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__MOVE_TO_INDEX:
+        setMoveToIndex((Integer)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__VALUES:
+        getValues().clear();
+        getValues().addAll((Collection<? extends Object>)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__REFERENCE_VALUES:
+        getReferenceValues().clear();
+        getReferenceValues().addAll((Collection<? extends EObject>)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__FEATURE:
+        setFeature((EStructuralFeature)newValue);
+        return;
+      case ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES:
+        getFeatureMapEntryValues().clear();
+        getFeatureMapEntryValues().addAll((Collection<? extends FeatureMapEntry>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.LIST_CHANGE__KIND:
+        setKind(KIND_EDEFAULT);
+        return;
+      case ChangePackage.LIST_CHANGE__DATA_VALUES:
+        getDataValues().clear();
+        return;
+      case ChangePackage.LIST_CHANGE__INDEX:
+        setIndex(INDEX_EDEFAULT);
+        return;
+      case ChangePackage.LIST_CHANGE__MOVE_TO_INDEX:
+        setMoveToIndex(MOVE_TO_INDEX_EDEFAULT);
+        return;
+      case ChangePackage.LIST_CHANGE__VALUES:
+        getValues().clear();
+        return;
+      case ChangePackage.LIST_CHANGE__REFERENCE_VALUES:
+        getReferenceValues().clear();
+        return;
+      case ChangePackage.LIST_CHANGE__FEATURE:
+        setFeature((EStructuralFeature)null);
+        return;
+      case ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES:
+        getFeatureMapEntryValues().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.LIST_CHANGE__KIND:
+        return kind != KIND_EDEFAULT;
+      case ChangePackage.LIST_CHANGE__DATA_VALUES:
+        return dataValues != null && !dataValues.isEmpty();
+      case ChangePackage.LIST_CHANGE__INDEX:
+        return index != INDEX_EDEFAULT;
+      case ChangePackage.LIST_CHANGE__MOVE_TO_INDEX:
+        return moveToIndex != MOVE_TO_INDEX_EDEFAULT;
+      case ChangePackage.LIST_CHANGE__VALUES:
+        return !getValues().isEmpty();
+      case ChangePackage.LIST_CHANGE__REFERENCE_VALUES:
+        return referenceValues != null && !referenceValues.isEmpty();
+      case ChangePackage.LIST_CHANGE__FEATURE:
+        return feature != null;
+      case ChangePackage.LIST_CHANGE__FEATURE_MAP_ENTRY_VALUES:
+        return featureMapEntryValues != null && !featureMapEntryValues.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (kind: ");
+    result.append(kind);
+    result.append(", dataValues: ");
+    result.append(dataValues);
+    result.append(", index: ");
+    result.append(index);
+    result.append(", moveToIndex: ");
+    result.append(moveToIndex);
+    result.append(')');
+    return result.toString();
+  }
+
+} //ListChangeImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ResourceChangeImpl.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ResourceChangeImpl.java
new file mode 100644
index 0000000..0caf38e
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/ResourceChangeImpl.java
@@ -0,0 +1,430 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2006-2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ResourceChangeImpl.java,v 1.10 2007/11/03 13:16:00 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+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.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.change.ChangePackage;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.change.ResourceChange;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Resource Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl#getResourceURI <em>Resource URI</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl#getResource <em>Resource</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.emf.ecore.change.impl.ResourceChangeImpl#getListChanges <em>List Changes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ResourceChangeImpl extends EObjectImpl implements ResourceChange
+{
+  /**
+   * The default value of the '{@link #getResourceURI() <em>Resource URI</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getResourceURI()
+   * @generated
+   * @ordered
+   */
+  protected static final String RESOURCE_URI_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getResourceURI() <em>Resource URI</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getResourceURI()
+   * @generated
+   * @ordered
+   */
+  protected String resourceURI = RESOURCE_URI_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getResource() <em>Resource</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getResource()
+   * @generated
+   * @ordered
+   */
+  protected static final Resource RESOURCE_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getResource() <em>Resource</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getResource()
+   * @generated
+   * @ordered
+   */
+  protected Resource resource = RESOURCE_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getListChanges() <em>List Changes</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getListChanges()
+   * @generated
+   * @ordered
+   */
+  protected EList<ListChange> listChanges;
+
+  protected EList<Object> valueField = null;
+  protected EList<Object> newValue = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ResourceChangeImpl()
+  {
+    super();
+  }
+
+  protected ResourceChangeImpl(Resource resource, EList<Object> value)
+  {
+    this();
+    setResource(resource);
+    setValue(value);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ChangePackage.Literals.RESOURCE_CHANGE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getResourceURI()
+  {
+    return resourceURI;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setResourceURI(String newResourceURI)
+  {
+    String oldResourceURI = resourceURI;
+    resourceURI = newResourceURI;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.RESOURCE_CHANGE__RESOURCE_URI, oldResourceURI, resourceURI));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public Resource getResource()
+  {
+    if (resource == null)
+    {
+      if (getResourceURI() != null)
+      {
+        Resource changeResource = eResource();
+        if (changeResource != null)
+        {
+          ResourceSet resourceSet = changeResource.getResourceSet();
+          if (resourceSet != null)
+          {
+            resource = resourceSet.getResource(URI.createURI(getResourceURI()), false);
+          }
+        }
+      }
+    }
+    return resource;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setResourceGen(Resource newResource)
+  {
+    Resource oldResource = resource;
+    resource = newResource;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.RESOURCE_CHANGE__RESOURCE, oldResource, resource));
+  }
+
+  public void setResource(Resource newResource)
+  {
+    setResourceGen(newResource);
+    setResourceURI(newResource.getURI() == null ? null : newResource.getURI().toString());
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public EList<Object> getValue()
+  {
+    if (valueField == null)
+    {
+      Resource resource = getResource();
+      if (resource != null)
+      {
+        EList<Object> changedList = new BasicEList<Object>(resource.getContents());
+        apply(changedList);
+        valueField = changedList; // cache result
+        return changedList;
+      }
+      return ECollections.emptyEList();
+    }
+    return valueField;
+  }
+
+  protected void setValue(EList<Object> value)
+  {
+    valueField = value;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<ListChange> getListChanges()
+  {
+    if (listChanges == null)
+    {
+      listChanges = new EObjectContainmentEList<ListChange>(ListChange.class, this, ChangePackage.RESOURCE_CHANGE__LIST_CHANGES);
+    }
+    return listChanges;
+  }
+
+  public void preApply(boolean reverse)
+  {
+    if (resource != null)
+    {
+      if (reverse)
+      {
+        newValue = new BasicEList<Object>(resource.getContents());
+      }
+    }
+  }
+  
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void apply()
+  {    
+    apply(false);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  public void applyAndReverse()
+  {
+    apply(true);
+  }
+
+  protected void apply(boolean reverse)
+  {
+    Resource resource = getResource();
+    if (resource != null && listChanges != null)
+    {
+      EList<Object> value = getValue();
+      
+      @SuppressWarnings("unchecked") EList<Object> result = (EList)resource.getContents();
+      ECollections.setEList(result, value);
+      
+      if (reverse)
+      {
+        ECollections.reverse(getListChanges());
+        setValue(newValue);
+      }
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.RESOURCE_CHANGE__LIST_CHANGES:
+        return ((InternalEList<?>)getListChanges()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  protected void apply(EList<Object> toList)
+  {
+    for (ListChange listChange : getListChanges())
+    {
+      listChange.apply(toList);
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE_URI:
+        return getResourceURI();
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE:
+        return getResource();
+      case ChangePackage.RESOURCE_CHANGE__VALUE:
+        return getValue();
+      case ChangePackage.RESOURCE_CHANGE__LIST_CHANGES:
+        return getListChanges();
+    }
+    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 ChangePackage.RESOURCE_CHANGE__RESOURCE_URI:
+        setResourceURI((String)newValue);
+        return;
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE:
+        setResource((Resource)newValue);
+        return;
+      case ChangePackage.RESOURCE_CHANGE__LIST_CHANGES:
+        getListChanges().clear();
+        getListChanges().addAll((Collection<? extends ListChange>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE_URI:
+        setResourceURI(RESOURCE_URI_EDEFAULT);
+        return;
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE:
+        setResource(RESOURCE_EDEFAULT);
+        return;
+      case ChangePackage.RESOURCE_CHANGE__LIST_CHANGES:
+        getListChanges().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE_URI:
+        return RESOURCE_URI_EDEFAULT == null ? resourceURI != null : !RESOURCE_URI_EDEFAULT.equals(resourceURI);
+      case ChangePackage.RESOURCE_CHANGE__RESOURCE:
+        return RESOURCE_EDEFAULT == null ? resource != null : !RESOURCE_EDEFAULT.equals(resource);
+      case ChangePackage.RESOURCE_CHANGE__VALUE:
+        return getValue() != null;
+      case ChangePackage.RESOURCE_CHANGE__LIST_CHANGES:
+        return listChanges != null && !listChanges.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (resourceURI: ");
+    result.append(resourceURI);
+    result.append(", resource: ");
+    result.append(resource);
+    result.append(')');
+    return result.toString();
+  }
+
+} //ResourceChangeImpl
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/package.html b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/package.html
new file mode 100644
index 0000000..a57cbdb
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/impl/package.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content="HTML Tidy, see www.w3.org" />
+<meta http-equiv="Content-Type"
+content="text/html; charset=ISO-8859-1" /><!--
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2004 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: package.html,v 1.4 2005/06/08 06:16:16 nickb Exp $
+ */
+-->
+<title></title>
+</head>
+<body>
+Provides an implementation of the Change model.
+</body>
+</html>
+
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/package.html b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/package.html
new file mode 100644
index 0000000..90f7be9
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/package.html
@@ -0,0 +1,39 @@
+<!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 name="generator" content="HTML Tidy, see www.w3.org" />
+<meta http-equiv="Content-Type"
+content="text/html; charset=ISO-8859-1" /><!--
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2004 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: package.html,v 1.5 2005/06/08 06:16:16 nickb Exp $
+ */
+-->
+<title></title>
+</head>
+<body>
+<p>Provides an API for describing and applying model changes.</p>
+
+<h2>Change Model API</h2>
+
+<p>The change model comprises this API:</p>
+
+<p><img src="doc-files/ChangeAPI.gif" usemap="#Change" border="0"
+alt="Diagram of the Change Model API" /> <map id="Change"
+name="Change"></map></p>
+</body>
+</html>
+
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/BasicChangeRecorder.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/BasicChangeRecorder.java
new file mode 100644
index 0000000..2e05ccc
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/BasicChangeRecorder.java
@@ -0,0 +1,269 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: BasicChangeRecorder.java,v 1.3 2008/05/04 17:03:41 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.util;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ListChange;
+import org.eclipse.emf.ecore.change.ResourceChange;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+
+
+/**
+ * This class provides the basic methods required to implement a change recorder.
+ * @since 2.3
+ */
+public class BasicChangeRecorder extends ListDifferenceAnalyzer
+{
+  protected boolean recording;
+  
+  protected ChangeDescription changeDescription;
+
+  /**
+   * @return true if this change recorder is recording or false otherwise.
+   */
+  public boolean isRecording()
+  {
+    return recording;
+  }
+  
+  protected void setRecording(boolean recording)
+  {
+    this.recording = recording;
+  }
+  
+  protected ChangeDescription getChangeDescription()
+  {
+    return changeDescription;
+  }
+  
+  protected void setChangeDescription(ChangeDescription changeDescription)
+  {
+    this.changeDescription = changeDescription;
+  }
+  
+  /**
+   * Disposes this change recorder.  This method ends a recording without 
+   * consolidating the changes.
+   */
+  public void dispose()
+  {
+    changeDescription = null;
+  }
+
+  /**
+   * <p>Summarizes the changes made to the analyzed objects on the {@link ChangeDescription change description}
+   * returned by the {@link #endRecording()} without ending the recording.</p>
+
+   * <p>This method doesn't do anything if this ChangeRecorder is not recording.</p>
+   * 
+   * @return the {@link ChangeDescription} or <tt class="code">null</tt> if there is nothing being recorded.
+   */
+  public ChangeDescription summarize()
+  {
+    if (isRecording())
+    {
+      consolidateChanges();
+      return getChangeDescription();
+    }
+    return null;
+  }
+  
+  /**
+   * Ends the recording and consolidates the changes on the {@link ChangeDescription change description}.
+   * @return the {@link ChangeDescription} or <tt class="code">null</tt> if there is nothing being recorded.
+   */
+  public ChangeDescription endRecording()
+  {
+    if (isRecording())
+    {
+      setRecording(false);
+      consolidateChanges();
+      return getChangeDescription();
+    }
+    return null;
+  }  
+  
+  /**
+   * Consolidates the changes that have happen since the last consolidation.
+   */
+  protected void consolidateChanges()
+  {
+    ChangeDescription changeDescription = getChangeDescription();
+    for (Map.Entry<EObject, EList<FeatureChange>> entry : changeDescription.getObjectChanges())
+    {
+      EObject eObject = entry.getKey();
+      for (FeatureChange featureChange : entry.getValue())
+      {
+        finalizeChange(featureChange, eObject);
+      }
+    }
+
+    for (ResourceChange resourceChange : changeDescription.getResourceChanges())
+    {
+      finalizeChange(resourceChange);
+    }    
+
+    eliminateEmptyChanges();
+  }
+
+  /**
+   * Eliminates changes that result in a state that's equal to the current state.
+   */
+  protected void eliminateEmptyChanges()
+  {
+    ChangeDescription changeDescription = getChangeDescription();
+    for (Iterator<Map.Entry<EObject, EList<FeatureChange>>> i = changeDescription.getObjectChanges().iterator(); i.hasNext();)
+    {
+      Map.Entry<EObject, EList<FeatureChange>> entry = i.next();
+      EObject eObject = entry.getKey();
+      EList<FeatureChange> featureChanges = entry.getValue();
+      for (Iterator<FeatureChange> j = featureChanges.iterator(); j.hasNext(); )
+      {
+        FeatureChange featureChange  = j.next();
+        EStructuralFeature feature = featureChange.getFeature();
+        if (featureChange.isSet() == eObject.eIsSet(feature))
+        {
+          Object value = featureChange.getValue();
+          Object eObjectValue = eObject.eGet(feature);
+          if (value == null ? eObject.eGet(feature) == null : value.equals(eObjectValue))
+          {
+            j.remove();
+          }
+        }
+      }
+      if (featureChanges.isEmpty())
+      {
+        i.remove();
+      }
+    }
+
+    for (Iterator<ResourceChange> i = changeDescription.getResourceChanges().iterator(); i.hasNext(); )
+    {
+      ResourceChange resourceChange  = i.next();
+      if (resourceChange.getResource().getContents().equals(resourceChange.getValue()))
+      {
+        i.remove();
+      }
+    }    
+  }
+  
+  protected boolean shouldRecord(EStructuralFeature feature, EObject eObject)
+  {
+    return isRecording() &&
+      !feature.isDerived() &&
+      feature != EcorePackage.Literals.ECLASS__ESUPER_TYPES &&
+      feature != EcorePackage.Literals.ETYPED_ELEMENT__ETYPE &&
+      feature != EcorePackage.Literals.EOPERATION__EEXCEPTIONS;
+  }  
+  
+  protected void finalizeChange(ResourceChange change)
+  {
+    EList<Object> oldList = new BasicEList.FastCompare<Object>(change.getResource().getContents());
+    EList<?> newList = change.getValue();
+    change.getListChanges().clear();
+    createListChanges(oldList, newList, change.getListChanges());
+  }
+
+  protected void finalizeChange(FeatureChange change, EObject eObject)
+  {
+    if (change.isSet())
+    {
+      EStructuralFeature feature = change.getFeature();
+      if (feature.isMany())
+      {
+        EList<Object> oldList = new BasicEList<Object>((EList<?>)eObject.eGet(feature));
+        EList<?> newList = (EList<?>)change.getValue();
+        EList<ListChange> listChanges = change.getListChanges();
+        listChanges.clear();
+        createListChanges(oldList, newList, listChanges);
+      }
+    }
+  }
+
+  protected EList<ResourceChange> getResourceChanges()
+  {
+    return getChangeDescription().getResourceChanges();
+  }
+
+  protected ResourceChange getResourceChange(Resource resource)
+  {
+    List<ResourceChange> resourceChanges = getResourceChanges();
+    for (int i = 0, size = resourceChanges.size(); i < size;)
+    {
+      ResourceChange resourceChange = resourceChanges.get(i++);
+      if (resourceChange.getResource() == resource)
+      {
+        return resourceChange;
+      }
+    }
+    return null;
+  }  
+  
+  protected List<FeatureChange> getFeatureChanges(EObject eObject)
+  {
+    ChangeDescription changeDescription = getChangeDescription();
+    List<FeatureChange> featureChanges = changeDescription.getObjectChanges().get(eObject);
+    if (featureChanges == null)
+    {
+      Map.Entry<EObject, EList<FeatureChange>> entry = ChangeFactory.eINSTANCE.createEObjectToChangesMapEntry(eObject);
+      changeDescription.getObjectChanges().add(entry);
+      featureChanges = entry.getValue();
+    }
+    return featureChanges;
+  }
+
+  protected FeatureChange getFeatureChange(List<FeatureChange> featureChanges, EStructuralFeature eStructuralFeature)
+  {
+    EObjectContainmentEList<FeatureChange> changes = (EObjectContainmentEList<FeatureChange>)featureChanges;
+    for (int i = 0, size = changes.size(); i < size;)
+    {
+      FeatureChange featureChange = changes.get(i++);
+      if (featureChange.getFeature() == eStructuralFeature)
+      {
+        return featureChange;
+      }
+    }
+    return null;
+  }  
+  
+  protected FeatureChange createFeatureChange(EObject eObject, EStructuralFeature eStructuralFeature, Object value, boolean isSet)
+  {
+    return ChangeFactory.eINSTANCE.createFeatureChange(eStructuralFeature, value, isSet);
+  }
+
+  protected ResourceChange createResourceChange(Resource resource, EList<Object> value)
+  {
+    return ChangeFactory.eINSTANCE.createResourceChange(resource, value);
+  }
+
+  protected ChangeDescription createChangeDescription()
+  {
+    return ChangeFactory.eINSTANCE.createChangeDescription();
+  }
+}
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeAdapterFactory.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeAdapterFactory.java
new file mode 100644
index 0000000..619e01a
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeAdapterFactory.java
@@ -0,0 +1,247 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeAdapterFactory.java,v 1.6 2007/10/27 10:29:07 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.util;
+
+import java.util.Map;
+
+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.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.change.*;
+
+
+/**
+ * <!-- 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.ecore.change.ChangePackage
+ * @generated
+ */
+public class ChangeAdapterFactory extends AdapterFactoryImpl
+{
+  /**
+   * The cached model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static ChangePackage modelPackage;
+
+  /**
+   * Creates an instance of the adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeAdapterFactory()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = ChangePackage.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 ChangeSwitch<Adapter> modelSwitch =
+    new ChangeSwitch<Adapter>()
+    {
+      @Override
+      public Adapter caseChangeDescription(ChangeDescription object)
+      {
+        return createChangeDescriptionAdapter();
+      }
+      @Override
+      public Adapter caseEObjectToChangesMapEntry(Map.Entry<EObject, EList<FeatureChange>> object)
+      {
+        return createEObjectToChangesMapEntryAdapter();
+      }
+      @Override
+      public Adapter caseFeatureChange(FeatureChange object)
+      {
+        return createFeatureChangeAdapter();
+      }
+      @Override
+      public Adapter caseListChange(ListChange object)
+      {
+        return createListChangeAdapter();
+      }
+      @Override
+      public Adapter caseResourceChange(ResourceChange object)
+      {
+        return createResourceChangeAdapter();
+      }
+      @Override
+      public Adapter caseFeatureMapEntry(FeatureMapEntry object)
+      {
+        return createFeatureMapEntryAdapter();
+      }
+      @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.ecore.change.ChangeDescription <em>Description</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.ecore.change.ChangeDescription
+   * @generated
+   */
+  public Adapter createChangeDescriptionAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link java.util.Map.Entry <em>EObject To Changes Map Entry</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 java.util.Map.Entry
+   * @generated
+   */
+  public Adapter createEObjectToChangesMapEntryAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.ecore.change.FeatureChange <em>Feature 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.ecore.change.FeatureChange
+   * @generated
+   */
+  public Adapter createFeatureChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.ecore.change.ListChange <em>List 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.ecore.change.ListChange
+   * @generated
+   */
+  public Adapter createListChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.ecore.change.ResourceChange <em>Resource 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.ecore.change.ResourceChange
+   * @generated
+   */
+  public Adapter createResourceChangeAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.emf.ecore.change.FeatureMapEntry <em>Feature Map Entry</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.ecore.change.FeatureMapEntry
+   * @generated
+   */
+  public Adapter createFeatureMapEntryAdapter()
+  {
+    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;
+  }
+
+} //ChangeAdapterFactory
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeRecorder.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeRecorder.java
new file mode 100644
index 0000000..94addb6
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeRecorder.java
@@ -0,0 +1,645 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeRecorder.java,v 1.48 2008/12/22 14:26:03 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.util;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+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.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.change.ChangeDescription;
+import org.eclipse.emf.ecore.change.FeatureChange;
+import org.eclipse.emf.ecore.change.ResourceChange;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+
+/**
+ * A change recorder for the tree contents of a collection of EObjects. It monitors the specified objects and
+ * then produces a {@link ChangeDescription change model} representing the changes needed to reverse (undo) all
+ * the model changes made while recording.
+ */
+public class ChangeRecorder extends BasicChangeRecorder implements Adapter.Internal
+{
+  protected List<Notifier> targetObjects = new BasicEList.FastCompare<Notifier>();
+
+  protected List<Notifier> originalTargetObjects = new BasicEList.FastCompare<Notifier>();
+
+  protected boolean loadingTargets;
+  
+  protected boolean resolveProxies;
+
+  public ChangeRecorder()
+  {
+    super();
+  }
+
+  public ChangeRecorder(EObject rootObject)
+  {
+    beginRecording(Collections.singleton(rootObject));
+  }
+
+  public ChangeRecorder(Resource resource)
+  {
+    beginRecording(Collections.singleton(resource));
+  }
+
+  public ChangeRecorder(ResourceSet resourceSet)
+  {
+    beginRecording(Collections.singleton(resourceSet));
+  }
+
+  public ChangeRecorder(Collection<?> rootObjects)
+  {
+    beginRecording(rootObjects);
+  }
+  
+  public boolean isResolveProxies()
+  {
+    return resolveProxies;
+  }
+  
+  public void setResolveProxies(boolean resolveProxies)
+  {
+    this.resolveProxies = resolveProxies;
+  }
+  
+  @Override
+  public void dispose()
+  {
+    setRecording(false);
+    
+    Notifier[] notifiers = targetObjects.toArray(new Notifier [targetObjects.size()]);
+    targetObjects.clear();    
+    for (int i = 0, length = notifiers.length; i < length; i++)
+    {
+      removeAdapter(notifiers[i]);
+    }
+    originalTargetObjects.clear();
+    
+    super.dispose();
+  }
+
+  protected void removeAdapter(Notifier notifier)
+  {
+    notifier.eAdapters().remove(this);
+  }
+
+  /**
+   * Begins recording any changes made to the elements of the specified collection.
+   * @param rootObjects A collection of instances of {@link Notifier}
+   */
+  public void beginRecording(Collection<?> rootObjects)
+  {
+    beginRecording(null, rootObjects);
+  }
+
+  /**
+   * Begins recording any changes made to the elements of the specified collection,  
+   * adding the changes to and existing {@link ChangeDescription}. 
+   * This allows clients to resume a previous recording.
+   * <p>
+   * Unpredictable (and probably bad) results may happen if the change description is
+   * inconsistent with the current state of the application.
+   * </p>
+   * @param changeDescription A change description with changes made during a previous
+   * recording or <tt>null</tt> if a new change description should be instantiated.
+   * @param rootObjects A collection of instances of {@link Notifier}
+   * @since 2.1.0
+   */
+  public void beginRecording(ChangeDescription changeDescription, Collection<?> rootObjects)
+  {
+    List<EObject> insertedObjects = changeDescription == null ? 
+      null
+      : changeDescription.getObjectsToDetach();
+    
+    if (changeDescription == null)
+    {
+      changeDescription = createChangeDescription();
+    }
+    setChangeDescription(changeDescription);
+
+    loadingTargets = true;
+    for (Object rootObject : rootObjects)
+    {
+      Notifier notifier = (Notifier)rootObject;
+      addAdapter(notifier);
+    }
+    loadingTargets = false;
+    
+    if (changeDescription != null)
+    {
+      prepareChangeDescriptionForResume();
+    }
+
+    if (insertedObjects != null)
+    {
+      originalTargetObjects.removeAll(insertedObjects);
+    }
+    
+    setRecording(true);
+  }
+  
+  /**
+   * Prepares this ChangeRecorder's {@link #changeDescription} for the scenarios where the user
+   * is resuming a previous recording.
+   * @see #beginRecording(ChangeDescription, Collection)
+   * @since 2.1.0
+   */
+  protected void prepareChangeDescriptionForResume()
+  {
+    loadingTargets = true;
+    ChangeDescription changeDescription = getChangeDescription();
+    for (Notifier notifier : changeDescription.getObjectsToAttach())
+    {
+      addAdapter(notifier);
+    }
+    loadingTargets = false;
+
+    changeDescription.getObjectsToAttach().clear();
+    
+    // Make sure that all the old values are cached.
+    for (List<FeatureChange> featureChanges : changeDescription.getObjectChanges().values())
+    {
+      for (FeatureChange featureChange : featureChanges)
+      {
+        featureChange.getValue();
+      }
+    }
+        
+    for (ResourceChange resourceChange : changeDescription.getResourceChanges())
+    {
+      resourceChange.getValue();
+    }
+  }
+  
+  @Override
+  protected void consolidateChanges()
+  {
+    ChangeDescription changeDescription = getChangeDescription();
+    List<EObject> orphanedObjects = changeDescription.getObjectsToAttach();
+    for (Object target : targetObjects)
+    {
+      if (target instanceof EObject)
+      {
+        EObject eObject = (EObject)target;
+        if (isOrphan(eObject))
+        {
+          if (originalTargetObjects.contains(eObject))
+          {
+            orphanedObjects.add(eObject);
+          }
+          else
+          {
+            changeDescription.getObjectChanges().removeKey(eObject);
+          }
+        }
+      }
+    }
+    
+    super.consolidateChanges();
+  }
+
+  protected boolean isOrphan(EObject eObject)
+  {
+    return eObject.eContainer() == null && eObject.eResource() == null;
+  }
+
+  public void notifyChanged(Notification notification)
+  {
+    Object notifier = notification.getNotifier();
+    if (notifier instanceof EObject)
+    {
+      Object feature = notification.getFeature();
+      if (feature instanceof EReference)
+      {
+        EReference eReference = (EReference)feature;
+        handleFeature(eReference, eReference.isContainment() ? eReference : null, notification, (EObject)notifier);
+      }
+      else if (feature != null)
+      {
+        handleFeature((EStructuralFeature)feature, null, notification, (EObject) notifier);
+      }
+    }
+    else if (notifier instanceof Resource)
+    {
+      int featureID = notification.getFeatureID(Resource.class);
+      switch (featureID) 
+      {
+        case Resource.RESOURCE__CONTENTS:
+        {
+          if (!((Resource.Internal)notification.getNotifier()).isLoading())
+          {
+            handleResource(notification);
+          }
+          break;
+        }
+        case Resource.RESOURCE__IS_LOADED:
+        {
+          loadingTargets = true;
+          for (Notifier content : ((Resource)notification.getNotifier()).getContents())
+          {
+            addAdapter(content);
+          }
+          loadingTargets = false;
+          break;
+        }
+      }
+    }      
+    else if (notifier instanceof ResourceSet)
+    {
+      if (notification.getFeatureID(ResourceSet.class) == ResourceSet.RESOURCE_SET__RESOURCES)
+      {
+        switch (notification.getEventType())
+        {
+          case Notification.ADD:
+          case Notification.SET:
+          //case Notification.REMOVE:
+          {
+            Resource resource = (Resource)notification.getNewValue();
+            loadingTargets = true;
+            addAdapter(resource);
+            loadingTargets = false;
+            break;
+          }
+          
+          case Notification.ADD_MANY:
+          //case Notification.REMOVE_MANY:
+          {
+            @SuppressWarnings("unchecked") Collection<Resource> resources = (Collection<Resource>)notification.getNewValue();
+            loadingTargets = true;
+            for (Resource resource : resources)
+            {
+              addAdapter(resource);
+            }
+            loadingTargets = false;
+          }
+        }
+      }
+    }
+  }
+  
+  protected boolean shouldRecord(EStructuralFeature feature, EReference containment, Notification notification, EObject eObject)
+  {
+    return shouldRecord(feature, eObject) &&
+      notification.getEventType() != Notification.RESOLVE;
+  }
+
+  protected void handleFeature(EStructuralFeature feature, EReference containment, Notification notification, EObject eObject)
+  {    
+    boolean shouldRecord = shouldRecord(feature, containment, notification, eObject);
+    
+    List<FeatureChange> changes = null;
+    FeatureChange change = null;
+    if (shouldRecord)
+    {
+      changes = getFeatureChanges(eObject);
+      change = getFeatureChange(changes, feature);      
+    }
+    
+    switch (notification.getEventType())
+    {
+      case Notification.RESOLVE:
+      case Notification.SET:
+      case Notification.UNSET:
+      {
+        if (change == null && changes != null)
+        {
+          if (feature.isMany())
+          {
+            List<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+            int index = notification.getPosition();
+            if (index != Notification.NO_INDEX)
+            {
+              oldValue.set(index, notification.getOldValue());
+            }
+            change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          }
+          else
+          {
+            Object oldValue = notification.getOldValue();
+            change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          }
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        if (containment != null)
+        {
+          Object newValue = notification.getNewValue();
+          if (newValue != null && newValue != Boolean.TRUE && newValue != Boolean.FALSE)
+          {
+            addAdapter((Notifier)newValue);
+          }
+        }
+        break;
+      }
+      case Notification.ADD:
+      {
+        if (change == null && changes != null)
+        {
+          List<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+          oldValue.remove(notification.getPosition());
+          change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        if (containment != null)
+        {
+          Notifier newValue = (Notifier)notification.getNewValue();
+          addAdapter(newValue);
+        }
+        break;
+      }
+      case Notification.ADD_MANY:
+      {
+        if (change == null && changes != null)
+        {
+          List<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+          int position = notification.getPosition();
+          for (int i = ((Collection<?>)notification.getNewValue()).size(); --i >= 0;)
+          {
+            oldValue.remove(position);
+          }
+          change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        if (containment != null)
+        {
+          @SuppressWarnings("unchecked") Collection<Notifier> newValues = (Collection<Notifier>)notification.getNewValue();
+          for (Notifier newValue : newValues)
+          {
+            addAdapter(newValue);
+          }
+        }
+        break;
+      }
+      case Notification.REMOVE:
+      {
+        if (change == null && changes != null)
+        {
+          List<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+
+          // If there's no position, the list is being cleared.
+          //
+          int position = notification.getPosition();
+          if (position == Notification.NO_INDEX)
+          {
+            position = 0;
+          }
+          oldValue.add(position, notification.getOldValue());
+          change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        break;
+      }
+      case Notification.REMOVE_MANY:
+      {
+        if (change == null && changes != null)
+        {
+          @SuppressWarnings("unchecked") List<Object> removedValues = (List<Object>)notification.getOldValue();
+          List<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+          int[] positions = (int[])notification.getNewValue();
+          if (positions == null)
+          {
+            oldValue.addAll(removedValues);
+          }
+          else
+          {
+            for (int i = 0; i < positions.length; ++i)
+            {
+              oldValue.add(positions[i], removedValues.get(i));
+            }
+          }
+          change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        break;
+      }
+      case Notification.MOVE:
+      {
+        if (change == null && changes != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>((Collection<?>)eObject.eGet(feature));
+          int position = notification.getPosition();
+          int oldPosition = (Integer)notification.getOldValue();
+          oldValue.move(oldPosition, position);
+          change = createFeatureChange(eObject, feature, oldValue, notification.wasSet());
+          ((InternalEList<FeatureChange>)changes).addUnique(change);
+        }
+        break;
+      }
+    }
+  }
+
+  protected void handleResource(Notification notification)
+  {
+    Resource resource = null;
+    ResourceChange change = null;
+    if (isRecording())
+    {
+      resource = (Resource)notification.getNotifier();
+      change = getResourceChange(resource);
+    }
+
+    int eventType = notification.getEventType();
+    switch (eventType)
+    {
+      case Notification.SET:
+      case Notification.UNSET:
+      {
+        if (change == null && resource != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+          int index = notification.getPosition();
+          if (index != Notification.NO_INDEX)
+          {
+            oldValue.set(index, notification.getOldValue());
+          }
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+
+          Notifier newValue = (Notifier)notification.getNewValue();
+          if (newValue != null)
+          {
+            addAdapter(newValue);
+          }
+        }
+        break;
+      }
+      case Notification.ADD:
+      {
+        if (change == null && resource != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+          oldValue.remove(notification.getPosition());
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+        }
+        Notifier newValue = (Notifier)notification.getNewValue();
+        addAdapter(newValue);
+        break;
+      }
+      case Notification.ADD_MANY:
+      {
+        if (change == null && resource != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+          int position = notification.getPosition();
+          for (int i = ((Collection<?>)notification.getNewValue()).size(); --i >= 0;)
+          {
+            oldValue.remove(position);
+          }
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+        }
+        @SuppressWarnings("unchecked") Collection<Notifier> newValues = (Collection<Notifier>)notification.getNewValue();
+        for (Notifier newValue : newValues)
+        {
+          addAdapter(newValue);
+        }
+        break;
+      }
+      case Notification.REMOVE:
+      {
+        if (change == null && resource != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+
+          // If there's no position, the list is being cleared.
+          //
+          int position = notification.getPosition();
+          if (position == Notification.NO_INDEX)
+          {
+            position = 0;
+          }
+          oldValue.add(position, notification.getOldValue());
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+        }
+        break;
+      }
+      case Notification.REMOVE_MANY:
+      {
+        if (change == null && resource != null)
+        {
+          @SuppressWarnings("unchecked") List<Object> removedValues = (List<Object>)notification.getOldValue();
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+          int[] positions = (int[])notification.getNewValue();
+          if (positions == null)
+          {
+            oldValue.addAll(removedValues);
+          }
+          else
+          {
+            for (int i = 0; i < positions.length; ++i)
+            {
+              oldValue.add(positions[i], removedValues.get(i));
+            }
+          }
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+        }
+        break;
+      }
+      case Notification.MOVE:
+      {
+        if (change == null && resource != null)
+        {
+          EList<Object> oldValue = new BasicEList<Object>(resource.getContents());
+          int position = notification.getPosition();
+          int oldPosition = (Integer)notification.getOldValue();
+          oldValue.move(oldPosition, position);
+          change = createResourceChange(resource, oldValue);
+          getResourceChanges().add(change);
+        }
+        break;
+      }
+    }
+  }
+
+  /**
+   * Handles installation of the adapter
+   * by adding the adapter to each of the directly contained objects.
+   */
+  public void setTarget(Notifier target)
+  {
+    if (!targetObjects.add(target))
+    {
+      throw new IllegalStateException("The target should not be set more than once");
+    }
+    
+    if (loadingTargets)
+    {
+      originalTargetObjects.add(target);
+    }
+
+    Iterator<?> contents = 
+      target instanceof EObject ? 
+        resolveProxies ?  
+          ((EObject)target).eContents().iterator() : 
+          ((InternalEList<?>)((EObject)target).eContents()).basicIterator() :
+        target instanceof ResourceSet ? 
+          ((ResourceSet)target).getResources().iterator() : 
+            target instanceof Resource ? 
+              ((Resource)target).getContents().iterator() : 
+                null;
+
+    if (contents != null)
+    {
+      while (contents.hasNext())
+      {
+        Notifier notifier = (Notifier)contents.next();
+        addAdapter(notifier);
+      }
+    }
+  }
+
+  public void unsetTarget(Notifier oldTarget)
+  {
+    targetObjects.remove(oldTarget);
+  }
+
+  protected void addAdapter(Notifier notifier)
+  {
+    if (notifier != getChangeDescription())
+    {
+      EList<Adapter> eAdapters = notifier.eAdapters();
+      if (!eAdapters.contains(this))
+      {
+        eAdapters.add(this);
+      }
+    }
+  }
+
+  public Notifier getTarget()
+  {
+    return null;
+  }
+
+  public boolean isAdapterForType(Object type)
+  {
+    return false;
+  }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeSwitch.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeSwitch.java
new file mode 100644
index 0000000..1462612
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ChangeSwitch.java
@@ -0,0 +1,269 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2006 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ChangeSwitch.java,v 1.9 2007/06/12 21:15:20 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.util;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.change.*;
+
+
+/**
+ * <!-- 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.ecore.change.ChangePackage
+ * @generated
+ */
+public class ChangeSwitch<T>
+{
+  /**
+   * The cached model package
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static ChangePackage modelPackage;
+
+  /**
+   * Creates an instance of the switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ChangeSwitch()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = ChangePackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * 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
+   */
+  public T doSwitch(EObject theEObject)
+  {
+    return doSwitch(theEObject.eClass(), theEObject);
+  }
+
+  /**
+   * 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
+   */
+  protected T doSwitch(EClass theEClass, EObject theEObject)
+  {
+    if (theEClass.eContainer() == modelPackage)
+    {
+      return doSwitch(theEClass.getClassifierID(), theEObject);
+    }
+    else
+    {
+      List<EClass> eSuperTypes = theEClass.getESuperTypes();
+      return
+        eSuperTypes.isEmpty() ?
+          defaultCase(theEObject) :
+          doSwitch(eSuperTypes.get(0), theEObject);
+    }
+  }
+
+  /**
+   * 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
+   */
+  protected T doSwitch(int classifierID, EObject theEObject)
+  {
+    switch (classifierID)
+    {
+      case ChangePackage.CHANGE_DESCRIPTION:
+      {
+        ChangeDescription changeDescription = (ChangeDescription)theEObject;
+        T result = caseChangeDescription(changeDescription);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case ChangePackage.EOBJECT_TO_CHANGES_MAP_ENTRY:
+      {
+        @SuppressWarnings("unchecked") Map.Entry<EObject, EList<FeatureChange>> eObjectToChangesMapEntry = (Map.Entry<EObject, EList<FeatureChange>>)theEObject;
+        T result = caseEObjectToChangesMapEntry(eObjectToChangesMapEntry);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case ChangePackage.FEATURE_CHANGE:
+      {
+        FeatureChange featureChange = (FeatureChange)theEObject;
+        T result = caseFeatureChange(featureChange);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case ChangePackage.LIST_CHANGE:
+      {
+        ListChange listChange = (ListChange)theEObject;
+        T result = caseListChange(listChange);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case ChangePackage.RESOURCE_CHANGE:
+      {
+        ResourceChange resourceChange = (ResourceChange)theEObject;
+        T result = caseResourceChange(resourceChange);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case ChangePackage.FEATURE_MAP_ENTRY:
+      {
+        FeatureMapEntry featureMapEntry = (FeatureMapEntry)theEObject;
+        T result = caseFeatureMapEntry(featureMapEntry);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      default: return defaultCase(theEObject);
+    }
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Description</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>Description</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseChangeDescription(ChangeDescription object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>EObject To Changes Map Entry</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>EObject To Changes Map Entry</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseEObjectToChangesMapEntry(Map.Entry<EObject, EList<FeatureChange>> object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Feature 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>Feature Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseFeatureChange(FeatureChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>List 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>List Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseListChange(ListChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Resource 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>Resource Change</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseResourceChange(ResourceChange object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Feature Map Entry</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 Map Entry</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseFeatureMapEntry(FeatureMapEntry 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
+   */
+  public T defaultCase(EObject object)
+  {
+    return null;
+  }
+
+} //ChangeSwitch
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ListDifferenceAnalyzer.java b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ListDifferenceAnalyzer.java
new file mode 100644
index 0000000..ecbe42b
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/ListDifferenceAnalyzer.java
@@ -0,0 +1,175 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2007 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: ListDifferenceAnalyzer.java,v 1.2 2008/05/04 17:03:41 emerks Exp $
+ */
+package org.eclipse.emf.ecore.change.util;
+
+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.change.ChangeFactory;
+import org.eclipse.emf.ecore.change.ChangeKind;
+import org.eclipse.emf.ecore.change.ListChange;
+
+
+/**
+ * Abstract class implementing the methods required to compute differences between
+ * lists.  The differences are described by {@link ListChange} objects.
+ * @since 2.3
+ */
+public class ListDifferenceAnalyzer
+{
+  /**
+   * Analyzes the differences between two lists, returning the {@link ListChange list changes}
+   * that describe how the <code>newList</code> could be changed to the contents of 
+   * <code>oldList</code>.  The lists are not modified by this method.</p>
+   * @param oldList
+   * @param newList
+   * @return a list of {@link ListChange}
+   */
+  public EList<ListChange> analyzeLists(EList<?> oldList, EList<?> newList)
+  {
+    EList<ListChange> listChanges = new BasicEList<ListChange>();
+    analyzeLists(new BasicEList<Object>(oldList), newList, listChanges);
+    return listChanges;
+  }
+
+  /**
+   * <p>Analyzes the differences between two lists, adding new {@link ListChange list changes} to the
+   * specified <code>listChanges</code>.  The list changes describe how the <code>newList</code>
+   * should be manipulated in order to have the same contents of <code>oldList</code></p>
+   * 
+   * <p>This methods changes the contents of <code>oldList</code></p>
+   * 
+   * @param oldList
+   * @param newList
+   * @param listChanges
+   */
+  public void analyzeLists(EList<Object> oldList, EList<?> newList, EList<ListChange> listChanges)
+  {
+    createListChanges(new BasicEList<Object>(oldList), newList, listChanges);
+  }
+  
+  /**
+   * @see #analyzeLists(EList, EList, EList)
+   */
+  protected void createListChanges(EList<Object> oldList, EList<?> newList, EList<ListChange> listChanges)
+  {
+    int index = 0;
+    for (Object newObject : newList)
+    {
+      if (oldList.size() <= index)
+      {
+        createAddListChange(oldList, listChanges, newObject, index);
+      }
+      else
+      {
+        boolean done;
+        do
+        {
+          done = true;
+          Object targetObject = oldList.get(index);
+          if (targetObject == null ? newObject != null : !targetObject.equals(newObject))
+          {
+            int position = ECollections.indexOf(oldList, newObject, index);
+            if (position != -1)
+            {
+              int targetIndex = ECollections.indexOf(newList, targetObject, index);
+              if (targetIndex == -1)
+              {
+                createRemoveListChange(oldList, listChanges, newObject, index);
+                done = false;
+              }
+              else if (targetIndex > position)
+              {
+                if (oldList.size() <= targetIndex)
+                {
+                  targetIndex = oldList.size() - 1;
+                }
+                createMoveListChange(oldList, listChanges, newObject, index, targetIndex);
+                done = false;
+              }
+              else
+              {
+                createMoveListChange(oldList, listChanges, newObject, position, index);
+              }
+            }
+            else
+            {
+              createAddListChange(oldList, listChanges, newObject, index);
+            }
+          }
+        }
+        while (!done);
+      }
+      ++index;
+    }
+    for (int i = oldList.size(); i > index;)
+    {
+      createRemoveListChange(oldList, listChanges, null, --i);
+    }
+  }
+
+  /**
+   * Convenience method added to allow subclasses to modify the default implementation 
+   * for the scenario in which an element was added to the monitored list.
+   * @see #createListChanges(EList, EList, EList) 
+   */
+  protected void createAddListChange(EList<Object> oldList, EList<ListChange> listChanges, Object newObject, int index)
+  {
+    ListChange listChange = createListChange(listChanges, ChangeKind.ADD_LITERAL, index);
+    listChange.getValues().add(newObject);
+    oldList.add(index, newObject);    
+  }
+
+  /**
+   * Convenience method added to allow subclasses to modify the default implementation 
+   * for the scenario in which an element was removed from the monitored list.
+   * @see #createListChanges(EList, EList, EList) 
+   */
+  protected void createRemoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object newObject, int index)
+  {
+    createListChange(listChanges, ChangeKind.REMOVE_LITERAL, index);
+    oldList.remove(index);
+  }
+
+  /**
+   * Convenience method added to allow subclasses to modify the default implementation 
+   * for the scenario in which an element was moved in the monitored list.
+   * @see #createListChanges(EList, EList, EList) 
+   */
+  protected void createMoveListChange(EList<?> oldList, EList<ListChange> listChanges, Object newObject, int index, int toIndex)
+  {
+    ListChange listChange = createListChange(listChanges, ChangeKind.MOVE_LITERAL, index);
+    listChange.setMoveToIndex(toIndex);
+    oldList.move(toIndex, index);
+   }  
+
+  /**
+   * Creates a ListChange, initializes the main attributes, and adds it to the specified listChanges.   
+   * @param listChanges
+   * @param kind
+   * @param index
+   * @return ListChange
+   */
+  protected ListChange createListChange(EList<ListChange> listChanges, ChangeKind kind, int index)
+  {
+    ListChange listChange = ChangeFactory.eINSTANCE.createListChange();
+    listChange.setKind(kind);
+    listChange.setIndex(index);
+    listChanges.add(listChange);
+    return listChange;
+  }
+}
diff --git a/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/package.html b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/package.html
new file mode 100644
index 0000000..8cead71
--- /dev/null
+++ b/org.eclipse.emf.ecore.change/src/org/eclipse/emf/ecore/change/util/package.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content="HTML Tidy, see www.w3.org" />
+<meta http-equiv="Content-Type"
+content="text/html; charset=ISO-8859-1" /><!--
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2003-2004 IBM Corporation 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:
+ *   IBM - Initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: package.html,v 1.4 2005/06/08 06:16:16 nickb Exp $
+ */
+-->
+<title></title>
+</head>
+<body>
+Provides utilities.
+</body>
+</html>
+


hooks/post-receive
-- 
eclipse-emf - Plug-in for eclipse - Debian package.



More information about the pkg-java-commits mailing list