Index: trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java
===================================================================
--- trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java	(revision 1088)
+++ trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java	(revision 1280)
@@ -18,4 +18,5 @@
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
@@ -340,5 +341,5 @@
      */
     @Test
-    public void test_Traverser_01() throws Exception {
+    public void test_GroupGUIElements_01() throws Exception {
         GUIModel model = new GUIModel();
         
@@ -389,161 +390,28 @@
         //         \-- guiElem10
         
-        GUIModel.Traverser traverser = model.getTraverser();
-        assertNotNull(traverser);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.parent());
-        
-        // guiElem1
-        IGUIElement element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem2
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertTrue(traverser.hasNextSibling());
-        
-        // guiElem3
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertTrue(traverser.hasNextSibling());
-        
-        // guiElem4
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem4", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertFalse(traverser.hasFirstChild());
-        assertNull(traverser.firstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-
-        // guiElem3
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertTrue(traverser.hasNextSibling());
-        
-        // guiElem5
-        element = traverser.nextSibling();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem6
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem6", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertFalse(traverser.hasFirstChild());
-        assertNull(traverser.firstChild());
-        assertTrue(traverser.hasNextSibling());
-        
-        // guiElem7
-        element = traverser.nextSibling();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem8
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem8", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertFalse(traverser.hasFirstChild());
-        assertNull(traverser.firstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem7
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem5
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem2
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertTrue(traverser.hasNextSibling());
-        
-        // guiElem9
-        element = traverser.nextSibling();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem10
-        element = traverser.firstChild();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem10", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertFalse(traverser.hasFirstChild());
-        assertNull(traverser.firstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem9
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        // guiElem1
-        element = traverser.parent();
-        assertNotNull(element);
-        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
-        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
-        assertTrue(traverser.hasFirstChild());
-        assertFalse(traverser.hasNextSibling());
-        assertNull(traverser.nextSibling());
-        
-        assertNull(traverser.parent());
-    }
-
-    /**
-     * 
-     */
-    @Test
-    public void test_Traverser_02() throws Exception {
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement guiElem1 = model.getRootElements().get(0);
+        
+        assertEquals(2, model.getChildren(guiElem1).size());
+        IGUIElement guiElem2 = model.getChildren(guiElem1).get(0);
+        IGUIElement guiElem9 = model.getChildren(guiElem1).get(1);
+        
+        model.groupGUIElements(Arrays.asList(guiElem2, guiElem9), "newGroup");
+        
+        assertEquals(1, model.getChildren(guiElem1).size());
+        IGUIElement group = model.getChildren(guiElem1).get(0);
+        
+        assertEquals(2, model.getChildren(group).size());
+        assertEquals(guiElem2, model.getChildren(group).get(0));
+        assertEquals(guiElem9, model.getChildren(group).get(1));
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_GroupGUIElements_02() throws Exception {
         GUIModel model = new GUIModel();
         
@@ -562,5 +430,5 @@
         guiElementPath.add(new TestGUIElementSpec("guiElem6"));
 
-        IGUIElement target = model.integratePath(guiElementPath, guiElementFactory);
+        model.integratePath(guiElementPath, guiElementFactory);
         
         guiElementPath.remove(3);
@@ -594,4 +462,424 @@
         //         \-- guiElem10
         
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement guiElem1 = model.getRootElements().get(0);
+        IGUIElement guiElem2 = model.getChildren(guiElem1).get(0);
+        
+        assertEquals(2, model.getChildren(guiElem2).size());
+        IGUIElement guiElem3 = model.getChildren(guiElem2).get(0);
+        IGUIElement guiElem5 = model.getChildren(guiElem2).get(1);
+        
+        model.groupGUIElements(Arrays.asList(guiElem3, guiElem5), "newGroup");
+        
+        assertEquals(1, model.getChildren(guiElem2).size());
+        IGUIElement group = model.getChildren(guiElem2).get(0);
+        
+        assertEquals(2, model.getChildren(group).size());
+        assertEquals(guiElem3, model.getChildren(group).get(0));
+        assertEquals(guiElem5, model.getChildren(group).get(1));
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_GroupGUIElements_03() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement guiElem1 = model.getRootElements().get(0);
+        IGUIElement guiElem2 = model.getChildren(guiElem1).get(0);
+        IGUIElement guiElem3 = model.getChildren(guiElem2).get(0);
+        
+        assertEquals(1, model.getChildren(guiElem3).size());
+        IGUIElement guiElem4 = model.getChildren(guiElem3).get(0);
+        
+        model.groupGUIElements(Arrays.asList(guiElem4), "newGroup");
+        
+        assertEquals(1, model.getChildren(guiElem3).size());
+        IGUIElement group = model.getChildren(guiElem3).get(0);
+        
+        assertEquals(1, model.getChildren(group).size());
+        assertEquals(guiElem4, model.getChildren(group).get(0));
+    }
+
+    /**
+     * 
+     */
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void test_GroupGUIElements_04() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement guiElem1 = model.getRootElements().get(0);
+        IGUIElement guiElem2 = model.getChildren(guiElem1).get(0);
+        IGUIElement guiElem3 = model.getChildren(guiElem2).get(0);
+        IGUIElement guiElem5 = model.getChildren(guiElem2).get(1);
+        
+        assertEquals(1, model.getChildren(guiElem3).size());
+        IGUIElement guiElem4 = model.getChildren(guiElem3).get(0);
+        
+        assertEquals(2, model.getChildren(guiElem5).size());
+        IGUIElement guiElem6 = model.getChildren(guiElem5).get(0);
+
+        model.groupGUIElements(Arrays.asList(guiElem4, guiElem6), "newGroup");
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_Traverser_01() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
+        GUIModel.Traverser traverser = model.getTraverser();
+        assertNotNull(traverser);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.parent());
+        
+        // guiElem1
+        IGUIElement element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem2
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem3
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem4
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem4", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+
+        // guiElem3
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem5
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem6
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem6", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem7
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem8
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem8", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem7
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem5
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem2
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem9
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem10
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem10", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem9
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem1
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        assertNull(traverser.parent());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_Traverser_02() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        IGUIElement target = model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
         GUIModel.Traverser traverser = model.getTraverser(target);
         assertNotNull(traverser);
