GMF Engine : ResourceAttachmentChange management

- No resource control case for GMF
- Multi-diagram case -> DiagramChange ADD/DELETE
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif b/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif
new file mode 100644
index 0000000..d3dc5a9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties b/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties
index 0d8259b..29db58c 100644
--- a/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties
@@ -38,3 +38,4 @@
 _UI_Unknown_feature = Unspecified

 

 _UI_CoordinatesChange_type = Coordinates Change

+_UI_DiagramChange_type = Diagram Change

diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java
new file mode 100644
index 0000000..2bd7949
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java
@@ -0,0 +1,125 @@
+/**

+ * Copyright (c) 2013 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.diagram.internal.extensions.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.diagram.internal.extensions.DiagramChange;

+

+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;

+import org.eclipse.emf.edit.provider.IItemColorProvider;

+import org.eclipse.emf.edit.provider.IItemFontProvider;

+import org.eclipse.emf.edit.provider.IItemLabelProvider;

+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

+import org.eclipse.emf.edit.provider.IItemPropertySource;

+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;

+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

+

+/**

+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange} object.

+ * <!-- begin-user-doc -->

+ * <!-- end-user-doc -->

+ * @generated

+ */

+public class DiagramChangeItemProvider

+	extends DiagramDiffItemProvider

+	implements

+		IEditingDomainItemProvider,

+		IStructuredItemContentProvider,

+		ITreeItemContentProvider,

+		IItemLabelProvider,

+		IItemPropertySource,

+		IItemColorProvider,

+		IItemFontProvider {

+	/**

+	 * This constructs an instance from a factory and a notifier.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	public DiagramChangeItemProvider(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 DiagramChange.gif.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Object getImage(Object object) {

+		return overlayImage(object, getResourceLocator().getImage("full/obj16/DiagramChange"));

+	}

+

+	/**

+	 * This returns the label text for the adapted class.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public String getText(Object object) {

+		DifferenceKind labelValue = ((DiagramChange)object).getKind();

+		String label = labelValue == null ? null : labelValue.toString();

+		return label == null || label.length() == 0 ?

+			getString("_UI_DiagramChange_type") :

+			getString("_UI_DiagramChange_type") + " " + label;

+	}

+

+	/**

+	 * 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.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java
index dd6012c..9b2f102 100644
--- a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java
@@ -31,10 +31,9 @@
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

 

 /**

- * This is the item provider adapter for a

- * {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff} object. <!-- begin-user-doc -->

+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff} object.

+ * <!-- begin-user-doc -->

  * <!-- end-user-doc -->

- * 

  * @generated

  */

 public class DiagramDiffItemProvider extends DiffItemProvider implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider {

@@ -66,51 +65,67 @@
 	}

 

 	/**

-	 * This adds a property descriptor for the Semantic Diff feature. <!-- begin-user-doc --> <!--

+	 * This adds a property descriptor for the Semantic Diff feature.

+	 * <!-- begin-user-doc --> <!--

 	 * end-user-doc -->

-	 * 

 	 * @generated

 	 */

 	protected void addSemanticDiffPropertyDescriptor(Object object) {

-		itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory)

-				.getRootAdapterFactory(), getResourceLocator(),

-				getString("_UI_DiagramDiff_semanticDiff_feature"), getString(

-						"_UI_PropertyDescriptor_description", "_UI_DiagramDiff_semanticDiff_feature",

-						"_UI_DiagramDiff_type"), ExtensionsPackage.Literals.DIAGRAM_DIFF__SEMANTIC_DIFF,

-				true, false, true, null, null, null));

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_DiagramDiff_semanticDiff_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_semanticDiff_feature", "_UI_DiagramDiff_type"),

+				 ExtensionsPackage.Literals.DIAGRAM_DIFF__SEMANTIC_DIFF,

+				 true,

+				 false,

+				 true,

+				 null,

+				 null,

+				 null));

 	}

 

 	/**

-	 * This adds a property descriptor for the View feature. <!-- begin-user-doc --> <!-- end-user-doc -->

-	 * 

+	 * This adds a property descriptor for the View feature.

+	 * <!-- begin-user-doc --> <!-- end-user-doc -->

 	 * @generated

 	 */

 	protected void addViewPropertyDescriptor(Object object) {

-		itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory)

-				.getRootAdapterFactory(), getResourceLocator(), getString("_UI_DiagramDiff_view_feature"),

-				getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_view_feature",

-						"_UI_DiagramDiff_type"), ExtensionsPackage.Literals.DIAGRAM_DIFF__VIEW, true, false,

-				true, null, null, null));

+		itemPropertyDescriptors.add

+			(createItemPropertyDescriptor

+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),

+				 getResourceLocator(),

+				 getString("_UI_DiagramDiff_view_feature"),

+				 getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_view_feature", "_UI_DiagramDiff_type"),

+				 ExtensionsPackage.Literals.DIAGRAM_DIFF__VIEW,

+				 true,

+				 false,

+				 true,

+				 null,

+				 null,

+				 null));

 	}

 

 	/**

-	 * This returns the label text for the adapted class. <!-- begin-user-doc --> <!-- end-user-doc -->

-	 * 

+	 * This returns the label text for the adapted class.

+	 * <!-- begin-user-doc --> <!-- end-user-doc -->

 	 * @generated

 	 */

 	@Override

 	public String getText(Object object) {

 		DifferenceKind labelValue = ((DiagramDiff)object).getKind();

 		String label = labelValue == null ? null : labelValue.toString();

-		return label == null || label.length() == 0 ? getString("_UI_DiagramDiff_type")

-				: getString("_UI_DiagramDiff_type") + " " + label;

+		return label == null || label.length() == 0 ?

+			getString("_UI_DiagramDiff_type") :

+			getString("_UI_DiagramDiff_type") + " " + label;

 	}

 

 	/**

-	 * 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

+	 * 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

@@ -120,9 +135,9 @@
 	}

 

 	/**

-	 * 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 -->

-	 * 

+	 * 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

@@ -131,9 +146,9 @@
 	}

 

 	/**

-	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--

+	 * Return the resource locator for this item provider's resources.

+	 * <!-- begin-user-doc --> <!--

 	 * end-user-doc -->

-	 * 

 	 * @generated

 	 */

 	@Override

diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java
index 40dfd07..f07c7dc 100644
--- a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java
@@ -199,6 +199,29 @@
 	}

 

 	/**

+	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange} instances.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected DiagramChangeItemProvider diagramChangeItemProvider;

+

+	/**

+	 * This creates an adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange}.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	public Adapter createDiagramChangeAdapter() {

+		if (diagramChangeItemProvider == null) {

+			diagramChangeItemProvider = new DiagramChangeItemProvider(this);

+		}

+

+		return diagramChangeItemProvider;

+	}

+

+	/**

 	 * This returns the root adapter factory that contains this factory.

 	 * <!-- begin-user-doc -->

 	 * <!-- end-user-doc -->

@@ -302,6 +325,7 @@
 		if (nodeChangeItemProvider != null) nodeChangeItemProvider.dispose();

 		if (coordinatesChangeItemProvider != null) coordinatesChangeItemProvider.dispose();

 		if (edgeChangeItemProvider != null) edgeChangeItemProvider.dispose();

+		if (diagramChangeItemProvider != null) diagramChangeItemProvider.dispose();

 	}

 

 }

diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java
new file mode 100644
index 0000000..69726fb
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java
@@ -0,0 +1,91 @@
+/**

+ * Copyright (c) 2013 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.diagram.internal.extensions.provider.spec;

+

+import com.google.common.collect.Iterators;

+

+import java.util.Collection;

+

+import org.eclipse.emf.compare.Diff;

+import org.eclipse.emf.compare.DifferenceKind;

+import org.eclipse.emf.compare.ResourceAttachmentChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;

+import org.eclipse.emf.compare.diagram.internal.factories.extensions.DiagramChangeFactory;

+import org.eclipse.emf.edit.provider.ItemProviderAdapter;

+

+/**

+ * Item provider for node changes.

+ * 

+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>

+ */

+public class DiagramChangeItemProviderSpec extends ForwardingDiagramDiffItemProvider {

+

+	/**

+	 * Constructor.

+	 * 

+	 * @param delegate

+	 *            The origin item provider adapter.

+	 */

+	public DiagramChangeItemProviderSpec(ItemProviderAdapter delegate) {

+		super(delegate);

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#getReferenceText(org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff)

+	 */

+	@Override

+	protected String getReferenceText(DiagramDiff diagramDiff) {

+		String result = ""; //$NON-NLS-1$

+		Diff diff = null;

+		DifferenceKind kind = diagramDiff.getKind();

+		switch (kind) {

+			case ADD:

+			case DELETE:

+				diff = Iterators.find(diagramDiff.getRefinedBy().iterator(), DiagramChangeFactory

+						.isMainDiffForAddOrDeleteDiagram(), null);

+				break;

+			default:

+		}

+		if (diff instanceof ResourceAttachmentChange) {

+			result = "contents";

+		}

+		return result;

+

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#isCandidateToAddChildren(java.lang.Object)

+	 */

+	@Override

+	protected boolean isCandidateToAddChildren(Object object) {

+		return object instanceof DiagramChange

+				&& (((DiagramChange)object).getKind() == DifferenceKind.ADD || ((DiagramChange)object)

+						.getKind() == DifferenceKind.DELETE);

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#getChildren(java.lang.Object)

+	 */

+	@Override

+	public Collection<?> getChildren(Object object) {

+		Collection<?> result = super.getChildren(object);

+		if (isCandidateToAddChildren(object)) {

+			result.remove(object);

+		}

+		return result;

+	}

+}

diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java
index 8cf0757..c2f3582 100644
--- a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java
@@ -38,6 +38,9 @@
 	/** Item provider used for the coordinates change. */

 	CoordinatesChangeItemProviderSpec fCoordinatesChangeItemProvider;

 

+	/** Item provider used for the diagram change. */

+	DiagramChangeItemProviderSpec fDiagramChangeItemProvider;

+

 	/**

 	 * Constructor.

 	 */

@@ -115,4 +118,18 @@
 		}

 		return fCoordinatesChangeItemProvider;

 	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.ExtensionsItemProviderAdapterFactory#createDiagramChangeAdapter()

+	 */

+	@Override

+	public Adapter createDiagramChangeAdapter() {

+		if (fDiagramChangeItemProvider == null) {

+			fDiagramChangeItemProvider = new DiagramChangeItemProviderSpec((ItemProviderAdapter)super

+					.createDiagramChangeAdapter());

+		}

+		return fDiagramChangeItemProvider;

+	}

 }

diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java
index 07e9406..5c609de 100644
--- a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java
+++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java
@@ -88,8 +88,6 @@
 			Comparison comparison = diagramDiff.getMatch().getComparison();

 			match = comparison.getMatch(view);

 			ret.addAll(match.getSubmatches());

-		}

-		if (match != null) {

 			ITreeItemContentProvider contentProvider = (ITreeItemContentProvider)getRootAdapterFactory()

 					.adapt(match, ITreeItemContentProvider.class);

 			if (contentProvider != null) {

diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java
index b9e88ff..da91b9c 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java
@@ -381,8 +381,11 @@
 							decorators = new ArrayList();
 						}
 
-						decorators.add(createAndRegisterDecorator(difference, referenceView, referenceFigure,
-								targetSide));
+						AbstractDecorator decorator = createAndRegisterDecorator(difference, referenceView,
+								referenceFigure, targetSide);
+						if (decorator != null) {
+							decorators.add(decorator);
+						}
 					}
 
 				}
@@ -542,15 +545,17 @@
 		 *            The reference view.
 		 * @param side
 		 *            The side where the layer has to be found.
-		 * @return The layer figure.
+		 * @return The layer figure or null if the edit part of the diagram is not found.
 		 */
 		protected IFigure getLayer(View referenceView, MergeViewerSide side) {
 			Diagram referenceDiagram = referenceView.getDiagram();
 			Diagram targetDiagram = (Diagram)getMatchView(referenceDiagram, side);
 			DiagramMergeViewer targetViewer = getViewer(side);
-			IFigure targetLayer = LayerManager.Helper.find(targetViewer.getEditPart(targetDiagram)).getLayer(
-					getIDLayer(referenceView));
-			return targetLayer;
+			EditPart editPart = targetViewer.getEditPart(targetDiagram);
+			if (editPart != null) {
+				return LayerManager.Helper.find(editPart).getLayer(getIDLayer(referenceView));
+			}
+			return null;
 		}
 
 		/**
@@ -560,7 +565,7 @@
 		 * 
 		 * @param referenceView
 		 *            The reference view.
-		 * @return The ID of te layer.
+		 * @return The ID of the layer.
 		 */
 		protected Object getIDLayer(View referenceView) {
 			if (referenceView instanceof Edge) {
@@ -840,7 +845,9 @@
 		protected Phantom createAndRegisterDecorator(Diff diff, View referenceView, IFigure referenceFigure,
 				MergeViewerSide targetSide) {
 			Phantom phantom = createPhantom(diff, referenceView, referenceFigure, targetSide);
-			fPhantomRegistry.put(diff, phantom);
+			if (phantom != null) {
+				fPhantomRegistry.put(diff, phantom);
+			}
 			return phantom;
 		}
 
@@ -964,89 +971,98 @@
 		 *            The reference figure as base for creation of the phantom.
 		 * @param side
 		 *            The side where the phantom has to be created.
-		 * @return The phantom.
+		 * @return The phantom or null if the target layer is not found.
 		 */
 		private Phantom createPhantom(Diff diff, View referenceView, IFigure referenceFigure,
 				MergeViewerSide side) {
 
-			MergeViewerSide referenceSide = getSide(referenceView);
-
-			Rectangle rect = referenceFigure.getBounds().getCopy();
-
-			IFigure referenceLayer = getLayer(referenceView, referenceSide);
-			translateCoordinates(referenceFigure, referenceLayer, rect);
-
-			DecoratorFigure ghost = null;
-
 			IFigure targetLayer = getLayer(referenceView, side);
-			Phantom phantom = new Phantom(targetLayer, side, referenceView, referenceFigure, diff);
+			if (targetLayer != null) {
+				MergeViewerSide referenceSide = getSide(referenceView);
 
-			// Container "list" case
-			if (isNodeList(referenceView)) {
-				Diff refiningDiff = Iterators.find(diff.getRefinedBy().iterator(), and(
-						valueIs(referenceView), onFeature(NotationPackage.Literals.VIEW__PERSISTED_CHILDREN
-								.getName())));
+				Rectangle rect = referenceFigure.getBounds().getCopy();
 
-				// FIXME: It has to manage visible views.
-				int index = DiffUtil.findInsertionIndex(getComparison(), refiningDiff,
-						side == MergeViewerSide.LEFT);
+				IFigure referenceLayer = getLayer(referenceView, referenceSide);
+				translateCoordinates(referenceFigure, referenceLayer, rect);
 
-				IFigure referenceParentFigure = referenceFigure.getParent();
-				Rectangle referenceParentBounds = referenceParentFigure.getBounds().getCopy();
-				translateCoordinates(referenceParentFigure, referenceLayer, referenceParentBounds);
+				DecoratorFigure ghost = null;
 
-				View parentView = (View)getMatchView(referenceView.eContainer(), side);
-				if (parentView != null) {
-					int nbElements = getVisibleViews(parentView).size();
-					if (index > nbElements) {
-						index = nbElements;
+				Phantom phantom = new Phantom(targetLayer, side, referenceView, referenceFigure, diff);
+
+				// Container "list" case
+				if (isNodeList(referenceView)) {
+					Diff refiningDiff = Iterators.find(diff.getRefinedBy().iterator(), and(
+							valueIs(referenceView),
+							onFeature(NotationPackage.Literals.VIEW__PERSISTED_CHILDREN.getName())));
+
+					// FIXME: It has to manage visible views.
+					int index = DiffUtil.findInsertionIndex(getComparison(), refiningDiff,
+							side == MergeViewerSide.LEFT);
+
+					IFigure referenceParentFigure = referenceFigure.getParent();
+					Rectangle referenceParentBounds = referenceParentFigure.getBounds().getCopy();
+					translateCoordinates(referenceParentFigure, referenceLayer, referenceParentBounds);
+
+					View parentView = (View)getMatchView(referenceView.eContainer(), side);
+					if (parentView != null) {
+						int nbElements = getVisibleViews(parentView).size();
+						// CHECKSTYLE:OFF
+						if (index > nbElements) {
+							// CHECKSTYLE:ON
+							index = nbElements;
+						}
+					}
+
+					// FIXME: The add of decorators modifies the physical coordinates of elements
+					// FIXME: Compute position from the y position of the first child + sum of height of the
+					// children.
+					int pos = rect.height * index + referenceParentBounds.y + 1;
+					Map<String, Object> parameters = new HashMap<String, Object>();
+					parameters.put(NodeListFigure.PARAM_Y_POS, Integer.valueOf(pos));
+
+					ghost = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect,
+							true, parameters);
+
+					// Edge case
+				} else if (referenceView instanceof Edge) {
+					// If the edge phantom ties shapes where their coordinates changed
+					if (hasAnExtremityChange((Edge)referenceView, side)) {
+						EditPart edgeEditPart = createEdgeEditPart((Edge)referenceView, referenceSide, side);
+						// CHECKSTYLE:OFF
+						if (edgeEditPart instanceof GraphicalEditPart) {
+							// CHECKSTYLE:ON
+							phantom.setEditPart(edgeEditPart);
+
+							IFigure fig = ((GraphicalEditPart)edgeEditPart).getFigure();
+							fig.getChildren().clear();
+							ghost = new DecoratorFigure(diff, isThreeWay(), getCompareColor(),
+									referenceFigure, fig, true);
+
+						}
+						// Else, it creates only a polyline connection figure with the same properties as the
+						// reference
+					} else {
+						if (referenceFigure instanceof PolylineConnection) {
+							ghost = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
+									rect, true);
+						}
 					}
 				}
 
-				// FIXME: The add of decorators modifies the physical coordinates of elements
-				// FIXME: Compute position from the y position of the first child + sum of height of the
-				// children.
-				int pos = rect.height * index + referenceParentBounds.y + 1;
-				Map<String, Object> parameters = new HashMap<String, Object>();
-				parameters.put(NodeListFigure.PARAM_Y_POS, Integer.valueOf(pos));
-
-				ghost = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect,
-						true, parameters);
-
-				// Edge case
-			} else if (referenceView instanceof Edge) {
-				// If the edge phantom ties shapes where their coordinates changed
-				if (hasAnExtremityChange((Edge)referenceView, side)) {
-					EditPart edgeEditPart = createEdgeEditPart((Edge)referenceView, referenceSide, side);
-					if (edgeEditPart instanceof GraphicalEditPart) {
-						phantom.setEditPart(edgeEditPart);
-
-						IFigure fig = ((GraphicalEditPart)edgeEditPart).getFigure();
-						fig.getChildren().clear();
-						ghost = new DecoratorFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
-								fig, true);
-
-					}
-					// Else, it creates only a polyline connection figure with the same properties as the
-					// reference
-				} else {
-					if (referenceFigure instanceof PolylineConnection) {
-						ghost = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect,
-								true);
-					}
+				// Default case: Nodes
+				if (ghost == null) {
+					ghost = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, true);
 				}
+
+				phantom.setDecoratorFigure(ghost);
+
+				translateWhenInsideContainerChange(phantom);
+
+				return phantom;
 			}
 
-			// Default case: Nodes
-			if (ghost == null) {
-				ghost = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, true);
-			}
+			return null;
 
-			phantom.setDecoratorFigure(ghost);
-
-			translateWhenInsideContainerChange(phantom);
-
-			return phantom;
 		}
 
 		/**
@@ -1420,12 +1436,14 @@
 		protected Marker createAndRegisterDecorator(Diff diff, View referenceView, IFigure referenceFigure,
 				MergeViewerSide targetSide) {
 			Marker marker = createMarker(diff, referenceView, referenceFigure, targetSide);
-			List<Marker> markers = fMarkerRegistry.get(diff);
-			if (markers == null) {
-				markers = new ArrayList<Marker>();
-				fMarkerRegistry.put(diff, markers);
+			if (marker != null) {
+				List<Marker> markers = fMarkerRegistry.get(diff);
+				if (markers == null) {
+					markers = new ArrayList<Marker>();
+					fMarkerRegistry.put(diff, markers);
+				}
+				markers.add(marker);
 			}
-			markers.add(marker);
 			return marker;
 		}
 
@@ -1496,44 +1514,47 @@
 		 *            The reference figure as base for creation of the marker.
 		 * @param side
 		 *            The side where the marker has to be created.
-		 * @return The phantom.
+		 * @return The phantom or null if the target layer is not found.
 		 */
 		private Marker createMarker(Diff diff, View referenceView, IFigure referenceFigure,
 				MergeViewerSide side) {
 
-			Rectangle referenceBounds = referenceFigure.getBounds().getCopy();
 			IFigure referenceLayer = getLayer(referenceView, side);
-			translateCoordinates(referenceFigure, referenceLayer, referenceBounds);
+			if (referenceLayer != null) {
+				Rectangle referenceBounds = referenceFigure.getBounds().getCopy();
+				translateCoordinates(referenceFigure, referenceLayer, referenceBounds);
 
-			DecoratorFigure markerFigure = null;
+				DecoratorFigure markerFigure = null;
 
-			IFigure targetLayer = getLayer(referenceView, side);
-			Marker marker = new Marker(targetLayer, side, referenceView, referenceFigure, diff);
+				Marker marker = new Marker(referenceLayer, side, referenceView, referenceFigure, diff);
 
-			if (isNodeList(referenceView)) {
+				if (isNodeList(referenceView)) {
 
-				markerFigure = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
-						referenceBounds, false);
+					markerFigure = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
+							referenceBounds, false);
 
-			} else if (referenceView instanceof Edge) {
+				} else if (referenceView instanceof Edge) {
 
-				if (referenceFigure instanceof PolylineConnection) {
-					markerFigure = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
+					if (referenceFigure instanceof PolylineConnection) {
+						markerFigure = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
+								referenceBounds, false);
+					}
+
+				}
+
+				// Default case: Nodes
+				if (markerFigure == null) {
+
+					markerFigure = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
 							referenceBounds, false);
 				}
 
+				marker.setDecoratorFigure(markerFigure);
+				return marker;
 			}
 
-			// Default case: Nodes
-			if (markerFigure == null) {
+			return null;
 
-				markerFigure = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure,
-						referenceBounds, false);
-			}
-
-			marker.setDecoratorFigure(markerFigure);
-
-			return marker;
 		}
 
 		/**
diff --git a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore
index bb9b74f..58873b4 100644
--- a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore
+++ b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore
@@ -11,4 +11,5 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="semanticDiff" eType="ecore:EClass ../../org.eclipse.emf.compare/model/compare.ecore#//Diff"/>

     <eStructuralFeatures xsi:type="ecore:EReference" name="view" eType="ecore:EClass platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>

   </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="DiagramChange" eSuperTypes="#//DiagramDiff"/>

 </ecore:EPackage>

diff --git a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel
index b29c563..e1cf1b0 100644
--- a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel
+++ b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel
@@ -17,5 +17,6 @@
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagramCompare.ecore#//DiagramDiff/semanticDiff"/>

       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagramCompare.ecore#//DiagramDiff/view"/>

     </genClasses>

+    <genClasses ecoreClass="diagramCompare.ecore#//DiagramChange"/>

   </genPackages>

 </genmodel:GenModel>

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java
new file mode 100644
index 0000000..382313d
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java
@@ -0,0 +1,25 @@
+/**

+ * Copyright (c) 2013 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.diagram.internal.extensions;

+

+

+/**

+ * <!-- begin-user-doc -->

+ * A representation of the model object '<em><b>Diagram Change</b></em>'.

+ * <!-- end-user-doc -->

+ *

+ *

+ * @see org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsPackage#getDiagramChange()

+ * @model

+ * @generated

+ */

+public interface DiagramChange extends DiagramDiff {

+} // DiagramChange

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java
index 884a1ab..d2f637f 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java
@@ -75,6 +75,15 @@
 	EdgeChange createEdgeChange();

 

 	/**

+	 * Returns a new object of class '<em>Diagram Change</em>'.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return a new object of class '<em>Diagram Change</em>'.

+	 * @generated

+	 */

+	DiagramChange createDiagramChange();

+

+	/**

 	 * Returns the package supported by this factory.

 	 * <!-- begin-user-doc -->

 	 * <!-- end-user-doc -->

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java
index 659c058..da8ed84 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java
@@ -828,6 +828,134 @@
 

 

 	/**

+	 * The meta object id for the '{@link org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl <em>Diagram Change</em>}' class.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.ExtensionsPackageImpl#getDiagramChange()

+	 * @generated

+	 */

+	int DIAGRAM_CHANGE = 6;

+

+	/**

+	 * The feature id for the '<em><b>Match</b></em>' container reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__MATCH = DIAGRAM_DIFF__MATCH;

+

+	/**

+	 * The feature id for the '<em><b>Requires</b></em>' reference list.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__REQUIRES = DIAGRAM_DIFF__REQUIRES;

+

+	/**

+	 * The feature id for the '<em><b>Required By</b></em>' reference list.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__REQUIRED_BY = DIAGRAM_DIFF__REQUIRED_BY;

+

+	/**

+	 * The feature id for the '<em><b>Refines</b></em>' reference list.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__REFINES = DIAGRAM_DIFF__REFINES;

+

+	/**

+	 * The feature id for the '<em><b>Refined By</b></em>' reference list.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__REFINED_BY = DIAGRAM_DIFF__REFINED_BY;

+

+	/**

+	 * The feature id for the '<em><b>Kind</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__KIND = DIAGRAM_DIFF__KIND;

+

+	/**

+	 * The feature id for the '<em><b>Source</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__SOURCE = DIAGRAM_DIFF__SOURCE;

+

+	/**

+	 * The feature id for the '<em><b>State</b></em>' attribute.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__STATE = DIAGRAM_DIFF__STATE;

+

+	/**

+	 * The feature id for the '<em><b>Equivalence</b></em>' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__EQUIVALENCE = DIAGRAM_DIFF__EQUIVALENCE;

+

+	/**

+	 * The feature id for the '<em><b>Conflict</b></em>' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__CONFLICT = DIAGRAM_DIFF__CONFLICT;

+

+	/**

+	 * The feature id for the '<em><b>Semantic Diff</b></em>' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__SEMANTIC_DIFF = DIAGRAM_DIFF__SEMANTIC_DIFF;

+

+	/**

+	 * The feature id for the '<em><b>View</b></em>' reference.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE__VIEW = DIAGRAM_DIFF__VIEW;

+

+	/**

+	 * The number of structural features of the '<em>Diagram Change</em>' class.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 * @ordered

+	 */

+	int DIAGRAM_CHANGE_FEATURE_COUNT = DIAGRAM_DIFF_FEATURE_COUNT + 0;

+

+

+	/**

 	 * Returns the meta object for class '{@link org.eclipse.emf.compare.diagram.internal.extensions.Show <em>Show</em>}'.

 	 * <!-- begin-user-doc -->

 	 * <!-- end-user-doc -->

@@ -910,6 +1038,16 @@
 	EReference getDiagramDiff_View();

 

 	/**

+	 * Returns the meta object for class '{@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange <em>Diagram Change</em>}'.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @return the meta object for class '<em>Diagram Change</em>'.

+	 * @see org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange

+	 * @generated

+	 */

+	EClass getDiagramChange();

+

+	/**

 	 * Returns the factory that creates the instances of the model.

 	 * <!-- begin-user-doc -->

 	 * <!-- end-user-doc -->

@@ -1007,6 +1145,16 @@
 		 */

 		EReference DIAGRAM_DIFF__VIEW = eINSTANCE.getDiagramDiff_View();

 

+		/**

+		 * The meta object literal for the '{@link org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl <em>Diagram Change</em>}' class.

+		 * <!-- begin-user-doc -->

+		 * <!-- end-user-doc -->

+		 * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl

+		 * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.ExtensionsPackageImpl#getDiagramChange()

+		 * @generated

+		 */

+		EClass DIAGRAM_CHANGE = eINSTANCE.getDiagramChange();

+

 	}

 

 } //ExtensionsPackage

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java
new file mode 100644
index 0000000..123b5e9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java
@@ -0,0 +1,47 @@
+/**

+ * Copyright (c) 2013 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.diagram.internal.extensions.impl;

+

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsPackage;

+

+import org.eclipse.emf.ecore.EClass;

+

+/**

+ * <!-- begin-user-doc -->

+ * An implementation of the model object '<em><b>Diagram Change</b></em>'.

+ * <!-- end-user-doc -->

+ * <p>

+ * </p>

+ *

+ * @generated

+ */

+public class DiagramChangeImpl extends DiagramDiffImpl implements DiagramChange {

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	protected DiagramChangeImpl() {

+		super();

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	@Override

+	protected EClass eStaticClass() {

+		return ExtensionsPackage.Literals.DIAGRAM_CHANGE;

+	}

+

+} //DiagramChangeImpl

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java
index 609ff88..1272455 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java
@@ -69,6 +69,7 @@
 			case ExtensionsPackage.NODE_CHANGE: return createNodeChange();

 			case ExtensionsPackage.COORDINATES_CHANGE: return createCoordinatesChange();

 			case ExtensionsPackage.EDGE_CHANGE: return createEdgeChange();

+			case ExtensionsPackage.DIAGRAM_CHANGE: return createDiagramChange();

 			default:

 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");

 		}

@@ -129,6 +130,16 @@
 	 * <!-- end-user-doc -->

 	 * @generated

 	 */

+	public DiagramChange createDiagramChange() {

+		DiagramChangeImpl diagramChange = new DiagramChangeImpl();

+		return diagramChange;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

 	public ExtensionsPackage getExtensionsPackage() {

 		return (ExtensionsPackage)getEPackage();

 	}

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java
index 9384821..f7ffa71 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java
@@ -13,6 +13,7 @@
 import org.eclipse.emf.compare.ComparePackage;

 

 import org.eclipse.emf.compare.diagram.internal.extensions.CoordinatesChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;

 import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;

 import org.eclipse.emf.compare.diagram.internal.extensions.EdgeChange;

 import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsFactory;

@@ -78,6 +79,13 @@
 	private EClass diagramDiffEClass = null;

 

 	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private EClass diagramChangeEClass = 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.

@@ -218,6 +226,15 @@
 	 * <!-- end-user-doc -->

 	 * @generated

 	 */

+	public EClass getDiagramChange() {

+		return diagramChangeEClass;

+	}

+

+	/**

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

 	public ExtensionsFactory getExtensionsFactory() {

 		return (ExtensionsFactory)getEFactoryInstance();

 	}

@@ -254,6 +271,8 @@
 		diagramDiffEClass = createEClass(DIAGRAM_DIFF);

 		createEReference(diagramDiffEClass, DIAGRAM_DIFF__SEMANTIC_DIFF);

 		createEReference(diagramDiffEClass, DIAGRAM_DIFF__VIEW);

+

+		diagramChangeEClass = createEClass(DIAGRAM_CHANGE);

 	}

 

 	/**

@@ -294,6 +313,7 @@
 		coordinatesChangeEClass.getESuperTypes().add(this.getNodeChange());

 		edgeChangeEClass.getESuperTypes().add(this.getDiagramDiff());

 		diagramDiffEClass.getESuperTypes().add(theComparePackage.getDiff());

+		diagramChangeEClass.getESuperTypes().add(this.getDiagramDiff());

 

 		// Initialize classes and features; add operations and parameters

 		initEClass(showEClass, Show.class, "Show", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

@@ -310,6 +330,8 @@
 		initEReference(getDiagramDiff_SemanticDiff(), theComparePackage.getDiff(), null, "semanticDiff", null, 0, 1, DiagramDiff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEReference(getDiagramDiff_View(), theEcorePackage.getEObject(), null, "view", null, 0, 1, DiagramDiff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 

+		initEClass(diagramChangeEClass, DiagramChange.class, "DiagramChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

+

 		// Create resource

 		createResource(eNS_URI);

 	}

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java
index b8335f6..9e53bda 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java
@@ -102,6 +102,10 @@
 				return createDiagramDiffAdapter();

 			}

 			@Override

+			public Adapter caseDiagramChange(DiagramChange object) {

+				return createDiagramChangeAdapter();

+			}

+			@Override

 			public Adapter caseDiff(Diff object) {

 				return createDiffAdapter();

 			}

@@ -210,6 +214,20 @@
 	}

 

 	/**

+	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange <em>Diagram 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.diagram.internal.extensions.DiagramChange

+	 * @generated

+	 */

+	public Adapter createDiagramChangeAdapter() {

+		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;

diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java
index c30e096..28a6f9c 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java
@@ -124,6 +124,14 @@
 				if (result == null) result = defaultCase(theEObject);

 				return result;

 			}

+			case ExtensionsPackage.DIAGRAM_CHANGE: {

+				DiagramChange diagramChange = (DiagramChange)theEObject;

+				T result = caseDiagramChange(diagramChange);

+				if (result == null) result = caseDiagramDiff(diagramChange);

+				if (result == null) result = caseDiff(diagramChange);

+				if (result == null) result = defaultCase(theEObject);

+				return result;

+			}

 			default: return defaultCase(theEObject);

 		}

 	}

@@ -219,6 +227,21 @@
 	}

 

 	/**

+	 * Returns the result of interpreting the object as an instance of '<em>Diagram 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>Diagram Change</em>'.

+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)

+	 * @generated

+	 */

+	public T caseDiagramChange(DiagramChange object) {

+		return null;

+	}

+

+	/**

 	 * Returns the result of interpreting the object as an instance of '<em>Diff</em>'.

 	 * <!-- begin-user-doc -->

 	 * This implementation returns null;

diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java
index da65053..7d34265 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java
@@ -22,6 +22,7 @@
 import org.eclipse.emf.compare.ReferenceChange;
 import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;
 import org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory;
+import org.eclipse.emf.compare.util.CompareSwitch;
 import org.eclipse.emf.compare.utils.MatchUtil;
 import org.eclipse.emf.compare.utils.ReferenceUtil;
 import org.eclipse.emf.ecore.EObject;
@@ -60,18 +61,35 @@
 	 * @return The view.
 	 */
 	public EObject setView(DiagramDiff extension, Diff refiningDiff) {
-		EObject view = null;
-		if (refiningDiff instanceof ReferenceChange) {
-			view = ((ReferenceChange)refiningDiff).getValue();
-		} else if (refiningDiff instanceof AttributeChange) {
-			Comparison comparison = refiningDiff.getMatch().getComparison();
-			view = MatchUtil.getContainer(comparison, refiningDiff);
-			while (view != null && !(view instanceof View)) {
-				view = view.eContainer();
+
+		CompareSwitch<EObject> getterValue = new CompareSwitch<EObject>() {
+
+			@Override
+			public EObject caseReferenceChange(ReferenceChange object) {
+				return object.getValue();
 			}
-		}
+
+			@Override
+			public EObject caseAttributeChange(AttributeChange object) {
+				Comparison comparison = object.getMatch().getComparison();
+				EObject view = MatchUtil.getContainer(comparison, object);
+				while (view != null && !(view instanceof View)) {
+					view = view.eContainer();
+				}
+				return view;
+			}
+
+			@Override
+			public EObject caseResourceAttachmentChange(
+					org.eclipse.emf.compare.ResourceAttachmentChange object) {
+				Comparison comparison = object.getMatch().getComparison();
+				return MatchUtil.getContainer(comparison, object);
+			}
+
+		};
+
+		EObject view = getterValue.doSwitch(refiningDiff);
 		extension.setView(view);
-		// FIXME: ResourceAttachmentChange ?
 		return view;
 	}
 
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java
index f524849..e93f0ca 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java
@@ -19,6 +19,7 @@
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.diagram.internal.CompareDiagramConfiguration;
 import org.eclipse.emf.compare.diagram.internal.factories.extensions.CoordinatesChangeFactory;
+import org.eclipse.emf.compare.diagram.internal.factories.extensions.DiagramChangeFactory;
 import org.eclipse.emf.compare.diagram.internal.factories.extensions.EdgeChangeFactory;
 import org.eclipse.emf.compare.diagram.internal.factories.extensions.HideFactory;
 import org.eclipse.emf.compare.diagram.internal.factories.extensions.NodeChangeFactory;
@@ -56,6 +57,7 @@
 		factories.add(new NodeChangeFactory());
 		factories.add(new CoordinatesChangeFactory(configuration));
 		factories.add(new EdgeChangeFactory());
+		factories.add(new DiagramChangeFactory());
 
 		for (IChangeFactory iDiffExtensionFactory : factories) {
 			dataset.put(iDiffExtensionFactory.getExtensionKind(), iDiffExtensionFactory);
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java
new file mode 100644
index 0000000..d7e8799
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java
@@ -0,0 +1,156 @@
+/*******************************************************************************

+ * Copyright (c) 2013 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.diagram.internal.factories.extensions;

+

+import com.google.common.base.Predicate;

+

+import org.eclipse.emf.compare.Comparison;

+import org.eclipse.emf.compare.Diff;

+import org.eclipse.emf.compare.DifferenceKind;

+import org.eclipse.emf.compare.ResourceAttachmentChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;

+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;

+import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsFactory;

+import org.eclipse.emf.compare.diagram.internal.factories.AbstractDiagramChangeFactory;

+import org.eclipse.emf.compare.utils.MatchUtil;

+import org.eclipse.emf.compare.utils.ReferenceUtil;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+

+/**

+ * Factory of diagram changes.

+ * 

+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>

+ */

+public class DiagramChangeFactory extends AbstractDiagramChangeFactory {

+

+	/**

+	 * Constructor.

+	 */

+	public DiagramChangeFactory() {

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#getExtensionKind()

+	 */

+	@Override

+	public Class<? extends Diff> getExtensionKind() {

+		return DiagramChange.class;

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#createExtension()

+	 */

+	@Override

+	public DiagramDiff createExtension() {

+		return ExtensionsFactory.eINSTANCE.createDiagramChange();

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#setRefiningChanges(org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff,

+	 *      org.eclipse.emf.compare.DifferenceKind, org.eclipse.emf.compare.Diff)

+	 */

+	@Override

+	public void setRefiningChanges(Diff extension, DifferenceKind extensionKind, Diff refiningDiff) {

+		// Macroscopic change on a diagram is refined by the unit main change and all unit children related

+		// changes.

+		extension.getRefinedBy().add(refiningDiff);

+		extension.getRefinedBy().addAll(getAllContainedDifferences(refiningDiff));

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#fillRequiredDifferences(org.eclipse.emf.compare.Comparison, org.eclipse.emf.compare.Diff)

+	 */

+	@Override

+	public void fillRequiredDifferences(Comparison comparison, Diff extension) {

+		// nothing

+	}

+

+	/**

+	 * Predicate to check that the given difference is the main unit difference for this macroscopic add or

+	 * delete of diagram.

+	 * 

+	 * @return The predicate.

+	 */

+	public static Predicate<Diff> isMainDiffForAddOrDeleteDiagram() {

+		return new Predicate<Diff>() {

+			public boolean apply(Diff difference) {

+				return difference instanceof ResourceAttachmentChange

+						&& (isRelatedToAnAddDiagram((ResourceAttachmentChange)difference) || isRelatedToADeleteDiagram((ResourceAttachmentChange)difference));

+			}

+		};

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#isRelatedToAnExtensionAdd(org.eclipse.emf.compare.ResourceAttachmentChange)

+	 */

+	@Override

+	protected boolean isRelatedToAnExtensionAdd(ResourceAttachmentChange input) {

+		return isRelatedToAnAddDiagram(input);

+	}

+

+	/**

+	 * It checks that the given resource attachment change concerns the add of a diagram.

+	 * 

+	 * @param input

+	 *            The reference change.

+	 * @return True if it concerns the add of a node, False otherwise.

+	 */

+	protected static boolean isRelatedToAnAddDiagram(ResourceAttachmentChange input) {

+		return isContainmentOnSemanticDiagram(input) && input.getKind() == DifferenceKind.ADD;

+	}

+

+	/**

+	 * {@inheritDoc}

+	 * 

+	 * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#isRelatedToAnExtensionDelete(org.eclipse.emf.compare.ResourceAttachmentChange)

+	 */

+	@Override

+	protected boolean isRelatedToAnExtensionDelete(ResourceAttachmentChange input) {

+		return isRelatedToADeleteDiagram(input);

+	}

+

+	/**

+	 * It checks that the given resource attachment change concerns the delete of a diagram.

+	 * 

+	 * @param input

+	 *            The reference change.

+	 * @return True if it concerns the delete of a node, False otherwise.

+	 */

+	protected static boolean isRelatedToADeleteDiagram(ResourceAttachmentChange input) {

+		return isContainmentOnSemanticDiagram(input) && input.getKind() == DifferenceKind.DELETE;

+	}

+

+	/**

+	 * It checks that the given difference is on a containment link to a Diagram attached to a semantic

+	 * object.

+	 * 

+	 * @param input

+	 *            The difference.

+	 * @return True if the difference matches with the predicate.

+	 */

+	private static boolean isContainmentOnSemanticDiagram(ResourceAttachmentChange input) {

+		EObject value = MatchUtil.getContainer(input.getMatch().getComparison(), input);

+		return value instanceof Diagram

+				&& ReferenceUtil.safeEGet(value, NotationPackage.Literals.VIEW__ELEMENT) != null;

+	}

+

+}

diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java
index 8b5187c..4f3910c 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java
@@ -69,9 +69,7 @@
 		// Macroscopic change on a node is refined by the unit main change and unit children related changes.

 		extension.getRefinedBy().add(refiningDiff);

 		if (extensionKind != DifferenceKind.MOVE) {

-			if (refiningDiff instanceof ReferenceChange) {

-				extension.getRefinedBy().addAll(getAllContainedDifferences((ReferenceChange)refiningDiff));

-			}

+			extension.getRefinedBy().addAll(getAllContainedDifferences(refiningDiff));

 		}

 	}

 

diff --git a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java
index 79643b0..c0adf72 100644
--- a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java
+++ b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java
@@ -10,13 +10,18 @@
  *******************************************************************************/
 package org.eclipse.emf.compare.provider.spec;
 
-import static com.google.common.collect.Iterables.filter;
+import static com.google.common.base.Predicates.not;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterators;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.MatchResource;
 import org.eclipse.emf.compare.ResourceAttachmentChange;
 import org.eclipse.emf.compare.provider.IItemDescriptionProvider;
@@ -45,25 +50,77 @@
 		super(adapterFactory);
 	}
 
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
+	 */
 	@Override
 	public Collection<?> getChildren(Object object) {
 		Collection<Object> children = new ArrayList<Object>();
 		MatchResource matchResource = (MatchResource)object;
 		Comparison comparison = matchResource.getComparison();
-		for (ResourceAttachmentChange rac : filter(comparison.getDifferences(),
-				ResourceAttachmentChange.class)) {
-			final String diffResourceURI = rac.getResourceURI();
-			if (diffResourceURI != null
-					&& (diffResourceURI.equals(matchResource.getLeftURI())
-							|| diffResourceURI.equals(matchResource.getRightURI()) || diffResourceURI
-								.equals(matchResource.getOriginURI()))) {
-				children.add(rac);
-			}
+		for (Diff diff : Collections2.filter(comparison.getDifferences(), isCandidate(matchResource))) {
+			children.add(diff);
 		}
 		return children;
 	}
 
 	/**
+	 * Predicate to check that the current difference is candidate to be added under the given
+	 * <code>MatchResource</code>.
+	 * 
+	 * @param matchResource
+	 *            The match resource.
+	 * @return The predicate.
+	 */
+	private Predicate<Diff> isCandidate(final MatchResource matchResource) {
+		return new Predicate<Diff>() {
+			public boolean apply(Diff input) {
+				if (input instanceof ResourceAttachmentChange) {
+					return uriEqualToOneAtLeast(matchResource).apply((ResourceAttachmentChange)input);
+				} else {
+					return Iterators.any(input.getRefinedBy().iterator(), isCandidate(matchResource));
+				}
+			}
+		};
+	}
+
+	/**
+	 * Predicate to check if the URI of the current attachment change is equal to one (at least) of the URIs
+	 * of the resources matched by the given <code>MatchResource</code>.
+	 * 
+	 * @param matchResource
+	 *            The match resource.
+	 * @return The predicate.
+	 */
+	private static Predicate<ResourceAttachmentChange> uriEqualToOneAtLeast(final MatchResource matchResource) {
+		return new Predicate<ResourceAttachmentChange>() {
+			public boolean apply(ResourceAttachmentChange difference) {
+				final String diffResourceURI = difference.getResourceURI();
+				return diffResourceURI != null
+						&& (diffResourceURI.equals(matchResource.getLeftURI())
+								|| diffResourceURI.equals(matchResource.getRightURI()) || diffResourceURI
+									.equals(matchResource.getOriginURI()));
+			}
+		};
+	}
+
+	/**
+	 * Predicate to check if the URI of the current attachment change is different from all the URIs of the
+	 * resources matched by the given <code>MatchResource</code>.
+	 * 
+	 * @param matchResource
+	 *            The match resource.
+	 * @return The predicate.
+	 * @since 3.0
+	 */
+	public static final Predicate<ResourceAttachmentChange> uriDifferentFromAll(
+			final MatchResource matchResource) {
+		return not(uriEqualToOneAtLeast(matchResource));
+	}
+
+	/**
 	 * {@inheritDoc}
 	 * 
 	 * @see org.eclipse.emf.compare.provider.MatchResourceItemProvider#getText(java.lang.Object)
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java
index 657237a..acd374e 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java
@@ -14,12 +14,13 @@
 import static com.google.common.collect.Iterables.isEmpty;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.compare.Diff;
 import org.eclipse.emf.compare.MatchResource;
 import org.eclipse.emf.compare.ResourceAttachmentChange;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.provider.spec.MatchResourceItemProviderSpec;
 import org.eclipse.emf.ecore.EObject;
 
 /**
@@ -40,14 +41,8 @@
 				Iterable<ResourceAttachmentChange> resourceAttachmentchanges = filter(differences,
 						ResourceAttachmentChange.class);
 				if (!isEmpty(resourceAttachmentchanges)) {
-					for (ResourceAttachmentChange rac : resourceAttachmentchanges) {
-						final String diffResourceURI = rac.getResourceURI();
-						if (!diffResourceURI.equals(((MatchResource)input).getLeftURI())
-								&& !diffResourceURI.equals(((MatchResource)input).getRightURI())
-								&& !diffResourceURI.equals(((MatchResource)input).getOriginURI())) {
-							return true;
-						}
-					}
+					return Iterables.all(resourceAttachmentchanges, MatchResourceItemProviderSpec
+							.uriDifferentFromAll((MatchResource)input));
 				} else {
 					return true;
 				}
diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java
index 5a9fc15..da3cdd9 100644
--- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java
@@ -28,6 +28,7 @@
 import org.eclipse.emf.compare.ReferenceChange;
 import org.eclipse.emf.compare.ResourceAttachmentChange;
 import org.eclipse.emf.compare.util.CompareSwitch;
+import org.eclipse.emf.compare.utils.MatchUtil;
 import org.eclipse.emf.ecore.EObject;
 
 /**
@@ -370,17 +371,40 @@
 	}
 
 	/**
-	 * Get all the add and delete changes on the objects contained in the one concerned by the given reference
-	 * change.
+	 * Get all the add and delete changes on the objects contained in the one concerned by the given
+	 * difference.
 	 * 
 	 * @param input
-	 *            The given reference change.
+	 *            The given difference.
 	 * @return The found differences.
 	 */
-	protected Set<Diff> getAllContainedDifferences(ReferenceChange input) {
+	protected Set<Diff> getAllContainedDifferences(Diff input) {
+		final Set<Diff> result = new HashSet<Diff>();
+
 		final Comparison comparison = input.getMatch().getComparison();
-		final Match match = comparison.getMatch(input.getValue());
-		final Set<Diff> result = getAllContainedDifferences(comparison, match);
+
+		CompareSwitch<EObject> valueGetter = new CompareSwitch<EObject>() {
+			@Override
+			public EObject caseReferenceChange(ReferenceChange object) {
+				return object.getValue();
+			}
+
+			@Override
+			public EObject caseResourceAttachmentChange(ResourceAttachmentChange object) {
+				return MatchUtil.getContainer(object.getMatch().getComparison(), object);
+			}
+
+			@Override
+			public EObject defaultCase(EObject object) {
+				return null;
+			}
+		};
+		EObject value = valueGetter.doSwitch(input);
+
+		if (value != null) {
+			final Match match = comparison.getMatch(value);
+			result.addAll(getAllContainedDifferences(comparison, match));
+		}
 
 		return result;
 	}
@@ -423,7 +447,7 @@
 			// Keep only unit changes...
 			if (!getExtensionKind().isInstance(candidate)) {
 				// ... which are not related to an other macroscopic ADD or DELETE of a graphical object.
-				if (!(candidate instanceof ReferenceChange && (isRelatedToAnExtensionAdd((ReferenceChange)candidate) || isRelatedToAnExtensionDelete((ReferenceChange)candidate)))) {
+				if (!isAMainRefiningDifference(candidate)) {
 					result.add(candidate);
 				} else if (candidate instanceof ReferenceChange
 						&& ((ReferenceChange)candidate).getReference().isContainment()) {
@@ -444,6 +468,33 @@
 	}
 
 	/**
+	 * It checks that the given difference is the main difference of a macroscopic change.
+	 * 
+	 * @param difference
+	 *            the difference to check.
+	 * @return True if the given difference is the main difference of a macroscopic change.
+	 */
+	private boolean isAMainRefiningDifference(Diff difference) {
+		CompareSwitch<Boolean> compareSwitch = new CompareSwitch<Boolean>() {
+			@Override
+			public Boolean caseReferenceChange(ReferenceChange object) {
+				return isRelatedToAnExtensionAdd(object) || isRelatedToAnExtensionDelete(object);
+			}
+
+			@Override
+			public Boolean caseResourceAttachmentChange(ResourceAttachmentChange object) {
+				return isRelatedToAnExtensionAdd(object) || isRelatedToAnExtensionDelete(object);
+			}
+
+			@Override
+			public Boolean defaultCase(EObject object) {
+				return Boolean.FALSE;
+			}
+		};
+		return compareSwitch.doSwitch(difference).booleanValue();
+	}
+
+	/**
 	 * Get the distinct differences refined by the given differences.
 	 * 
 	 * @param refiningDifferences