[508294] ResourceAttachmentChange is displayed twice

With the new way to display differences and matches in the structure
merge viewer, the ResourceAttachmentChanges were displayed twice in each
GroupProvider (ThreeWayGroupProvider, DefaultGroupProvider,
ResourceGroupProvider, KindGroupProvider).

Change-Id: I0c659b832fb32aa2f29f9722e61601c46a7c77d2
Signed-off-by: Axel Richard <axel.richard@obeo.fr>
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/ResourceAttachmentChangeInGroupsTest.java b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/ResourceAttachmentChangeInGroupsTest.java
new file mode 100644
index 0000000..deda1a2
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/ResourceAttachmentChangeInGroupsTest.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2017 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups;
+
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.size;
+import static com.google.common.collect.Iterables.transform;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.ByResourceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.KindGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.ThreeWayComparisonGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.DiffNode;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.MatchResourceNode;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup;
+import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.data.nodes.resourceattachmentchange.ResourceAttachmentChangeInGroupsInputData;
+import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.provider.AbstractTestTreeNodeItemProviderAdapter;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Iterables;
+
+@SuppressWarnings("restriction")
+public class ResourceAttachmentChangeInGroupsTest extends AbstractTestTreeNodeItemProviderAdapter {
+
+	private Comparison comp;
+
+	@Before
+	public void setUp() throws Exception {
+		comp = getComparison(new ResourceAttachmentChangeInGroupsInputData());
+	}
+
+	/**
+	 * Test that a {@link ResourceAttachmentChange} is only display once in
+	 * {@link ThreeWayComparisonGroupProvider}. This test is related to <a
+	 * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=508294"</a>
+	 */
+	@Test
+	public void testResourceAttachmentChangeInThreeWayComparisonGroupProvider() {
+		ThreeWayComparisonGroupProvider threeWayComparisonGroup = new ThreeWayComparisonGroupProvider();
+		Collection<? extends IDifferenceGroup> groups = threeWayComparisonGroup.getGroups(comp);
+		assertNotNull(groups);
+		assertEquals(3, groups.size());
+		IDifferenceGroup[] groupsArray = groups.toArray(new IDifferenceGroup[3]);
+
+		// Conflicts group
+		IDifferenceGroup conflictsGroup = groupsArray[0];
+		assertEquals(EMFCompareRCPUIMessages.getString("ThreeWayComparisonGroupProvider.conflicts.label"), //$NON-NLS-1$
+				conflictsGroup.getName());
+		List<? extends TreeNode> children = conflictsGroup.getChildren();
+		assertEquals(0, children.size());
+
+		// Left group
+		IDifferenceGroup leftGroup = groupsArray[1];
+		assertEquals(EMFCompareRCPUIMessages.getString("ThreeWayComparisonGroupProvider.left.label"), //$NON-NLS-1$
+				leftGroup.getName());
+		children = leftGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		TreeNode fragmentMatchResourceNode = children.get(0);
+		EList<TreeNode> fragmentMatchResourceNodeChildren = fragmentMatchResourceNode.getChildren();
+		assertEquals(1, fragmentMatchResourceNodeChildren.size());
+		assertEquals(1, size(filter(fragmentMatchResourceNodeChildren, DiffNode.class)));
+		Iterable<EObject> fragmentMatchResourceNodeData = transform(fragmentMatchResourceNodeChildren,
+				TREE_NODE_DATA);
+		assertEquals(1, Iterables.size(fragmentMatchResourceNodeData));
+		assertEquals(1, size(filter(fragmentMatchResourceNodeData, ResourceAttachmentChange.class)));
+		TreeNode rootMatchResourceNode = children.get(1);
+		assertEquals(0, rootMatchResourceNode.getChildren().size());
+
+		// Right group
+		IDifferenceGroup rightGroup = groupsArray[2];
+		assertEquals(EMFCompareRCPUIMessages.getString("ThreeWayComparisonGroupProvider.right.label"), //$NON-NLS-1$
+				rightGroup.getName());
+		children = rightGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		for (TreeNode treeNode : children) {
+			children = treeNode.getChildren();
+			assertEquals(0, children.size());
+		}
+	}
+
+	/**
+	 * Test that a {@link ResourceAttachmentChange} is only display once in {@link DefaultGroupProvider}. This
+	 * test is related to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=508294"</a>
+	 */
+	@Test
+	public void testResourceAttachmentChangeInDefaultComparisonGroupProvider() {
+		DefaultGroupProvider defaultComparisonGroup = new DefaultGroupProvider();
+		Collection<? extends IDifferenceGroup> groups = defaultComparisonGroup.getGroups(comp);
+		assertNotNull(groups);
+		assertEquals(1, groups.size());
+		IDifferenceGroup defaultGroup = groups.iterator().next();
+		List<? extends TreeNode> children = defaultGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		TreeNode fragmentMatchResourceNode = children.get(0);
+		EList<TreeNode> fragmentMatchResourceNodeChildren = fragmentMatchResourceNode.getChildren();
+		assertEquals(1, fragmentMatchResourceNodeChildren.size());
+		assertEquals(1, size(filter(fragmentMatchResourceNodeChildren, DiffNode.class)));
+		Iterable<EObject> fragmentMatchResourceNodeData = transform(fragmentMatchResourceNodeChildren,
+				TREE_NODE_DATA);
+		assertEquals(1, Iterables.size(fragmentMatchResourceNodeData));
+		assertEquals(1, size(filter(fragmentMatchResourceNodeData, ResourceAttachmentChange.class)));
+		TreeNode rootMatchResourceNode = children.get(1);
+		assertEquals(0, rootMatchResourceNode.getChildren().size());
+	}
+
+	/**
+	 * Test that a {@link ResourceAttachmentChange} is only display once in {@link KindGroupProvider}. This
+	 * test is related to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=508294"</a>
+	 */
+	@Test
+	public void testResourceAttachmentChangeInByKindComparisonGroupProvider() {
+		KindGroupProvider kindComparisonGroup = new KindGroupProvider();
+		Collection<? extends IDifferenceGroup> groups = kindComparisonGroup.getGroups(comp);
+		assertNotNull(groups);
+		assertEquals(4, groups.size());
+		IDifferenceGroup[] groupsArray = groups.toArray(new IDifferenceGroup[4]);
+
+		// Addition group
+		IDifferenceGroup additionGroup = groupsArray[0];
+		assertEquals(EMFCompareRCPUIMessages.getString("KindGroupProvider.addition.label"), //$NON-NLS-1$
+				additionGroup.getName());
+		List<? extends TreeNode> children = additionGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		for (TreeNode treeNode : children) {
+			children = treeNode.getChildren();
+			assertEquals(0, children.size());
+		}
+
+		// Deletion group
+		IDifferenceGroup deletionGroup = groupsArray[1];
+		assertEquals(EMFCompareRCPUIMessages.getString("KindGroupProvider.deletion.label"), //$NON-NLS-1$
+				deletionGroup.getName());
+		children = deletionGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		TreeNode fragmentMatchResourceNode = children.get(0);
+		EList<TreeNode> fragmentMatchResourceNodeChildren = fragmentMatchResourceNode.getChildren();
+		assertEquals(1, fragmentMatchResourceNodeChildren.size());
+		assertEquals(1, size(filter(fragmentMatchResourceNodeChildren, DiffNode.class)));
+		Iterable<EObject> fragmentMatchResourceNodeData = transform(fragmentMatchResourceNodeChildren,
+				TREE_NODE_DATA);
+		assertEquals(1, Iterables.size(fragmentMatchResourceNodeData));
+		assertEquals(1, size(filter(fragmentMatchResourceNodeData, ResourceAttachmentChange.class)));
+		TreeNode rootMatchResourceNode = children.get(1);
+		assertEquals(0, rootMatchResourceNode.getChildren().size());
+
+		// Change group
+		IDifferenceGroup changeGroup = groupsArray[2];
+		assertEquals(EMFCompareRCPUIMessages.getString("KindGroupProvider.change.label"), //$NON-NLS-1$
+				changeGroup.getName());
+		children = changeGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		for (TreeNode treeNode : children) {
+			children = treeNode.getChildren();
+			assertEquals(0, children.size());
+		}
+
+		// Move group
+		IDifferenceGroup moveGroup = groupsArray[3];
+		assertEquals(EMFCompareRCPUIMessages.getString("KindGroupProvider.move.label"), //$NON-NLS-1$
+				moveGroup.getName());
+		children = moveGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		for (TreeNode treeNode : children) {
+			children = treeNode.getChildren();
+			assertEquals(0, children.size());
+		}
+	}
+
+	/**
+	 * Test that a {@link ResourceAttachmentChange} is only display once in {@link ByResourceGroupProvider}.
+	 * This test is related to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=508294"</a>
+	 */
+	@Test
+	public void testResourceAttachmentChangeInByResourceComparisonGroupProvider() {
+		ByResourceGroupProvider resourceComparisonGroup = new ByResourceGroupProvider();
+		Collection<? extends IDifferenceGroup> groups = resourceComparisonGroup.getGroups(comp);
+		assertNotNull(groups);
+		assertEquals(1, groups.size());
+		IDifferenceGroup byResourceGroup = groups.iterator().next();
+		List<? extends TreeNode> children = byResourceGroup.getChildren();
+		assertEquals(2, children.size());
+		assertEquals(2, size(filter(children, MatchResourceNode.class)));
+		TreeNode fragmentMatchResourceNode = children.get(0);
+		EList<TreeNode> fragmentMatchResourceNodeChildren = fragmentMatchResourceNode.getChildren();
+		assertEquals(1, fragmentMatchResourceNodeChildren.size());
+		assertEquals(1, size(filter(fragmentMatchResourceNodeChildren, DiffNode.class)));
+		Iterable<EObject> fragmentMatchResourceNodeData = transform(fragmentMatchResourceNodeChildren,
+				TREE_NODE_DATA);
+		assertEquals(1, Iterables.size(fragmentMatchResourceNodeData));
+		assertEquals(1, size(filter(fragmentMatchResourceNodeData, ResourceAttachmentChange.class)));
+		TreeNode rootMatchResourceNode = children.get(1);
+		assertEquals(0, rootMatchResourceNode.getChildren().size());
+	}
+
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/ResourceAttachmentChangeInGroupsInputData.java b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/ResourceAttachmentChangeInGroupsInputData.java
new file mode 100644
index 0000000..5ba3334
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/ResourceAttachmentChangeInGroupsInputData.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2016 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.rcp.ui.tests.structuremergeviewer.groups.data.nodes.resourceattachmentchange;
+
+import java.io.IOException;
+
+import org.eclipse.emf.compare.tests.edit.data.ResourceScopeProvider;
+import org.eclipse.emf.compare.tests.framework.AbstractInputData;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+public class ResourceAttachmentChangeInGroupsInputData extends AbstractInputData implements ResourceScopeProvider {
+
+	public Resource getLeft() throws IOException {
+		ResourceSet rSet = new ResourceSetImpl();
+		Resource resource = loadFromClassLoader("left/left.nodes");
+		rSet.getResources().add(resource);
+		return resource;
+	}
+
+	public Resource getRight() throws IOException {
+		ResourceSet rSet = new ResourceSetImpl();
+		Resource resource = loadFromClassLoader("right/right.nodes");
+		rSet.getResources().add(resource);
+		Resource fragment = loadFromClassLoader("right/fragment.nodes");
+		rSet.getResources().add(fragment);
+		return resource;
+	}
+
+	public Resource getOrigin() throws IOException {
+		ResourceSet rSet = new ResourceSetImpl();
+		Resource resource = loadFromClassLoader("origin/origin.nodes");
+		rSet.getResources().add(resource);
+		Resource fragment = loadFromClassLoader("origin/fragment.nodes");
+		rSet.getResources().add(fragment);
+		return resource;
+	}
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/left/left.nodes b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/left/left.nodes
new file mode 100644
index 0000000..3a9424a
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/left/left.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_ORexoLlNEeGmS9ESxeCLvg" name="root">

+  <containmentRef1 xmi:id="_QE6YYAcQEeKTxJtDIb3mMw" name="fragmented"/>

+</nodes:Node>

diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/fragment.nodes b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/fragment.nodes
new file mode 100644
index 0000000..27bbfc1
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/fragment.nodes
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_QE6YYAcQEeKTxJtDIb3mMw" name="fragmented"/>
\ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/origin.nodes b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/origin.nodes
new file mode 100644
index 0000000..b75ab16
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/origin/origin.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_ORexoLlNEeGmS9ESxeCLvg" name="root">

+  <containmentRef1 href="fragment.nodes#_QE6YYAcQEeKTxJtDIb3mMw"/>

+</nodes:Node>

diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/fragment.nodes b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/fragment.nodes
new file mode 100644
index 0000000..27bbfc1
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/fragment.nodes
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_QE6YYAcQEeKTxJtDIb3mMw" name="fragmented"/>
\ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/right.nodes b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/right.nodes
new file mode 100644
index 0000000..b75ab16
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/data/nodes/resourceattachmentchange/right/right.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_ORexoLlNEeGmS9ESxeCLvg" name="root">

+  <containmentRef1 href="fragment.nodes#_QE6YYAcQEeKTxJtDIb3mMw"/>

+</nodes:Node>

diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/provider/AbstractTestTreeNodeItemProviderAdapter.java b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/provider/AbstractTestTreeNodeItemProviderAdapter.java
index b204c8e..b7967c0 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/provider/AbstractTestTreeNodeItemProviderAdapter.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/structuremergeviewer/groups/provider/AbstractTestTreeNodeItemProviderAdapter.java
@@ -31,6 +31,9 @@
 import org.eclipse.emf.compare.tests.edit.data.ResourceScopeProvider;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.tree.TreeNode;
 import org.junit.Before;
@@ -62,8 +65,37 @@
 	 * @throws IOException
 	 */
 	public static Comparison getComparison(ResourceScopeProvider scopeProvider) throws IOException {
-		final IComparisonScope scope = new DefaultComparisonScope(scopeProvider.getLeft(),
-				scopeProvider.getRight(), scopeProvider.getOrigin());
+		Resource left = scopeProvider.getLeft();
+		ResourceSet leftResourceSet = null;
+		if (left != null) {
+			leftResourceSet = left.getResourceSet();
+			if (leftResourceSet != null) {
+				EcoreUtil.resolveAll(leftResourceSet);
+			}
+		}
+		Resource right = scopeProvider.getRight();
+		ResourceSet rightResourceSet = null;
+		if (right != null) {
+			rightResourceSet = right.getResourceSet();
+			if (rightResourceSet != null) {
+				EcoreUtil.resolveAll(rightResourceSet);
+			}
+		}
+		Resource origin = scopeProvider.getOrigin();
+		ResourceSet originResourceSet = null;
+		if (origin != null) {
+			originResourceSet = origin.getResourceSet();
+			if (originResourceSet != null) {
+				EcoreUtil.resolveAll(originResourceSet);
+			}
+		}
+
+		final IComparisonScope scope;
+		if (leftResourceSet != null && rightResourceSet != null) {
+			scope = new DefaultComparisonScope(leftResourceSet, rightResourceSet, originResourceSet);
+		} else {
+			scope = new DefaultComparisonScope(left, right, origin);
+		}
 		final Builder builder = EMFCompare.builder();
 		EMFCompareBuilderConfigurator.createDefault().configure(builder);
 		return builder.build().compare(scope);
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/suite/AllTests.java b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/suite/AllTests.java
index 65a6da2..e8f8650 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/suite/AllTests.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui.tests/src/org/eclipse/emf/compare/rcp/ui/tests/suite/AllTests.java
@@ -21,6 +21,7 @@
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.filters.TechnicalitiesFilterTests;
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.filters.TestFeatureMapDifferencesFilter;
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.ConflictsGroupTest;
+import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.ResourceAttachmentChangeInGroupsTest;
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.TestBasicDifferenceGroupImpl;
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.provider.TestComparisonTreeNodeItemProviderSpec;
 import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.provider.TestMatchTreeNodeItemProviderSpec;
@@ -47,7 +48,7 @@
 		TestBasicDifferenceGroupImpl.class, BugsTestSuite.class, TestFeatureMapDifferencesFilter.class,
 		RCPMatchEngineFactoryRegistryTest.class, ThreeWayComparisonGroupProviderTest.class,
 		ConflictsGroupTest.class, MatchAccessorTest.class, TechnicalitiesFilterTests.class,
-		MatchOfContainmentReferenceChangeAdapterTest.class })
+		MatchOfContainmentReferenceChangeAdapterTest.class, ResourceAttachmentChangeInGroupsTest.class })
 public class AllTests {
 	/**
 	 * Launches the test with the given arguments.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java
index ff5af1f..12a0c9c 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java
@@ -477,9 +477,11 @@
 	 *            The diff to add
 	 */
 	protected void addDiffNode(MatchNode matchNode, Diff diff) {
-		DiffNode diffNode = createDiffNode(diff);
-		handleRefiningDiffs(diffNode);
-		matchNode.addDiffNode(diffNode);
+		if (!(diff instanceof ResourceAttachmentChange)) {
+			DiffNode diffNode = createDiffNode(diff);
+			handleRefiningDiffs(diffNode);
+			matchNode.addDiffNode(diffNode);
+		}
 	}
 
 	/**
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java
index a08a901..f26ed2f 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java
@@ -128,7 +128,9 @@
 						|| isUnderResourceWithURI(match.getOrigin(), matchResource.getOriginURI())) {
 					MatchNode matchNode = createMatchNode(match);
 					populateMatchNode(matchNode);
-					matchResourceNode.addMatchNode(matchNode);
+					if (!matchNode.getChildren().isEmpty()) {
+						matchResourceNode.addMatchNode(matchNode);
+					}
 				}
 			}
 
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java
index 60664fa..1e3fc07 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java
@@ -65,6 +65,8 @@
 import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages;
 import org.eclipse.emf.compare.rcp.ui.internal.configuration.SideLabelProvider;
 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.ConflictNode;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.DiffNode;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.MatchNode;
 import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.AbstractDifferenceGroupProvider;
 import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup;
 import org.eclipse.emf.compare.scope.IComparisonScope;
@@ -277,6 +279,21 @@
 			ret.append(getName());
 			return ret;
 		}
+
+		/**
+		 * In the conflicts group, we want to be able to see the ResourceAttachmentChanges.
+		 * 
+		 * @param matchNode
+		 *            The given match node
+		 * @param diff
+		 *            The diff to add
+		 */
+		@Override
+		protected void addDiffNode(MatchNode matchNode, Diff diff) {
+			DiffNode diffNode = createDiffNode(diff);
+			handleRefiningDiffs(diffNode);
+			matchNode.addDiffNode(diffNode);
+		}
 	}
 
 	/**