diff --git a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
index 5d8c843..4b0ec1d 100644
--- a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
+++ b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
@@ -94,7 +94,7 @@
         Element rootElement = session.getRootElement();
         if (rootElement != null/* && !elementGroups.containsKey(rootElement) */)
         {
-          world.addElement(rootElement);
+          world.addElement(null, rootElement);
         }
       }
 
@@ -171,14 +171,14 @@
     @Override
     protected void onAdded(IContainer<Object> container, Object object)
     {
-      addElement(object);
+      addElement(container, object);
       world.layout();
     }
 
     @Override
     protected void onRemoved(IContainer<Object> container, Object object)
     {
-      removeElement(object);
+      removeElement(container, object);
       world.layout();
     }
 
@@ -195,22 +195,22 @@
       }
     }
 
-    private void addElement(Object object)
+    private void addElement(Object container, Object object)
     {
       if (object instanceof Element)
       {
         Element element = (Element)object;
-        world.addElement(element);
+        world.addElement(container, element);
         for (Element child : element.getElements())
         {
-          addElement(child);
+          addElement(element, child);
         }
       }
 
       EventUtil.addListener(object, this);
     }
 
-    private void removeElement(Object object)
+    private void removeElement(Object container, Object object)
     {
       EventUtil.removeListener(object, this);
       if (object instanceof Element)
@@ -218,12 +218,12 @@
         Element element = (Element)object;
         for (Element child : element.getElements())
         {
-          removeElement(child);
+          removeElement(element, child);
         }
 
         try
         {
-          world.removeElement(element);
+          world.removeElement(container, element);
         }
         catch (Exception ex)
         {
diff --git a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
index 49ce1a8..52c8cf2 100644
--- a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
+++ b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
@@ -79,6 +79,7 @@
 import java.awt.event.MouseAdapter;

 import java.awt.event.MouseEvent;

 import java.util.ArrayList;

+import java.util.Collection;

 import java.util.Collections;

 import java.util.Comparator;

 import java.util.HashMap;

@@ -101,6 +102,55 @@
 

   private Set<ElementDescriptor> disabledDescriptors = Collections.emptySet();

 

+  class ElementGroups

+  {

+    private Map<Pair<Element, Element>, ElementGroup> map = new HashMap<Pair<Element, Element>, ElementGroup>();

+

+    public Collection<ElementGroup> values()

+    {

+      return map.values();

+    }

+

+    public boolean containsKey(Element element)

+    {

+      Pair<Element, Element> pair = makePair(element);

+      return map.containsKey(pair);

+    }

+

+    public ElementGroup get(Object object)

+    {

+      if (object instanceof Element)

+      {

+        Element element = (Element)object;

+        Pair<Element, Element> pair = makePair(element);

+        return map.get(pair);

+      }

+

+      return null;

+    }

+

+    public ElementGroup put(Element element, ElementGroup elementGroup)

+    {

+      Pair<Element, Element> pair = makePair(element);

+      return map.put(pair, elementGroup);

+    }

+

+    public ElementGroup remove(Element element)

+    {

+      Pair<Element, Element> pair = makePair(element);

+      return map.remove(pair);

+    }

+

+    private Pair<Element, Element> makePair(Element element)

+    {

+      Element container = element.getContainer();

+      Pair<Element, Element> pair = new Pair<Element, Element>(element, container);

+      return pair;

+    }

+  }

+

+  // private ElementGroups elementGroups = new ElementGroups();

+

   private Map<Element, ElementGroup> elementGroups = new HashMap<Element, ElementGroup>();

 

   private Map<Element, Map<Element, ReferenceShape>> referenceShapes = new HashMap<Element, Map<Element, ReferenceShape>>();

@@ -323,28 +373,35 @@
     return root;

   }

 

-  public void addElement(Element element)

+  public void addElement(Object container, Element element)

   {

-    if (!elementGroups.containsKey(element))

+    if (elementGroups.containsKey(element))

+    {

+      removeElement(element.getContainer(), element);

+    }

     {

       ElementGroup group = createElementGroup(element);

-      ElementProvider provider = element.getProvider();

 

-      Map<Integer, Boolean> references = element.getReferences();

-      createChildren(group, provider, references);

+      // TODO check if the createChildren call is still needed

+      // ElementProvider provider = element.getProvider();

+      // Map<Integer, Boolean> references = element.getReferences();

+      // createChildren(group, provider, references);

 

       ElementGroup containerGroup = getContainerElementGroup(element);

       addNode(group, containerGroup);

     }

   }

 

-  public void removeElement(Element element)

+  public void removeElement(Object container, Element element)

   {

-    ElementGroup containmentGroup = elementGroups.remove(element);

-    if (containmentGroup != null)

+    if (container == element.getContainer())

     {

-      containmentGroup.detach();

-      clearReferenceNodes(element);

+      ElementGroup containmentGroup = elementGroups.remove(element);

+      if (containmentGroup != null)

+      {

+        containmentGroup.detach();

+        clearReferenceNodes(element);

+      }

     }

   }