[479449] Introduce MultiplicityElementChanges

Created new UMLDiff type for changes of MultiplicityElements.
Contribution also contains PostProcessor that ensures that the conflicts 
between MultiplicityElements are correct with respect to their type.

Includes tests.

Bug: 479449
CQ: 11548
Change-Id: I9faefd2dc948b1d2ea8e45ef232e9c82a9285f74
Also-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
Signed-off-by: Alexandra Buzila <abuzila@eclipsesource.com>
Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
index 4b04a19..2261445 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.compare.diagram.papyrus.tests;singleton:=true
-Bundle-Version: 2.5.0.qualifier
+Bundle-Version: 2.5.1.qualifier
 Require-Bundle: org.eclipse.core.runtime,
  org.junit,
  org.eclipse.osgi,
@@ -26,9 +26,9 @@
  org.eclipse.emf.compare.rcp.ui;bundle-version="4.0.0",
  org.eclipse.emf.compare.ide;bundle-version="3.2.0",
  org.eclipse.emf.compare.ide.ui,
- org.eclipse.emf.compare.uml2;bundle-version="2.1.0",
- org.eclipse.emf.compare.uml2.edit;bundle-version="2.2.0",
- org.eclipse.emf.compare.uml2.rcp.ui;bundle-version="2.2.0",
+ org.eclipse.emf.compare.uml2;bundle-version="2.5.0",
+ org.eclipse.emf.compare.uml2.edit;bundle-version="2.5.0",
+ org.eclipse.emf.compare.uml2.rcp.ui;bundle-version="2.5.0",
  org.eclipse.emf.compare.diagram,
  org.eclipse.emf.compare.diagram.edit;bundle-version="2.3.0",
  org.eclipse.emf.compare.diagram.ide.ui;bundle-version="3.1.0",
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
index f877b2b..1803a39 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
@@ -10,7 +10,7 @@
   </parent>
   <groupId>org.eclipse.emf.compare</groupId>
   <artifactId>org.eclipse.emf.compare.diagram.papyrus.tests</artifactId>
-  <version>2.5.0-SNAPSHOT</version>
+  <version>2.5.1-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   
   <build>
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
index 0bd21ee..f573264 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013 Obeo.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -19,6 +19,7 @@
 import com.google.common.collect.Iterables;
 
 import java.io.IOException;
+import java.util.regex.Pattern;
 
 import org.eclipse.emf.common.util.BasicMonitor;
 import org.eclipse.emf.compare.Comparison;
@@ -30,8 +31,10 @@
 import org.eclipse.emf.compare.diagram.papyrus.tests.AbstractTest;
 import org.eclipse.emf.compare.diagram.papyrus.tests.DiagramInputData;
 import org.eclipse.emf.compare.diagram.papyrus.tests.merge.data.EdgeMergeInputData;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
 import org.eclipse.emf.compare.uml2.internal.DirectedRelationshipChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -42,12 +45,12 @@
 	private EdgeMergeInputData input = new EdgeMergeInputData();
 	
 	private static final int A1_EDGECHANGE_NB = 19;
-	private static final int A1_ASSOCHANGE_NB = 14;
+	private static final int A1_ASSOCHANGE_NB = 18;
 	private static final int A1_DIFFS_NB = A1_EDGECHANGE_NB + A1_ASSOCHANGE_NB;
 	
 	private static final int A2_EDGECHANGE_NB = 19;
 	private static final int A2_NODECHANGE_NB = 26;
-	private static final int A2_ASSOCHANGE_NB = 14;
+	private static final int A2_ASSOCHANGE_NB = 18;
 	private static final int A2_CLASSCHANGE_NB = 1;
 	private static final int A2_DIFFS_NB = A2_EDGECHANGE_NB + A2_NODECHANGE_NB + A2_ASSOCHANGE_NB + A2_CLASSCHANGE_NB;
 	
@@ -107,7 +110,7 @@
 	private static final int A6_SUBSTITUTION_CHANGE1_NB = 6;
 	private static final int A6_IREAL_CHANGE1_NB = 6;
 	private static final int A6_DEPENDENCY_CHANGES_NB = 8 * A6_DEPENDENCY_CHANGE1_NB + 2 * A6_SUBSTITUTION_CHANGE1_NB + A6_IREAL_CHANGE1_NB;
-	private static final int A6_ASSO_CHANGE1_NB = 14;
+	private static final int A6_ASSO_CHANGE1_NB = 18;
 	private static final int A6_ASSO_CHANGES_NB = 2 * A6_ASSO_CHANGE1_NB;
 	private static final int A6_IMPORT_CHANGE1_NB = 3;
 	private static final int A6_IMPORT_CHANGES_NB = 2 * A6_IMPORT_CHANGE1_NB;
@@ -1739,5 +1742,17 @@
 	protected DiagramInputData getInput() {
 		return input;
 	}
-	
+
+	@Override
+	protected void registerPostProcessors() {
+		super.registerPostProcessors();
+		getPostProcessorRegistry()
+				.put(MultiplicityElementChangePostProcessor.class.getName(),
+						new TestPostProcessor.TestPostProcessorDescriptor(
+								Pattern.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"),
+								null,
+								new MultiplicityElementChangePostProcessor(),
+								25));
+	}
+
 }
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
index 03365c5..9169f78 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015 Obeo and others.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -8,6 +8,7 @@
  * Contributors:
  *     Obeo - initial API and implementation
  *     Philip Langer - bug 482404
+ *     Alexandra Buzila - Bug 479449
  *******************************************************************************/
 package org.eclipse.emf.compare.diagram.papyrus.tests.merge;
 
@@ -23,6 +24,7 @@
 import com.google.common.collect.Iterables;
 
 import java.io.IOException;
+import java.util.regex.Pattern;
 
 import org.eclipse.emf.common.util.BasicMonitor;
 import org.eclipse.emf.compare.AttributeChange;
@@ -38,7 +40,9 @@
 import org.eclipse.emf.compare.diagram.papyrus.tests.AbstractTest;
 import org.eclipse.emf.compare.diagram.papyrus.tests.DiagramInputData;
 import org.eclipse.emf.compare.diagram.papyrus.tests.merge.data.NodeMergeInputData;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -68,7 +72,7 @@
 
 	private static final int A1_ELTCHANGES_NB = 8 * A1_ELTCHANGE1_NB;
 
-	private static final int A1_ASSOCHANGE1_NB = 14;
+	private static final int A1_ASSOCHANGE1_NB = 18;
 
 	private static final int A1_ASSOCHANGES_NB = 3 * A1_ASSOCHANGE1_NB;
 
@@ -1509,4 +1513,16 @@
 		};
 	}
 
+	@Override
+	protected void registerPostProcessors() {
+		super.registerPostProcessors();
+		getPostProcessorRegistry()
+				.put(MultiplicityElementChangePostProcessor.class.getName(),
+						new TestPostProcessor.TestPostProcessorDescriptor(
+								Pattern.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"),
+								null,
+								new MultiplicityElementChangePostProcessor(),
+								25));
+	}
+
 }
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
index 34d9150..d917dcb 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
@@ -2,22 +2,22 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.compare.uml2.edit;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.emf.compare.uml2.internal.provider.UMLCompareEditPlugin$Implementation
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.compare.uml2;visibility:=reexport,
+ org.eclipse.emf.compare.uml2;bundle-version="2.5.0";visibility:=reexport,
  org.eclipse.emf.edit;visibility:=reexport,
  org.eclipse.emf.ecore;visibility:=reexport,
  org.eclipse.emf.ecore.edit;visibility:=reexport,
- org.eclipse.uml2.uml;bundle-version="5.0.0",
- org.eclipse.emf.compare,
- org.eclipse.uml2.uml.edit;bundle-version="5.0.0",
- org.eclipse.uml2.types,
- org.eclipse.emf.compare.edit
+ org.eclipse.uml2.uml;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.emf.compare;bundle-version="3.4.0";visibility:=reexport,
+ org.eclipse.uml2.uml.edit;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.emf.compare.edit;bundle-version="4.2.0";visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Import-Package: com.google.common.base;version="[11.0.0,16.0.0)",
  com.google.common.collect;version="[11.0.0,16.0.0)",
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif
new file mode 100644
index 0000000..98b351f
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif
new file mode 100644
index 0000000..1e5345f
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties b/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
index 6270b66..ff5fe7a 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
@@ -166,7 +166,9 @@
 _UI_StereotypedElementChange_stereotypeApplications_feature = Stereotype Applications
 _UI_OpaqueElementBodyChange_type = Opaque Element Body Change
 _UI_OpaqueElementBodyChange_language_feature = Language
-
-#Error messaged
-Unable_To_Retreive_Icon_Error_Message = "Unable to retrieve the icon at location {0}
 _UI_DanglingStereotypeApplication_type = Dangling Stereotype Application
+_UI_MultiplicityReferenceChange_type = Multiplicity Reference Change
+
+#Error messages
+Unable_To_Retreive_Icon_Error_Message = "Unable to retrieve the icon at location {0}
+_UI_MultiplicityElementChange_type = Multiplicity Element Change
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml b/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
index c67ead2..efbaa1c 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
@@ -10,6 +10,6 @@
   </parent>
   <groupId>org.eclipse.emf.compare</groupId>
   <artifactId>org.eclipse.emf.compare.uml2.edit</artifactId>
-  <version>2.4.0-SNAPSHOT</version>
+  <version>2.5.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java
new file mode 100644
index 0000000..684a9b6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ *     Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal.provider;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.compare.DifferenceKind;
+
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MultiplicityElementChangeItemProvider extends UMLDiffItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MultiplicityElementChangeItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This returns MultiplicityElementChange.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/MultiplicityElementChange")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		DifferenceKind labelValue = ((MultiplicityElementChange)object).getKind();
+		String label = labelValue == null ? null : labelValue.toString();
+		return label == null || label.length() == 0 ? getString("_UI_MultiplicityElementChange_type") : //$NON-NLS-1$
+				getString("_UI_MultiplicityElementChange_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
index 24e9fee..fa29b77 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
@@ -261,6 +261,29 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MultiplicityElementChangeItemProvider multiplicityElementChangeItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createMultiplicityElementChangeAdapter() {
+		if (multiplicityElementChangeItemProvider == null) {
+			multiplicityElementChangeItemProvider = new MultiplicityElementChangeItemProvider(this);
+		}
+
+		return multiplicityElementChangeItemProvider;
+	}
+
+	/**
 	 * This returns the root adapter factory that contains this factory.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java
new file mode 100644
index 0000000..bbc183c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.provider.custom;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.provider.ExtendedAdapterFactoryItemDelegator;
+import org.eclipse.emf.compare.provider.utils.ComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.Style;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * Custom {@link UMLDiffCustomItemProvider} for {@link MultiplicityElementChange MultiplicityElementChanges}
+ * that handles {@link org.eclipse.emf.compare.provider.IItemStyledLabelProvider} .
+ * 
+ * @author Alexandra Buzila
+ */
+public class MultiplicityElementCustomItemProvider extends UMLDiffCustomItemProvider {
+
+	/** Item delegator that reuses the root adapter factory (if any). */
+	private ExtendedAdapterFactoryItemDelegator itemDelegator;
+
+	/**
+	 * Constructs a new instance of the item provider.
+	 * 
+	 * @param adapterFactory
+	 *            the adapter factory to use.
+	 */
+	public MultiplicityElementCustomItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+		itemDelegator = new ExtendedAdapterFactoryItemDelegator(getRootAdapterFactory());
+	}
+
+	@Override
+	public IComposedStyledString getStyledText(Object object) {
+		MultiplicityElementChange diff = (MultiplicityElementChange)object;
+		IComposedStyledString styledText = new ComposedStyledString(getInternalText(diff));
+		String changedFeature = getChangedFeatureText(diff);
+		styledText.append(" [" + changedFeature, Style.DECORATIONS_STYLER); //$NON-NLS-1$
+		switch (diff.getKind()) {
+			case ADD:
+				styledText.append(" add", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+				break;
+			case DELETE:
+				styledText.append(" delete", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+				break;
+			case CHANGE:
+				styledText.append(" change", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+				break;
+			default:
+				throw new IllegalStateException("Unsupported " + DifferenceKind.class.getSimpleName() //$NON-NLS-1$
+						+ " value: " + diff.getKind()); //$NON-NLS-1$
+		}
+		styledText.append("]", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+		return styledText;
+
+	}
+
+	/**
+	 * Provides the name of the MultiplicityElement's structural feature affected by this diff. This will be
+	 * either the <code>lowerValue</code> or <code>upperValue</code>.
+	 * 
+	 * @param diff
+	 *            the {@link MultiplicityElementChange}
+	 * @return the name of the feature
+	 */
+	private String getChangedFeatureText(MultiplicityElementChange diff) {
+		return diff.getDiscriminant().eContainmentFeature().getName();
+	}
+
+	/**
+	 * Provides the default label of the given diff.
+	 * 
+	 * @param diff
+	 *            the {@link MultiplicityElementChange} for which the label is returned
+	 * @return the label
+	 */
+	private String getInternalText(MultiplicityElementChange diff) {
+		EObject discriminant = diff.getDiscriminant();
+		String text = itemDelegator.getText(discriminant);
+		if (text == null) {
+			text = "<null>"; //$NON-NLS-1$
+		}
+		return text;
+	}
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
index 8238ba6..db59d5d 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012, 2015 Obeo and others.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -8,6 +8,7 @@
  * Contributors:
  *     Obeo - initial API and implementation
  *     Philip Langer - added OpaqueElementBodyChange adapter
+ *     Alexandra Buzila - MultiplicityElementChange adapter
  */
 package org.eclipse.emf.compare.uml2.internal.provider.custom;
 
@@ -128,6 +129,11 @@
 		return new DanglingStereotypeApplicationCustomItemProvider(this);
 	}
 
+	@Override
+	public Adapter createMultiplicityElementChangeAdapter() {
+		return new MultiplicityElementCustomItemProvider(this);
+	}
+
 	/**
 	 * {@inheritDoc}
 	 * 
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
index 46ddd46..714f308 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.compare.uml2.rcp.ui;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.emf.edit.ui;bundle-version="2.5.0",
- org.eclipse.emf.compare.uml2.edit;bundle-version="2.0.1",
- org.eclipse.emf.compare;bundle-version="2.0.1",
+ org.eclipse.emf.compare.uml2.edit;bundle-version="2.5.0",
+ org.eclipse.emf.compare;bundle-version="3.4.0",
  org.eclipse.swt;bundle-version="3.5.0",
- org.eclipse.emf.compare.rcp.ui;bundle-version="2.0.1",
+ org.eclipse.emf.compare.rcp.ui;bundle-version="4.3.0",
  org.eclipse.core.runtime;bundle-version="3.5.0",
  org.eclipse.uml2.uml;bundle-version="5.0.0",
  org.eclipse.emf.compare.edit;bundle-version="3.0.0"
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
index 0705d28..3cad926 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
@@ -35,6 +35,10 @@
             class="org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory.UMLDanglingStereotypeApplicationAccessorFactory"
             ranking="25">
       </factory>
+      <factory
+            class="org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory.MultiplicityElementAttributeChangeAccessorFactory"
+            ranking="25">
+      </factory>
    </extension>
    <extension
          point="org.eclipse.emf.compare.rcp.ui.filters">
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
index 1d49393..2c6abad 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
@@ -10,6 +10,6 @@
   </parent>
   <groupId>org.eclipse.emf.compare</groupId>
   <artifactId>org.eclipse.emf.compare.uml2.rcp.ui</artifactId>
-  <version>2.4.0-SNAPSHOT</version>
+  <version>2.5.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java
new file mode 100644
index 0000000..07b44df
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.SingleStructuralFeatureAccessorImpl;
+import org.eclipse.emf.compare.rcp.ui.internal.util.MergeViewerUtil;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.utils.ReferenceUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * Change accessor for {@link MultiplicityElementChange MultiplicityElementChanges} whose prime refining is an
+ * {@link AttributeChange}.
+ * 
+ * @author Alexandra Buzila
+ */
+@SuppressWarnings("restriction")
+public class MultiplicityElementAttributeChangeAccessor extends SingleStructuralFeatureAccessorImpl {
+
+	/**
+	 * A specific {@link SingleStructuralFeatureAccessorImpl} for {@link MultiplicityElementChange
+	 * MultiplicityElementChanges}.
+	 * 
+	 * @param adapterFactory
+	 *            the adapter factory used to create the accessor
+	 * @param diff
+	 *            the diff associated with this accessor
+	 * @param side
+	 *            the side of the accessor
+	 */
+	public MultiplicityElementAttributeChangeAccessor(AdapterFactory adapterFactory, Diff diff,
+			MergeViewerSide side) {
+		super(adapterFactory, diff, side);
+	}
+
+	@Override
+	protected EStructuralFeature getAffectedFeature(Diff diff) {
+		Diff primeRefining = diff.getPrimeRefining();
+		return MergeViewerUtil.getAffectedFeature(primeRefining);
+	}
+
+	@Override
+	public EObject getEObject(MergeViewerSide side) {
+		Match match = getInitialDiff().getMatch();
+		EObject multiplicityElement = MergeViewerUtil.getEObject(match, side);
+		if (multiplicityElement == null) {
+			return null;
+		}
+		MultiplicityElementChange change = (MultiplicityElementChange)getInitialDiff();
+		// the lowerValue/upperValue feature affected by the diff
+		EReference multiplicityElementFeature = change.getDiscriminant().eContainmentFeature();
+		return (EObject)ReferenceUtil.safeEGet(multiplicityElement, multiplicityElementFeature);
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java
new file mode 100644
index 0000000..873cacb
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement;
+import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AbstractAccessorFactory;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.MultiplicityElementAttributeChangeAccessor;
+
+/**
+ * Custom {@link AbstractAccessorFactory} for {@link MultiplicityElementChange} elements.
+ * 
+ * @author Alexandra Buzila
+ */
+@SuppressWarnings("restriction")
+public class MultiplicityElementAttributeChangeAccessorFactory extends AbstractAccessorFactory {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isFactoryFor(Object target) {
+		return target instanceof MultiplicityElementChange && ((MultiplicityElementChange)target)
+				.getPrimeRefining() instanceof AttributeChange;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createAncestor(AdapterFactory adapterFactory, Object target) {
+		return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+				MergeViewerSide.ANCESTOR);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createLeft(AdapterFactory adapterFactory, Object target) {
+		return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+				MergeViewerSide.LEFT);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createRight(AdapterFactory adapterFactory, Object target) {
+		return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+				MergeViewerSide.RIGHT);
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
index 61b3200..4ece10f 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.compare.uml2.tests;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml b/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
index 93d597e..01ef916 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
@@ -10,7 +10,7 @@
   </parent>
   <groupId>org.eclipse.emf.compare</groupId>
   <artifactId>org.eclipse.emf.compare.uml2.tests</artifactId>
-  <version>2.4.0-SNAPSHOT</version>
+  <version>2.5.0-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
  
   <build>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
index 3fb9e82..96c07f7 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.eclipse.emf.compare.Comparison;
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
 import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -159,7 +164,7 @@
 	private void testAB1(TestKind kind, final Comparison comparison) {
 		final List<Diff> differences = comparison.getDifferences();
 
-		assertEquals(14, differences.size());
+		assertEquals(18, differences.size());
 
 		Predicate<? super Diff> addAssociationDescription = null;
 		Predicate<? super Diff> addPropertyClass1Description = null;
@@ -281,10 +286,20 @@
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass0));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass0));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass0));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass0));
+
+		// MultiplicityElementChanges
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass0.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass0.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
 
 		// CHECK REQUIREMENT
 		if (kind.equals(TestKind.ADD)) {
@@ -353,7 +368,6 @@
 			assertTrue(addAssociation.getRequires().contains(addPropertyClass1InAssociation));
 
 			assertEquals(0, addUMLAssociation.getRequires().size());
-
 			assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
 			assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
 			assertEquals(0, addLiteralIntegerInClass0.getRequires().size());
@@ -389,4 +403,13 @@
 		return input;
 	}
 
+	@Override
+	protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+		super.registerPostProcessors(postProcessorRegistry);
+		postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+				new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+						.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+						new MultiplicityElementChangePostProcessor(), 25));
+	}
+
 }
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
index 0ce97f2..b54f652 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.eclipse.emf.compare.Comparison;
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
 import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -160,7 +165,7 @@
 	private void testAB1(TestKind kind, final Comparison comparison) {
 		final List<Diff> differences = comparison.getDifferences();
 
-		assertEquals(14, differences.size());
+		assertEquals(18, differences.size());
 
 		Predicate<? super Diff> addAssociationDescription = null;
 		Predicate<? super Diff> addPropertyClass1Description = null;
@@ -274,12 +279,8 @@
 		assertNotNull(addUMLAssociation);
 		assertEquals(13, addUMLAssociation.getRefinedBy().size());
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass1));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass0));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass0));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass0));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass0));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addAssociation));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass0));
@@ -287,6 +288,20 @@
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass1InAssociation));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass0InAssociation));
 
+		// MultiplicityElementChanges
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass0.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass0.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+
 		// CHECK REQUIREMENT
 		if (kind.equals(TestKind.ADD)) {
 			assertEquals(1, addPropertyClass0.getRequires().size());
@@ -354,7 +369,6 @@
 			assertTrue(addAssociation.getRequires().contains(addPropertyClass0InAssociation));
 
 			assertEquals(0, addUMLAssociation.getRequires().size());
-
 			assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
 			assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
 			assertEquals(0, addLiteralIntegerInClass0.getRequires().size());
@@ -388,4 +402,13 @@
 	protected AbstractUMLInputData getInput() {
 		return input;
 	}
+
+	@Override
+	protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+		super.registerPostProcessors(postProcessorRegistry);
+		postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+				new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+						.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+						new MultiplicityElementChangePostProcessor(), 25));
+	}
 }
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
index ec43a5d..504faee 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.eclipse.emf.compare.Comparison;
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
 import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -160,8 +165,8 @@
 	private void testAB1(TestKind kind, final Comparison comparison) {
 		final List<Diff> differences = comparison.getDifferences();
 
-		// We should have no less and no more than 16 differences
-		assertEquals(16, differences.size());
+		// We should have no less and no more than 20 differences
+		assertEquals(20, differences.size());
 
 		Predicate<? super Diff> addAssociationDescription = null;
 		Predicate<? super Diff> addNavigableOwnedEndClass1InAssociationDescription = null;
@@ -298,14 +303,23 @@
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass2));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass2));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass2));
-		assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass2));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addMemberEndClass1InAssociation));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addMemberEndClass2InAssociation));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addOwnedEndClass1InAssociation));
 		assertTrue(addUMLAssociation.getRefinedBy().contains(addOwnedEndClass2InAssociation));
+		// MultiplicityElementChanges
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addLiteralIntegerInClass2.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
+		assertTrue(addUMLAssociation.getRefinedBy().contains(
+				Iterators.find(addUnlimitedNaturalInClass2.getRefines().iterator(),
+						instanceOf(MultiplicityElementChange.class))));
 
 		// CHECK REQUIREMENT
 		if (kind.equals(TestKind.ADD)) {
@@ -370,7 +384,6 @@
 			assertTrue(addAssociation.getRequires().contains(addMemberEndClass2InAssociation));
 
 			assertEquals(0, addUMLAssociation.getRequires().size());
-
 			assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
 			assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
 			assertEquals(0, addLiteralIntegerInClass2.getRequires().size());
@@ -400,4 +413,13 @@
 	protected AbstractUMLInputData getInput() {
 		return input;
 	}
+
+	@Override
+	protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+		super.registerPostProcessors(postProcessorRegistry);
+		postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+				new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+						.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+						new MultiplicityElementChangePostProcessor(), 25));
+	}
 }
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
index 705e07e..c638cd3 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -159,8 +159,8 @@
 	private void testAB1(TestKind kind, final Comparison comparison) {
 		final List<Diff> differences = comparison.getDifferences();
 
-		// We should have no less and no more than 5 differences
-		assertEquals(6, differences.size());
+		// We should have no less and no more than 7 differences
+		assertEquals(8, differences.size());
 
 		Predicate<? super Diff> addPropertyClass2Description = null;
 		Predicate<? super Diff> addRefAssociationInPropertyClass2Description = null;
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
index 603fdeb..09be485 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -35,6 +35,7 @@
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.DifferenceKind;
 import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
 import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
 import org.eclipse.emf.compare.uml2.tests.implications.data.ImplicationsInputData;
@@ -46,7 +47,8 @@
 @SuppressWarnings("nls")
 public class ImplicationsAssociationTest extends AbstractUMLTest {
 
-	private static final int NB_DIFFS = 16;
+	// 16 diffs of interest and 4 MultiplicityElementChanges
+	private static final int NB_DIFFS = 20;
 
 	private ImplicationsInputData input = new ImplicationsInputData();
 
@@ -265,7 +267,8 @@
 	}
 
 	private void checkMergeDeleteNavigableOwnedEnd(Comparison comparison, DiffsOfInterest diffs) {
-		assertEquals(NB_DIFFS - 7, comparison.getDifferences().size());
+		// 7 diffs of interest + 2 MultiplicityElementChanges
+		assertEquals(NB_DIFFS - 9, comparison.getDifferences().size());
 		assertNull(diffs.addNavigableOwnedEndClass1InAssociation);
 		assertNull(diffs.addOwnedEndClass1InAssociation);
 		assertNull(diffs.addMemberEndClass1InAssociation);
@@ -343,7 +346,8 @@
 	}
 
 	private void checkMergeDeleteOwnedEnd(Comparison comparison, DiffsOfInterest diffs) {
-		assertEquals(NB_DIFFS - 7, comparison.getDifferences().size());
+		// 7 diffs of interest+ 2 MultiplicityElementChanges
+		assertEquals(NB_DIFFS - 9, comparison.getDifferences().size());
 		assertNull(diffs.addOwnedEndClass1InAssociation);
 		assertNull(diffs.addMemberEndClass1InAssociation);
 		assertNull(diffs.addRefAssociationInPropertyClass1);
@@ -1018,19 +1022,32 @@
 	}
 
 	private static Predicate<? super Diff> addedLowerValueIn(final String qualifiedName) {
-		return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("lowerValue"));
+		return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("lowerValue"),
+				refinesMultiplicityElementChange());
 	}
 
 	private static Predicate<? super Diff> addedUpperValueIn(final String qualifiedName) {
-		return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("upperValue"));
+		return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("upperValue"),
+				refinesMultiplicityElementChange());
 	}
 
 	private static Predicate<? super Diff> removedLowerValueIn(final String qualifiedName) {
-		return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("lowerValue"));
+		return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("lowerValue"),
+				refinesMultiplicityElementChange());
 	}
 
 	private static Predicate<? super Diff> removedUpperValueIn(final String qualifiedName) {
-		return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("upperValue"));
+		return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("upperValue"),
+				refinesMultiplicityElementChange());
+	}
+
+	private static Predicate<? super Diff> refinesMultiplicityElementChange() {
+		return new Predicate<Diff>() {
+			public boolean apply(Diff input) {
+				return Iterators.any(input.getRefines().iterator(), instanceOf(
+						MultiplicityElementChange.class));
+			}
+		};
 	}
 
 	private class DiffsOfInterest {
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java
new file mode 100644
index 0000000..fd13628
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java
@@ -0,0 +1,600 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.tests.multiplicitychanges;
+
+import static com.google.common.base.Predicates.and;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.size;
+import static org.eclipse.emf.compare.DifferenceSource.LEFT;
+import static org.eclipse.emf.compare.DifferenceSource.RIGHT;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.ide.ui.tests.framework.ResolutionStrategyID;
+import org.eclipse.emf.compare.ide.ui.tests.framework.RuntimeTestRunner;
+import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.Compare;
+import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.ResolutionStrategies;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.uml2.uml.LiteralInteger;
+import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.junit.runner.RunWith;
+
+@RunWith(RuntimeTestRunner.class)
+@ResolutionStrategies(ResolutionStrategyID.PROJECT)
+public class MultiplicityElementChangesTest {
+
+	private static final Predicate<Diff> IS_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return diff instanceof MultiplicityElementChange;
+		}
+	};
+
+	private static final Predicate<Diff> IS_LOWER_VALUE_REFERENCE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			if (!(diff instanceof ReferenceChange)) {
+				return false;
+			}
+			ReferenceChange refChange = (ReferenceChange)diff;
+			return refChange.getReference() == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue();
+		}
+	};
+
+	private static final Predicate<Diff> IS_LOWER_VALUE_ATTRIBUTE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			if (!(diff instanceof AttributeChange)) {
+				return false;
+			}
+			EObject container = MatchUtil.getContainer(diff.getMatch().getComparison(), diff);
+			if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+				EStructuralFeature eContainingFeature = container.eContainingFeature();
+				return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue();
+			}
+			return false;
+		}
+	};
+
+	private static final Predicate<Diff> IS_UPPER_VALUE_REFERENCE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			if (!(diff instanceof ReferenceChange)) {
+				return false;
+			}
+			ReferenceChange refChange = (ReferenceChange)diff;
+			return refChange.getReference() == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+		}
+	};
+
+	private static final Predicate<Diff> IS_UPPER_VALUE_ATTRIBUTE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			if (!(diff instanceof AttributeChange)) {
+				return false;
+			}
+			EObject container = MatchUtil.getContainer(diff.getMatch().getComparison(), diff);
+			if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+				EStructuralFeature eContainingFeature = container.eContainingFeature();
+				return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+			}
+			return false;
+		}
+	};
+
+	private static final Predicate<Diff> IS_UPPER_VALUE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return IS_UPPER_VALUE_REFERENCE_CHANGE.apply(diff) || IS_UPPER_VALUE_ATTRIBUTE_CHANGE.apply(diff);
+		}
+	};
+
+	private static final Predicate<Diff> IS_LOWER_VALUE_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return IS_LOWER_VALUE_REFERENCE_CHANGE.apply(diff) || IS_LOWER_VALUE_ATTRIBUTE_CHANGE.apply(diff);
+		}
+	};
+
+	/**
+	 * <b>origin:</b> an activity with an input pin <br>
+	 * <b>left:</b> multiplicity lower value is added to the input pin <br>
+	 * <b>right:</b> multiplicity upper value is added to the input pin
+	 */
+	@Compare(left = "a1/left.uml", right = "a1/right.uml", ancestor = "a1/origin.uml")
+	public void testNonConflictingAddition(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		assertEquals(1, size(rightChanges));
+
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+		MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange.getKind());
+
+		assertEquals(0, comparison.getConflicts().size());
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin <br>
+	 * <b>left:</b> multiplicity lower value is added to the input pin <br>
+	 * <b>right:</b> multiplicity lower and upper values are added to the input pin, but the lower value is
+	 * the same value as in the left change
+	 */
+	@Compare(left = "a2/left.uml", right = "a2/right.uml", ancestor = "a2/origin.uml")
+	public void testAdditionsWithPseudoconflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(LEFT))));
+		ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(RIGHT))));
+
+		assertEquals(1, size(leftChanges));
+		assertEquals(2, size(rightChanges));
+
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.get(0);
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+		MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+		assertEquals(1, rightChange1.getRefinedBy().size());
+		assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+		MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+		assertEquals(1, rightChange2.getRefinedBy().size());
+		assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+		assertTrue(conflict.getDifferences().contains(leftChange));
+
+		if (isLowerValueChange(rightChange1)) {
+			assertEquals(conflict, rightChange1.getConflict());
+		} else {
+			assertTrue(isLowerValueChange(rightChange2));
+			assertEquals(conflict, rightChange2.getConflict());
+		}
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin <br>
+	 * <b>left:</b> multiplicity lower value is added to the input pin <br>
+	 * <b>right:</b> multiplicity lower and upper values are added to the input pin, but the lower value is
+	 * different than the one in the left change
+	 */
+	@Compare(left = "a3/left.uml", right = "a3/right.uml", ancestor = "a3/origin.uml")
+	public void testAdditionsWithConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(LEFT))));
+		ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(RIGHT))));
+
+		assertEquals(1, size(leftChanges));
+		assertEquals(2, size(rightChanges));
+
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.get(0);
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+		MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+		assertEquals(1, rightChange1.getRefinedBy().size());
+		assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+		MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+		assertEquals(1, rightChange2.getRefinedBy().size());
+		assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.REAL, conflict.getKind());
+
+		if (isLowerValueChange(rightChange1)) {
+			assertEquals(conflict, rightChange1.getConflict());
+		} else {
+			assertTrue(isLowerValueChange(rightChange2));
+			assertEquals(conflict, rightChange2.getConflict());
+		}
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+	 * <b>left:</b> multiplicity lower value is changed to 1 <br>
+	 * <b>right:</b> multiplicity lower value is changed to 2 <br>
+	 * A real conflict should be produced.
+	 */
+	@Compare(left = "a4/left.uml", right = "a4/right.uml", ancestor = "a4/origin.uml")
+	public void testChangesWithConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+		assertEquals(1, size(rightChanges));
+		MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.REAL, conflict.getKind());
+		assertEquals(conflict, rightChange.getConflict());
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+	 * <b>left:</b> multiplicity lower value is changed to 1 <br>
+	 * <b>right:</b> multiplicity lower value is changed to 1 <br>
+	 * A pseudo conflict should be produced.
+	 */
+	@Compare(left = "a5/left.uml", right = "a5/right.uml", ancestor = "a5/origin.uml")
+	public void testChangesWithPseudoconflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		Diff leftChange = leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+		assertEquals(1, size(rightChanges));
+		Diff rightChange = rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+		assertEquals(conflict, rightChange.getConflict());
+
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+	 * <b>left:</b> multiplicity lower value is changed to 1 <br>
+	 * <b>right:</b> multiplicity lower and upper values are removed <br>
+	 */
+	@Compare(left = "a6/left.uml", right = "a6/right.uml", ancestor = "a6/origin.uml")
+	public void testRemoveConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(LEFT))));
+		ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(RIGHT))));
+
+		assertEquals(1, size(leftChanges));
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+		assertEquals(2, size(rightChanges));
+
+		MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+		assertEquals(1, rightChange1.getRefinedBy().size());
+		assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, rightChange1.getKind());
+
+		MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+		assertEquals(1, rightChange2.getRefinedBy().size());
+		assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, rightChange2.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.REAL, conflict.getKind());
+
+		if (isLowerValueChange(rightChange1)) {
+			assertTrue(isUpperValueChange(rightChange2));
+			assertEquals(conflict, rightChange1.getConflict());
+		} else {
+			assertTrue(isUpperValueChange(rightChange1));
+			assertTrue(isLowerValueChange(rightChange2));
+			assertEquals(conflict, rightChange2.getConflict());
+		}
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+	 * <b>left:</b> multiplicity upper value is removed <br>
+	 * <b>right:</b> multiplicity lower value is changed to 1 <br>
+	 */
+	@Compare(left = "a7/left.uml", right = "a7/right.uml", ancestor = "a7/origin.uml")
+	public void testRemoveNoConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+		assertEquals(1, size(rightChanges));
+		MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+		assertEquals(0, comparison.getConflicts().size());
+
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+	 * <b>left:</b> multiplicity upper value is removed <br>
+	 * <b>right:</b> multiplicity upper value is removed <br>
+	 */
+	@Compare(left = "a8/left.uml", right = "a8/right.uml", ancestor = "a8/origin.uml")
+	public void testRemovePseudoConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		assertEquals(1, size(rightChanges));
+
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+		MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, rightChange.getKind());
+
+		assertEquals(1, comparison.getConflicts().size());
+		Conflict conflict = comparison.getConflicts().get(0);
+		assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with an upper value <br>
+	 * <b>left:</b> multiplicity upper value is removed <br>
+	 * <b>right:</b> multiplicity lower value is added <br>
+	 */
+	@Compare(left = "a9/left.uml", right = "a9/right.uml", ancestor = "a9/origin.uml")
+	public void testRemoveAndAddNoConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+		Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+		assertEquals(1, size(leftChanges));
+		assertEquals(1, size(rightChanges));
+
+		MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+		assertEquals(1, leftChange.getRefinedBy().size());
+		assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+		MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange.getKind());
+
+		assertEquals(0, comparison.getConflicts().size());
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with an upper value <br>
+	 * <b>left:</b> multiplicity upper (0) and lower (1) value are added<br>
+	 * <b>right:</b> multiplicity upper (1) and lower (1) value are added<br>
+	 * These changes should produce a real and a pseudo conflict for the same multiplicity change
+	 */
+	@Compare(left = "a10/left.uml", right = "a10/right.uml", ancestor = "a10/origin.uml")
+	public void testRealAndPseudoConflict(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(LEFT))));
+		ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(RIGHT))));
+
+		assertEquals(2, size(leftChanges));
+		assertEquals(2, size(rightChanges));
+
+		MultiplicityElementChange leftChange1 = (MultiplicityElementChange)leftChanges.get(0);
+		assertEquals(1, leftChange1.getRefinedBy().size());
+		assertTrue(leftChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftChange1.getKind());
+
+		MultiplicityElementChange leftChange2 = (MultiplicityElementChange)leftChanges.get(1);
+		assertEquals(1, leftChange2.getRefinedBy().size());
+		assertTrue(leftChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftChange2.getKind());
+
+		MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+		assertEquals(1, rightChange1.getRefinedBy().size());
+		assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+		MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+		assertEquals(1, rightChange2.getRefinedBy().size());
+		assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+		assertEquals(2, comparison.getConflicts().size());
+		Conflict conflict1 = comparison.getConflicts().get(0);
+		Conflict conflict2 = comparison.getConflicts().get(1);
+
+		if (conflict1.getKind() == ConflictKind.PSEUDO) {
+			assertEquals(ConflictKind.REAL, conflict2.getKind());
+		} else {
+			assertEquals(ConflictKind.PSEUDO, conflict2.getKind());
+		}
+
+		if (isUpperValueChange(leftChange1)) {
+			assertTrue(isLowerValueChange(leftChange2));
+			assertNotNull(leftChange1.getConflict());
+			assertEquals(ConflictKind.REAL, leftChange1.getConflict().getKind());
+			assertNotNull(leftChange2.getConflict());
+			assertEquals(ConflictKind.PSEUDO, leftChange2.getConflict().getKind());
+		} else {
+			assertTrue(isLowerValueChange(leftChange1));
+			assertTrue(isUpperValueChange(leftChange2));
+			assertNotNull(leftChange1.getConflict());
+			assertEquals(ConflictKind.PSEUDO, leftChange1.getConflict().getKind());
+			assertNotNull(leftChange2.getConflict());
+			assertEquals(ConflictKind.REAL, leftChange2.getConflict().getKind());
+		}
+
+		if (isUpperValueChange(rightChange1)) {
+			assertTrue(isLowerValueChange(rightChange2));
+			assertNotNull(rightChange1.getConflict());
+			assertEquals(ConflictKind.REAL, rightChange1.getConflict().getKind());
+			assertNotNull(rightChange2.getConflict());
+			assertEquals(ConflictKind.PSEUDO, rightChange2.getConflict().getKind());
+		} else {
+			assertTrue(isLowerValueChange(rightChange1));
+			assertTrue(isUpperValueChange(rightChange2));
+			assertNotNull(rightChange1.getConflict());
+			assertEquals(ConflictKind.PSEUDO, rightChange1.getConflict().getKind());
+			assertNotNull(rightChange2.getConflict());
+			assertEquals(ConflictKind.REAL, rightChange2.getConflict().getKind());
+		}
+
+	}
+
+	private boolean isLowerValueChange(MultiplicityElementChange multiplicityElementChange) {
+		if (multiplicityElementChange.getRefinedBy().size() != 1) {
+			return false;
+		}
+		return IS_LOWER_VALUE_CHANGE.apply(multiplicityElementChange.getRefinedBy().get(0));
+	}
+
+	private boolean isUpperValueChange(MultiplicityElementChange multiplicityElementChange) {
+		if (multiplicityElementChange.getRefinedBy().size() != 1) {
+			return false;
+		}
+		return IS_UPPER_VALUE_CHANGE.apply(multiplicityElementChange.getRefinedBy().get(0));
+	}
+
+	/**
+	 * <b>origin:</b> an activity with an input pin, with a lower value <br>
+	 * <b>left:</b> multiplicity lower value is deleted and upper value is added (0)<br>
+	 * <b>right:</b> multiplicity upper value is added, with the same value as in the left change and the
+	 * lower value is changed to a different value than the one in the left change<br>
+	 * These changes should produce a real and a pseudo conflict for the same multiplicity change
+	 */
+	@Compare(left = "a11/left.uml", right = "a11/right.uml", ancestor = "a11/origin.uml")
+	public void testRealAndPseudoConflictWithChangeAndDelete(Comparison comparison) throws IOException {
+		EList<Diff> diffs = comparison.getDifferences();
+		ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(LEFT))));
+		ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+				fromSide(RIGHT))));
+
+		assertEquals(2, size(leftChanges));
+		assertEquals(2, size(rightChanges));
+
+		MultiplicityElementChange leftAddChange;
+		MultiplicityElementChange leftDeleteChange;
+
+		if (leftChanges.get(0).getKind() == DifferenceKind.ADD) {
+			leftAddChange = (MultiplicityElementChange)leftChanges.get(0);
+			leftDeleteChange = (MultiplicityElementChange)leftChanges.get(1);
+		} else {
+			leftAddChange = (MultiplicityElementChange)leftChanges.get(1);
+			leftDeleteChange = (MultiplicityElementChange)leftChanges.get(0);
+		}
+
+		assertEquals(1, leftAddChange.getRefinedBy().size());
+		assertTrue(leftAddChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, leftAddChange.getKind());
+
+		assertEquals(1, leftDeleteChange.getRefinedBy().size());
+		assertTrue(leftDeleteChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.DELETE, leftDeleteChange.getKind());
+
+		MultiplicityElementChange rightChange;
+		MultiplicityElementChange rightAddChange;
+
+		if (rightChanges.get(0).getKind() == DifferenceKind.ADD) {
+			rightAddChange = (MultiplicityElementChange)rightChanges.get(0);
+			rightChange = (MultiplicityElementChange)rightChanges.get(1);
+		} else {
+			rightAddChange = (MultiplicityElementChange)rightChanges.get(1);
+			rightChange = (MultiplicityElementChange)rightChanges.get(0);
+		}
+
+		assertEquals(1, rightAddChange.getRefinedBy().size());
+		assertTrue(rightAddChange.getRefinedBy().get(0) instanceof ReferenceChange);
+		assertEquals(DifferenceKind.ADD, rightAddChange.getKind());
+
+		assertEquals(1, rightChange.getRefinedBy().size());
+		assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+		assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+		assertEquals(2, comparison.getConflicts().size());
+		Conflict conflict1 = comparison.getConflicts().get(0);
+		Conflict conflict2 = comparison.getConflicts().get(1);
+
+		if (conflict1.getKind() == ConflictKind.PSEUDO) {
+			assertEquals(ConflictKind.REAL, conflict2.getKind());
+		} else {
+			assertEquals(ConflictKind.PSEUDO, conflict2.getKind());
+		}
+		assertEquals(ConflictKind.REAL, leftDeleteChange.getConflict().getKind());
+		assertEquals(leftDeleteChange.getConflict(), rightChange.getConflict());
+		assertEquals(ConflictKind.PSEUDO, leftAddChange.getConflict().getKind());
+		assertEquals(leftAddChange.getConflict(), rightAddChange.getConflict());
+	}
+
+	// @Override
+	// protected void registerPostProcessors(
+	// org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry<String> postProcessorRegistry)
+	// {
+	// super.registerPostProcessors(postProcessorRegistry);
+	// postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+	// new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+	//						.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null, //$NON-NLS-1$
+	// new MultiplicityElementChangePostProcessor(), 25));
+	// }
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml
new file mode 100644
index 0000000..8750ba0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml
new file mode 100644
index 0000000..3de259b
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_y4nCEL6MEeWfFPKKpMWCyw" value="2"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml
new file mode 100644
index 0000000..6da8962
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml
new file mode 100644
index 0000000..44a0d8e
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_bXa-MWYwEeWdseMo2ly0ug" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jPlpwGYvEeWdseMo2ly0ug" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml
new file mode 100644
index 0000000..fd39ace
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml
new file mode 100644
index 0000000..8750ba0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml
new file mode 100644
index 0000000..9f11665
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_1234L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml
new file mode 100644
index 0000000..ad48eee
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Fic2AWYwEeWdseMo2ly0ug" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml
new file mode 100644
index 0000000..171c268
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="2"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml
new file mode 100644
index 0000000..7e3fc4c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml
new file mode 100644
index 0000000..7e95aa9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Fic2AWYwEeWdseMo2ly0ug" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml
new file mode 100644
index 0000000..b9fd375
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml
new file mode 100644
index 0000000..42239ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml
new file mode 100644
index 0000000..76f3de0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml
new file mode 100644
index 0000000..b9fd375
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml
new file mode 100644
index 0000000..42239ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml
new file mode 100644
index 0000000..b9fd375
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml
new file mode 100644
index 0000000..b9fd375
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml
new file mode 100644
index 0000000..42239ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml
new file mode 100644
index 0000000..bea9514
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml
new file mode 100644
index 0000000..42239ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml
new file mode 100644
index 0000000..b9fd375
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml
new file mode 100644
index 0000000..bea9514
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml
new file mode 100644
index 0000000..42239ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml
new file mode 100644
index 0000000..bea9514
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml
new file mode 100644
index 0000000..530742c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml
new file mode 100644
index 0000000..fd39ace
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml
new file mode 100644
index 0000000..76f3de0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+  <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+    <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+      <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+      <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+    </node>
+  </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
index 0b92adb..e00e2bc 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
@@ -13,6 +13,10 @@
  *******************************************************************************/
 package org.eclipse.emf.compare.uml2.tests.suite;
 
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
 import org.eclipse.emf.compare.uml2.tests.association.AddAssociation2Test;
 import org.eclipse.emf.compare.uml2.tests.association.AddAssociation3Test;
 import org.eclipse.emf.compare.uml2.tests.association.AddAssociationTest;
@@ -39,6 +43,7 @@
 import org.eclipse.emf.compare.uml2.tests.merge.ExtensionMergeTest;
 import org.eclipse.emf.compare.uml2.tests.merge.MergeDiffInvolvingRefineDiffTest;
 import org.eclipse.emf.compare.uml2.tests.message.AddMessageTest;
+import org.eclipse.emf.compare.uml2.tests.multiplicitychanges.MultiplicityElementChangesTest;
 import org.eclipse.emf.compare.uml2.tests.nonreg.bug484576_pseudoconflicts.TestNonRegPseudoConflict_484576;
 import org.eclipse.emf.compare.uml2.tests.opaque.OpaqueElementBodyChangeDiffTest;
 import org.eclipse.emf.compare.uml2.tests.opaque.OpaqueElementBodyChangeMergeTest;
@@ -55,10 +60,6 @@
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.Test;
-import junit.textui.TestRunner;
-
 /**
  * This test suite allows us to launch all tests for EMF Compare at once.
  * 
@@ -79,7 +80,8 @@
 		StaticStereotypedElementItemProviderTest.class, DynamicStereotypedElementItemProviderTest.class,
 		OpaqueElementBodyChangeDiffTest.class, OpaqueElementBodyChangeMergeTest.class,
 		DanglingStereotypeApplicationTest.class, MergeDiffInvolvingRefineDiffTest.class,
-		TestNonRegPseudoConflict_484576.class, RemoveStereotypeApplicationPseudoConflictTest.class })
+		TestNonRegPseudoConflict_484576.class, RemoveStereotypeApplicationPseudoConflictTest.class,
+		MultiplicityElementChangesTest.class })
 public class AllTests {
 
 	/**
diff --git a/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
index 3aa97b3..0e2fd56 100644
--- a/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
@@ -2,16 +2,16 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.compare.uml2;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.uml2.uml;bundle-version="5.0.0",
- org.eclipse.uml2.types,
- org.eclipse.emf.compare
+ org.eclipse.uml2.uml;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.emf.compare;bundle-version="3.4.0";visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Bundle-Activator: org.eclipse.emf.compare.uml2.internal.UMLComparePlugin
 Import-Package: com.google.common.base;version="[11.0.0,16.0.0)",
diff --git a/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore b/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
index c739777..b73dfd2 100644
--- a/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
+++ b/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
@@ -25,4 +25,5 @@
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="language" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DanglingStereotypeApplication" eSuperTypes="platform:/plugin/org.eclipse.emf.compare/model/compare.ecore#//ResourceAttachmentChange #//UMLDiff"/>
+  <eClassifiers xsi:type="ecore:EClass" name="MultiplicityElementChange" eSuperTypes="#//UMLDiff"/>
 </ecore:EPackage>
diff --git a/plugins/org.eclipse.emf.compare.uml2/plugin.xml b/plugins/org.eclipse.emf.compare.uml2/plugin.xml
index 47cc963..dd97573 100644
--- a/plugins/org.eclipse.emf.compare.uml2/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.uml2/plugin.xml
@@ -50,6 +50,15 @@
                value="http://www.eclipse.org/uml2/\d.0.0/UML">
          </nsURI>
       </processor>
+     <processor
+           class="org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor"
+           description="Post Processor for handling UML MultiplicityElement changes"
+           label="Multiplicity Element Change Post Processor"
+           ordinal="25">
+        <nsURI
+              value="http://www.eclipse.org/uml2/\d.0.0/UML">
+        </nsURI>
+     </processor>
    </extension>
    <extension
          point="org.eclipse.emf.compare.rcp.merger">
diff --git a/plugins/org.eclipse.emf.compare.uml2/pom.xml b/plugins/org.eclipse.emf.compare.uml2/pom.xml
index 9302636..502392f 100644
--- a/plugins/org.eclipse.emf.compare.uml2/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2/pom.xml
@@ -10,6 +10,6 @@
   </parent>
   <groupId>org.eclipse.emf.compare</groupId>
   <artifactId>org.eclipse.emf.compare.uml2</artifactId>
-  <version>2.4.0-SNAPSHOT</version>
+  <version>2.5.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java
new file mode 100644
index 0000000..18f27d9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ *     Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal;
+
+/**
+ * <!-- begin-user-doc --> A representation of the model object '<em><b>Multiplicity Element Change</b></em> 
+ * '. <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.emf.compare.uml2.internal.UMLComparePackage#getMultiplicityElementChange()
+ * @model
+ * @generated
+ */
+public interface MultiplicityElementChange extends UMLDiff {
+} // MultiplicityElementChange
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
index 7f62f99..24a6f31 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
@@ -151,6 +151,15 @@
 	DanglingStereotypeApplication createDanglingStereotypeApplication();
 
 	/**
+	 * Returns a new object of class '<em>Multiplicity Element Change</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Multiplicity Element Change</em>'.
+	 * @generated
+	 */
+	MultiplicityElementChange createMultiplicityElementChange();
+
+	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @return the package supported by this factory.
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
index 50aaec7..6b4600d 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
@@ -69,7 +69,7 @@
 	int UML_DIFF = 11;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -220,7 +220,7 @@
 	int ASSOCIATION_CHANGE = 0;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -371,7 +371,7 @@
 	int EXTEND_CHANGE = 1;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -522,7 +522,7 @@
 	int GENERALIZATION_SET_CHANGE = 2;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -673,7 +673,7 @@
 	int EXECUTION_SPECIFICATION_CHANGE = 3;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -824,7 +824,7 @@
 	int INTERVAL_CONSTRAINT_CHANGE = 4;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -975,7 +975,7 @@
 	int MESSAGE_CHANGE = 5;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1126,7 +1126,7 @@
 	int STEREOTYPE_ATTRIBUTE_CHANGE = 6;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1277,7 +1277,7 @@
 	int STEREOTYPE_APPLICATION_CHANGE = 7;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1437,7 +1437,7 @@
 	int STEREOTYPE_REFERENCE_CHANGE = 8;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1588,7 +1588,7 @@
 	int PROFILE_APPLICATION_CHANGE = 9;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1748,7 +1748,7 @@
 	int DIRECTED_RELATIONSHIP_CHANGE = 10;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -1899,7 +1899,7 @@
 	int STEREOTYPED_ELEMENT_CHANGE = 12;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -2050,7 +2050,7 @@
 	int OPAQUE_ELEMENT_BODY_CHANGE = 13;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
 	 * @generated
@@ -2211,7 +2211,7 @@
 	int DANGLING_STEREOTYPE_APPLICATION = 14;
 
 	/**
-	 * The feature id for the '<em><b>Match</b></em>' reference.
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -2364,6 +2364,160 @@
 	int DANGLING_STEREOTYPE_APPLICATION_FEATURE_COUNT = ComparePackage.RESOURCE_ATTACHMENT_CHANGE_FEATURE_COUNT + 2;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl <em>Multiplicity Element Change</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl
+	 * @see org.eclipse.emf.compare.uml2.internal.impl.UMLComparePackageImpl#getMultiplicityElementChange()
+	 * @generated
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE = 15;
+
+	/**
+	 * The feature id for the '<em><b>Match</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__MATCH = UML_DIFF__MATCH;
+
+	/**
+	 * The feature id for the '<em><b>Requires</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__REQUIRES = UML_DIFF__REQUIRES;
+
+	/**
+	 * The feature id for the '<em><b>Required By</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__REQUIRED_BY = UML_DIFF__REQUIRED_BY;
+
+	/**
+	 * The feature id for the '<em><b>Implies</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__IMPLIES = UML_DIFF__IMPLIES;
+
+	/**
+	 * The feature id for the '<em><b>Implied By</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__IMPLIED_BY = UML_DIFF__IMPLIED_BY;
+
+	/**
+	 * The feature id for the '<em><b>Refines</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__REFINES = UML_DIFF__REFINES;
+
+	/**
+	 * The feature id for the '<em><b>Refined By</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__REFINED_BY = UML_DIFF__REFINED_BY;
+
+	/**
+	 * The feature id for the '<em><b>Prime Refining</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__PRIME_REFINING = UML_DIFF__PRIME_REFINING;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__KIND = UML_DIFF__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Source</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__SOURCE = UML_DIFF__SOURCE;
+
+	/**
+	 * The feature id for the '<em><b>State</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__STATE = UML_DIFF__STATE;
+
+	/**
+	 * The feature id for the '<em><b>Equivalence</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__EQUIVALENCE = UML_DIFF__EQUIVALENCE;
+
+	/**
+	 * The feature id for the '<em><b>Conflict</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__CONFLICT = UML_DIFF__CONFLICT;
+
+	/**
+	 * The feature id for the '<em><b>Discriminant</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__DISCRIMINANT = UML_DIFF__DISCRIMINANT;
+
+	/**
+	 * The feature id for the '<em><b>EReference</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE__EREFERENCE = UML_DIFF__EREFERENCE;
+
+	/**
+	 * The number of structural features of the '<em>Multiplicity Element Change</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MULTIPLICITY_ELEMENT_CHANGE_FEATURE_COUNT = UML_DIFF_FEATURE_COUNT + 0;
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.emf.compare.uml2.internal.AssociationChange <em>Association Change</em>}'.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @return the meta object for class '<em>Association Change</em>'.
@@ -2554,6 +2708,16 @@
 	EClass getDanglingStereotypeApplication();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange <em>Multiplicity Element Change</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Multiplicity Element Change</em>'.
+	 * @see org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange
+	 * @generated
+	 */
+	EClass getMultiplicityElementChange();
+
+	/**
 	 * Returns the factory that creates the instances of the model. <!-- begin-user-doc --> <!-- end-user-doc
 	 * -->
 	 * 
@@ -2753,6 +2917,16 @@
 		 */
 		EClass DANGLING_STEREOTYPE_APPLICATION = eINSTANCE.getDanglingStereotypeApplication();
 
+		/**
+		 * The meta object literal for the '{@link org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl <em>Multiplicity Element Change</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl
+		 * @see org.eclipse.emf.compare.uml2.internal.impl.UMLComparePackageImpl#getMultiplicityElementChange()
+		 * @generated
+		 */
+		EClass MULTIPLICITY_ELEMENT_CHANGE = eINSTANCE.getMultiplicityElementChange();
+
 	}
 
 } // UMLComparePackage
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java
new file mode 100644
index 0000000..f0a198e
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ *     Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal.impl;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.UMLComparePackage;
+import org.eclipse.emf.compare.uml2.internal.spec.UMLDiffSpec;
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>Multiplicity Element Change</b></em>
+ * '. <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class MultiplicityElementChangeImpl extends UMLDiffSpec implements MultiplicityElementChange {
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected MultiplicityElementChangeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return UMLComparePackage.Literals.MULTIPLICITY_ELEMENT_CHANGE;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	@Override
+	public Diff getPrimeRefining() {
+		if (getRefinedBy().isEmpty()) {
+			return super.getPrimeRefining();
+		} else {
+			return getRefinedBy().get(0);
+		}
+	}
+
+} // MultiplicityElementChangeImpl
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
index 6867e7a..631ddc7 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
@@ -99,6 +99,8 @@
 				return createOpaqueElementBodyChange();
 			case UMLComparePackage.DANGLING_STEREOTYPE_APPLICATION:
 				return createDanglingStereotypeApplication();
+			case UMLComparePackage.MULTIPLICITY_ELEMENT_CHANGE:
+				return createMultiplicityElementChange();
 			default:
 				throw new IllegalArgumentException(
 						"The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -234,6 +236,16 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MultiplicityElementChange createMultiplicityElementChange() {
+		MultiplicityElementChangeImpl multiplicityElementChange = new MultiplicityElementChangeImpl();
+		return multiplicityElementChange;
+	}
+
+	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated
 	 */
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
index a6cf18c..6d7a7b7 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
@@ -19,6 +19,7 @@
 import org.eclipse.emf.compare.uml2.internal.GeneralizationSetChange;
 import org.eclipse.emf.compare.uml2.internal.IntervalConstraintChange;
 import org.eclipse.emf.compare.uml2.internal.MessageChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
 import org.eclipse.emf.compare.uml2.internal.OpaqueElementBodyChange;
 import org.eclipse.emf.compare.uml2.internal.ProfileApplicationChange;
 import org.eclipse.emf.compare.uml2.internal.StereotypeApplicationChange;
@@ -38,112 +39,130 @@
 
 /**
  * <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!-- end-user-doc -->
+ * 
  * @generated
  */
 public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePackage {
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass associationChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass extendChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass generalizationSetChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass executionSpecificationChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass intervalConstraintChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass messageChangeEClass = null;
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass stereotypeAttributeChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass stereotypeApplicationChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass stereotypeReferenceChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass profileApplicationChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass directedRelationshipChangeEClass = null;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass umlDiffEClass = null;
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass stereotypedElementChangeEClass = null;
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass opaqueElementBodyChangeEClass = null;
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private EClass danglingStereotypeApplicationEClass = 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 -->
+	 * 
+	 * @generated
+	 */
+	private EClass multiplicityElementChangeEClass = 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.compare.uml2.internal.UMLComparePackage#eNS_URI
 	 * @see #init()
@@ -155,24 +174,28 @@
 
 	/**
 	 * <!-- 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.
+	 * 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 UMLComparePackage#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 -->
 	 * 
-	 * <p>This method is used to initialize {@link UMLComparePackage#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 UMLComparePackage init() {
-		if (isInited)
+		if (isInited) {
 			return (UMLComparePackage)EPackage.Registry.INSTANCE.getEPackage(UMLComparePackage.eNS_URI);
+		}
 
 		// Obtain or create and register package
 		UMLComparePackageImpl theUMLComparePackage = (UMLComparePackageImpl)(EPackage.Registry.INSTANCE
@@ -201,6 +224,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getAssociationChange() {
@@ -209,6 +233,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getExtendChange() {
@@ -217,6 +242,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getGeneralizationSetChange() {
@@ -225,6 +251,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getExecutionSpecificationChange() {
@@ -233,6 +260,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getIntervalConstraintChange() {
@@ -241,6 +269,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getMessageChange() {
@@ -248,8 +277,8 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getStereotypeAttributeChange() {
@@ -258,6 +287,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getStereotypeApplicationChange() {
@@ -266,6 +296,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EReference getStereotypeApplicationChange_Stereotype() {
@@ -274,6 +305,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getStereotypeReferenceChange() {
@@ -282,6 +314,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getProfileApplicationChange() {
@@ -290,6 +323,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EReference getProfileApplicationChange_Profile() {
@@ -298,6 +332,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getDirectedRelationshipChange() {
@@ -306,6 +341,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getUMLDiff() {
@@ -314,6 +350,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EReference getUMLDiff_Discriminant() {
@@ -322,6 +359,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EReference getUMLDiff_EReference() {
@@ -329,8 +367,8 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getStereotypedElementChange() {
@@ -338,8 +376,8 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getOpaqueElementBodyChange() {
@@ -347,8 +385,8 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EAttribute getOpaqueElementBodyChange_Language() {
@@ -356,8 +394,8 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public EClass getDanglingStereotypeApplication() {
@@ -366,6 +404,16 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EClass getMultiplicityElementChange() {
+		return multiplicityElementChangeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public UMLCompareFactory getUMLCompareFactory() {
@@ -374,19 +422,21 @@
 
 	/**
 	 * <!-- 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 -->
+	 * 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)
+		if (isCreated) {
 			return;
+		}
 		isCreated = true;
 
 		// Create classes and their features
@@ -424,23 +474,27 @@
 		createEAttribute(opaqueElementBodyChangeEClass, OPAQUE_ELEMENT_BODY_CHANGE__LANGUAGE);
 
 		danglingStereotypeApplicationEClass = createEClass(DANGLING_STEREOTYPE_APPLICATION);
+
+		multiplicityElementChangeEClass = createEClass(MULTIPLICITY_ELEMENT_CHANGE);
 	}
 
 	/**
 	 * <!-- 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 -->
+	 * 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)
+		if (isInitialized) {
 			return;
+		}
 		isInitialized = true;
 
 		// Initialize package
@@ -477,6 +531,7 @@
 		danglingStereotypeApplicationEClass.getESuperTypes().add(
 				theComparePackage.getResourceAttachmentChange());
 		danglingStereotypeApplicationEClass.getESuperTypes().add(this.getUMLDiff());
+		multiplicityElementChangeEClass.getESuperTypes().add(this.getUMLDiff());
 
 		// Initialize classes and features; add operations and parameters
 		initEClass(associationChangeEClass, AssociationChange.class,
@@ -548,6 +603,9 @@
 		initEClass(danglingStereotypeApplicationEClass, DanglingStereotypeApplication.class,
 				"DanglingStereotypeApplication", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 
+		initEClass(multiplicityElementChangeEClass, MultiplicityElementChange.class,
+				"MultiplicityElementChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
 		// Create resource
 		createResource(eNS_URI);
 	}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
index 7d63b8f..870697a 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
@@ -145,6 +145,11 @@
 		}
 
 		@Override
+		public Adapter caseMultiplicityElementChange(MultiplicityElementChange object) {
+			return createMultiplicityElementChangeAdapter();
+		}
+
+		@Override
 		public Adapter caseDiff(Diff object) {
 			return createDiffAdapter();
 		}
@@ -373,6 +378,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange <em>Multiplicity Element Change</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange
+	 * @generated
+	 */
+	public Adapter createMultiplicityElementChangeAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.Diff <em>Diff</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 -->
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
index 0b1c311..6161766 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
@@ -258,6 +258,17 @@
 					result = defaultCase(theEObject);
 				return result;
 			}
+			case UMLComparePackage.MULTIPLICITY_ELEMENT_CHANGE: {
+				MultiplicityElementChange multiplicityElementChange = (MultiplicityElementChange)theEObject;
+				T result = caseMultiplicityElementChange(multiplicityElementChange);
+				if (result == null)
+					result = caseUMLDiff(multiplicityElementChange);
+				if (result == null)
+					result = caseDiff(multiplicityElementChange);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
 			default:
 				return defaultCase(theEObject);
 		}
@@ -475,6 +486,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Multiplicity Element Change</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Multiplicity Element Change</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMultiplicityElementChange(MultiplicityElementChange object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Diff</em>'.
 	 * <!-- begin-user-doc
 	 * --> This implementation returns null; returning a non-null result will terminate the switch. <!--
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java
new file mode 100644
index 0000000..f106a97
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.postprocessor;
+
+import static com.google.common.collect.Iterables.filter;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.Monitor;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * Post processor handling conflicts of {@link MultiplicityElementChange MultiplicityElementChanges}.
+ * 
+ * @author Alexandra Buzila <abuzila@eclipsesource.com>
+ */
+public class MultiplicityElementChangePostProcessor implements IPostProcessor {
+
+	/**
+	 * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange}.
+	 */
+	private static final Predicate<Diff> IS_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return diff instanceof MultiplicityElementChange;
+		}
+	};
+
+	/**
+	 * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange} and
+	 * its {@link DifferenceSource} is LEFT.
+	 */
+	private static final Predicate<Diff> IS_LEFT_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return DifferenceSource.LEFT.equals(diff.getSource()) && IS_MULTIPLICITY_CHANGE.apply(diff);
+		}
+	};
+
+	/**
+	 * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange} and
+	 * its {@link DifferenceSource} is RIGHT.
+	 */
+	private static final Predicate<Diff> IS_RIGHT_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+		public boolean apply(Diff diff) {
+			return DifferenceSource.RIGHT.equals(diff.getSource()) && IS_MULTIPLICITY_CHANGE.apply(diff);
+		}
+	};
+
+	/** {@inheritDoc} */
+	public void postMatch(Comparison comparison, Monitor monitor) {
+		// do nothing
+	}
+
+	/** {@inheritDoc} */
+	public void postDiff(Comparison comparison, Monitor monitor) {
+		// do nothing
+	}
+
+	/** {@inheritDoc} */
+	public void postRequirements(Comparison comparison, Monitor monitor) {
+		// do nothing
+	}
+
+	/** {@inheritDoc} */
+	public void postEquivalences(Comparison comparison, Monitor monitor) {
+		// do nothing
+	}
+
+	/** {@inheritDoc} */
+	public void postConflicts(Comparison comparison, Monitor monitor) {
+		// do nothing
+	}
+
+	/** {@inheritDoc} */
+	public void postComparison(Comparison comparison, Monitor monitor) {
+		updateRequiresAndRefines(comparison);
+		verifyConflicts(comparison);
+	}
+
+	/**
+	 * Update the "refinedBy" and "requiredBy" relationships for the MultiplicityElementChanges.
+	 * <p>
+	 * If a MultiplicityElementChange is refined by a difference, <b>refiningDiff</b>, which in turn refines
+	 * another diff, <b>refinedDiff</b>, then the refinement relationships will be updated such that the
+	 * MultiplicityElementChange will refine the <b>refinedDiff</b>, instead of the <b>refiningDiff</b>.
+	 * <p>
+	 * This is done to avoid having diffs that refine multiple elements. Moreover, since any refined diffs of
+	 * a refining diff are marked as required by the {@link UMLPostProcessor}, the requirement relationship
+	 * needs to be updated accordingly.
+	 * 
+	 * @param comparison
+	 *            the current comparison
+	 */
+	private void updateRequiresAndRefines(Comparison comparison) {
+		Iterator<Diff> multiplicityChanges = Iterators.filter(comparison.getDifferences().iterator(),
+				IS_MULTIPLICITY_CHANGE);
+		while (multiplicityChanges.hasNext()) {
+			MultiplicityElementChange refChange = (MultiplicityElementChange)multiplicityChanges.next();
+			for (Diff refiningDiff : refChange.getRefinedBy()) {
+				ArrayList<Diff> refinedChangesToUpdate = new ArrayList<Diff>();
+				for (Diff refinedDiff : refiningDiff.getRefines()) {
+					if (refinedDiff != refChange) {
+						refinedChangesToUpdate.add(refinedDiff);
+					}
+				}
+				for (Diff refined : refinedChangesToUpdate) {
+					refined.getRefinedBy().remove(refiningDiff);
+					refined.getRefinedBy().add(refChange);
+					refined.getRequires().remove(refChange);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Verifies whether the {@link ConflictKind} of conflicts between MultiplicityChanges is correct.
+	 * 
+	 * @param comparison
+	 *            the comparison containing the conflicts
+	 */
+	private void verifyConflicts(Comparison comparison) {
+		final EList<Diff> diffs = comparison.getDifferences();
+		final Iterable<Diff> leftChanges = filter(diffs, IS_LEFT_MULTIPLICITY_CHANGE);
+		for (Diff leftDiff : leftChanges) {
+			final MultiplicityElementChange leftChange = (MultiplicityElementChange)leftDiff;
+
+			final Match match = leftChange.getMatch();
+			final Iterable<Diff> rightChanges = filter(diffs, IS_RIGHT_MULTIPLICITY_CHANGE);
+			for (Diff rightDiff : rightChanges) {
+				MultiplicityElementChange rightChange = (MultiplicityElementChange)rightDiff;
+				if (leftChange.getConflict() != null) {
+					verifyConflict(match, leftChange, rightChange);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Verifies whether the {@link ConflictKind} of conflicts between MultiplicityChanges is correct, for a
+	 * given match. Specifically, it checks whether the type of all the diffs refining the multiplicity
+	 * reference changes is correct and makes sure that if a change contains both PSEUDO and REAL conflicts,
+	 * the conflict of the multiplicity change is marked as REAL.
+	 * 
+	 * @param match
+	 *            the {@link Match} for the object the multiplicity changes refer to
+	 * @param leftChange
+	 *            the left side change
+	 * @param rightChange
+	 *            the right side change
+	 */
+	private void verifyConflict(Match match, MultiplicityElementChange leftChange,
+			MultiplicityElementChange rightChange) {
+		if (!isRefinedByReferenceChange(leftChange) || !isRefinedByReferenceChange(rightChange)) {
+			return;
+		}
+		ReferenceChange leftRefChange = (ReferenceChange)leftChange.getRefinedBy().get(0);
+		EReference reference = leftRefChange.getReference();
+
+		if (!affectsReference(reference, rightChange)) {
+			return;
+		}
+		boolean sameValue = sameValue(reference, match.getLeft(), match.getRight());
+		updateConflict(leftChange, rightChange, sameValue);
+
+	}
+
+	/**
+	 * Updates the conflict kind of the given MultiplicityElementChanges.
+	 * 
+	 * @param leftChange
+	 *            the change from the left side
+	 * @param rightChange
+	 *            the change from the right side
+	 * @param sameValue
+	 *            specifies whether the conflicting references have the same value (pseudo conflict) or not
+	 *            (real conflict)
+	 */
+	private void updateConflict(MultiplicityElementChange leftChange, MultiplicityElementChange rightChange,
+			boolean sameValue) {
+		if (sameValue && leftChange.getConflict().getKind() != ConflictKind.PSEUDO
+				&& containsOnlyMultiplicityReferenceChanges(leftChange.getConflict())) {
+			leftChange.getConflict().setKind(ConflictKind.PSEUDO);
+		} else if (!sameValue && (leftChange.getConflict().getKind() != ConflictKind.REAL || rightChange
+				.getConflict().getKind() != ConflictKind.REAL)) {
+			Conflict conflict = leftChange.getConflict();
+			conflict.setKind(ConflictKind.REAL);
+			// make sure the multiplicity changes' conflict is the real one
+			leftChange.setConflict(conflict);
+			rightChange.setConflict(conflict);
+		}
+
+	}
+
+	/**
+	 * Returns true if the prime refining of the multiplicity element change is a reference change.
+	 * 
+	 * @param change
+	 *            the {@link MultiplicityElementChange} to check
+	 * @return whether the given change has a {@link ReferenceChange} as its prime refining
+	 */
+	private boolean isRefinedByReferenceChange(MultiplicityElementChange change) {
+		return change.getPrimeRefining() instanceof ReferenceChange;
+	}
+
+	/**
+	 * Checks if the given conflict contains differences that are not of type
+	 * {@link MultiplicityElementChange} or are not {@link ReferenceChange reference changes} of
+	 * {@link MultiplicityElement multiplicity elements}.
+	 * 
+	 * @param conflict
+	 *            the conflict to check
+	 * @return <code>true</code> if the conflict contains only {@link MultiplicityElementChange} diffs
+	 */
+	private boolean containsOnlyMultiplicityReferenceChanges(Conflict conflict) {
+		for (Diff diff : conflict.getDifferences()) {
+			if (diff instanceof MultiplicityElementChange) {
+				continue;
+			}
+			if (!(diff instanceof ReferenceChange)) {
+				return false;
+			}
+			EReference reference = ((ReferenceChange)diff).getReference();
+			if (reference != UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+					&& reference != UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue()) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Checks whether the given change affects the specified eReference.
+	 * 
+	 * @param eReference
+	 *            the {@link EReference}
+	 * @param change
+	 *            the {@link MultiplicityElementChange}
+	 * @return true if the given {@link MultiplicityElementChange} contains a refining {@link ReferenceChange}
+	 *         affecting the provided {@link EReference}
+	 */
+	private boolean affectsReference(EReference eReference, MultiplicityElementChange change) {
+		for (ReferenceChange diff : filter(change.getRefinedBy(), ReferenceChange.class)) {
+			if (diff.getReference() == eReference) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Checks whether the given EObjects have the same value for the specified {@link EStructuralFeature}.
+	 * 
+	 * @param feature
+	 *            the {@link EStructuralFeature} to check
+	 * @param object1
+	 *            the first object
+	 * @param object2
+	 *            the second object
+	 * @return true if the two given {@link EObject}s have the same value for the given
+	 *         {@link EStructuralFeature}.
+	 */
+	private boolean sameValue(EStructuralFeature feature, EObject object1, EObject object2) {
+		if (object1 == null || object2 == null) {
+			return object1 == object2;
+		}
+		Object value1 = object1.eGet(feature);
+		Object value2 = object2.eGet(feature);
+		if (value1 == null || value2 == null) {
+			return value1 == value2;
+		}
+		if (value1 instanceof EObject && value2 instanceof EObject) {
+			return EcoreUtil.equals((EObject)value1, (EObject)value2);
+		}
+		return value1.equals(value2);
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java
new file mode 100644
index 0000000..74f899a
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ *     Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.postprocessor.extension;
+
+import static com.google.common.base.Predicates.instanceOf;
+import static com.google.common.collect.Iterables.any;
+import static com.google.common.collect.Iterables.find;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.internal.utils.ComparisonUtil;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.UMLCompareFactory;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.AbstractUMLChangeFactory;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.uml2.uml.LiteralInteger;
+import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.ValueSpecification;
+
+/**
+ * Factory for diffs affecting {@link MultiplicityElement MultiplicityElements}.
+ * 
+ * @author Alexandra Buzila <abuzila@eclipsesource.com>
+ */
+public class MultiplicityElementChangeFactory extends AbstractUMLChangeFactory {
+
+	@Override
+	public boolean handles(Diff input) {
+		return isChangeOfMultiplicityElement(input) && !refinesMultiplicityChange(input);
+	}
+
+	/**
+	 * Check whether the given Diff represents a change of a {@link MultiplicityElement}.
+	 * 
+	 * @param input
+	 *            the difference to be checked
+	 * @return <code>true</code> if the diff is a change of a {@link MultiplicityElement}, <code>false</code>
+	 *         otherwise.
+	 */
+	private boolean isChangeOfMultiplicityElement(Diff input) {
+		if (input instanceof ReferenceChange) {
+			EReference reference = ((ReferenceChange)input).getReference();
+			return reference == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+					|| reference == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+		} else if (input instanceof AttributeChange) {
+			EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
+			if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+				EStructuralFeature eContainingFeature = container.eContainingFeature();
+				return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+						|| eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Verify if the given diff refines a {@link MultiplicityElementChange} type diff.
+	 * 
+	 * @param input
+	 *            the diff
+	 * @return true if the diff refines a {@link MultiplicityElementChange}
+	 */
+	private boolean refinesMultiplicityChange(Diff input) {
+		return any(input.getRefines(), instanceOf(MultiplicityElementChange.class));
+	}
+
+	@Override
+	public void fillRequiredDifferences(Comparison comparison, Diff extension) {
+		// do nothing
+	}
+
+	@Override
+	public void setRefiningChanges(Diff extension, DifferenceKind extensionKind, Diff refiningDiff) {
+		if (refiningDiff.getSource() == extension.getSource()) {
+			addRefiningDiffAndDependencies(extension, refiningDiff);
+		}
+	}
+
+	/**
+	 * Add the extension's refining diff and update the its kind, based on the refining diff's kind.
+	 * 
+	 * @param extension
+	 *            The diff to which the refining diff must be added
+	 * @param refiningDiff
+	 *            The refining diff to add
+	 */
+	private void addRefiningDiffAndDependencies(Diff extension, Diff refiningDiff) {
+		extension.getRefinedBy().add(refiningDiff);
+		extension.setKind(refiningDiff.getKind());
+	}
+
+	@Override
+	protected Switch<Set<EObject>> getDiscriminantsGetter() {
+		return new DiscriminantsGetter() {
+			@Override
+			public Set<EObject> caseValueSpecification(ValueSpecification object) {
+				Set<EObject> result = new HashSet<EObject>();
+				result.add(object);
+				return result;
+			}
+		};
+	}
+
+	@Override
+	public Class<? extends Diff> getExtensionKind() {
+		return MultiplicityElementChange.class;
+	}
+
+	@Override
+	protected EObject getDiscriminant(Diff input) {
+		return find(getDiscriminants(input), instanceOf(ValueSpecification.class), null);
+	}
+
+	@Override
+	public Match getParentMatch(Diff input) {
+		EObject multiplicityElement = getDiscriminant(input).eContainer();
+		return ComparisonUtil.getComparison(input).getMatch(multiplicityElement);
+	}
+
+	@Override
+	protected boolean isRelatedToAnExtensionAdd(ReferenceChange input) {
+		return input.getKind() == DifferenceKind.ADD;
+	}
+
+	@Override
+	protected boolean isRelatedToAnExtensionDelete(ReferenceChange input) {
+		return input.getKind() == DifferenceKind.DELETE;
+	}
+
+	@Override
+	public Diff createExtension() {
+		return UMLCompareFactory.eINSTANCE.createMultiplicityElementChange();
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
index 6190d4a..db81acb 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015 Obeo.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -67,6 +67,7 @@
 		factories.add(new UMLStereotypeApplicationChangeFactory());
 		factories.add(new UMLOpaqueElementBodyChangeFactory());
 		factories.add(new UMLDanglingStereotypeApplicationFactory());
+		factories.add(new MultiplicityElementChangeFactory());
 
 		for (IChangeFactory iDiffExtensionFactory : factories) {
 			dataset.put(iDiffExtensionFactory.getExtensionKind(), iDiffExtensionFactory);