Index: trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java
===================================================================
--- trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java	(revision 1327)
+++ trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java	(revision 1333)
@@ -20,4 +20,5 @@
 
 import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.gui.Scroll;
 import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
 import de.ugoe.cs.autoquest.eventcore.guimodel.ITextArea;
@@ -249,4 +250,111 @@
      */
     @Test
+    public void test_Scroll_01() {
+        String blub =
+            "UserSession {" +
+            "  Scroll body1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        assertTrue(list.get(0).getTask() instanceof IEventTask);
+        
+        assertTrue(((IEventTaskInstance) list.get(0)).getEvent().getType() instanceof Scroll);
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Scroll_02() {
+        String blub =
+            "UserSession {" +
+            "  Scroll body1 { }" +
+            "  Scroll body2 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        assertTrue(list.get(0).getTask() instanceof IEventTask);
+        assertTrue(((IEventTaskInstance) list.get(0)).getEvent().getType() instanceof Scroll);
+
+        assertTrue(list.get(1) instanceof IEventTaskInstance);
+        assertTrue(list.get(1).getTask() instanceof IEventTask);
+        assertTrue(((IEventTaskInstance) list.get(1)).getEvent().getType() instanceof Scroll);
+        
+        assertFalse(list.get(0).equals(list.get(1)));
+        assertFalse(list.get(0).getTask().equals(list.get(1).getTask()));
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Scroll_03() {
+        String blub =
+            "UserSession {" +
+            "  Scroll body1 { }" +
+            "  Scroll body1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        assertTrue(list.get(0).getTask() instanceof IEventTask);
+        assertTrue(((IEventTaskInstance) list.get(0)).getEvent().getType() instanceof Scroll);
+
+        assertTrue(list.get(1) instanceof IEventTaskInstance);
+        assertTrue(list.get(1).getTask() instanceof IEventTask);
+        assertTrue(((IEventTaskInstance) list.get(1)).getEvent().getType() instanceof Scroll);
+        
+        assertFalse(list.get(0).equals(list.get(1)));
+        assertTrue(list.get(0).getTask().equals(list.get(1).getTask()));
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Scroll_04() {
+        String blub =
+            "UserSession {" +
+            "  Scroll body1 (1 2) { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        assertTrue(list.get(0).getTask() instanceof IEventTask);
+        
+        assertTrue(((IEventTaskInstance) list.get(0)).getEvent().getType() instanceof Scroll);
+        
+        Scroll scroll = (Scroll) ((IEventTaskInstance) list.get(0)).getEvent().getType();
+        
+        assertEquals(1, scroll.getXPosition());
+        assertEquals(2, scroll.getYPosition());
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
     public void test_GuiElements_01() {
         String blub =
@@ -1054,3 +1162,79 @@
         decoder.decode(blub);
     }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Optional_07() {
+        String blub =
+            "UserSession {" +
+            "  Optional op1 {" +
+            "    MouseClick c1 { }" +
+            "  }" +
+            "  Optional op1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+
+        ITaskInstanceList list = decoder.decode(blub);
+
+        assertTrue(list.get(0) instanceof IOptionalInstance);
+        assertNotNull(((IOptionalInstance) list.get(0)).getChild());
+        assertTrue(((IOptionalInstance) list.get(0)).getChild() instanceof IEventTaskInstance);
+
+        assertTrue(list.get(0).getTask() instanceof IOptional);
+        assertNotNull(((IOptional) list.get(0).getTask()).getMarkedTask());
+        assertTrue(((IOptional) list.get(0).getTask()).getMarkedTask() instanceof IEventTask);
+
+        assertTrue(list.get(1) instanceof IOptionalInstance);
+        assertNull(((IOptionalInstance) list.get(1)).getChild());
+
+        assertTrue(list.get(1).getTask() instanceof IOptional);
+        assertNotNull(((IOptional) list.get(1).getTask()).getMarkedTask());
+        assertTrue(((IOptional) list.get(1).getTask()).getMarkedTask() instanceof IEventTask);
+
+        assertFalse(list.get(0).equals(list.get(1)));
+        assertTrue(list.get(0).getTask().equals(list.get(1).getTask()));
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Optional_08() {
+        String blub =
+            "UserSession {" +
+            "  Optional op1 { }" +
+            "  Optional op1 {" +
+            "    MouseClick c1 { }" +
+            "  }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+
+        ITaskInstanceList list = decoder.decode(blub);
+
+        assertTrue(list.get(0) instanceof IOptionalInstance);
+        assertNull(((IOptionalInstance) list.get(0)).getChild());
+
+        assertTrue(list.get(0).getTask() instanceof IOptional);
+        assertNotNull(((IOptional) list.get(0).getTask()).getMarkedTask());
+        assertTrue(((IOptional) list.get(0).getTask()).getMarkedTask() instanceof IEventTask);
+
+        assertTrue(list.get(1) instanceof IOptionalInstance);
+        assertNotNull(((IOptionalInstance) list.get(1)).getChild());
+        assertTrue(((IOptionalInstance) list.get(1)).getChild() instanceof IEventTaskInstance);
+
+        assertTrue(list.get(1).getTask() instanceof IOptional);
+        assertNotNull(((IOptional) list.get(1).getTask()).getMarkedTask());
+        assertTrue(((IOptional) list.get(1).getTask()).getMarkedTask() instanceof IEventTask);
+
+        assertFalse(list.get(0).equals(list.get(1)));
+        assertTrue(list.get(0).getTask().equals(list.get(1).getTask()));
+        
+        new TaskTreeValidator().validate(list);
+    }
 }
