Index: /branches/autoquest-core-tasktrees-alignment-test/.classpath
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/.classpath	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/.classpath	(revision 1647)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
Index: /branches/autoquest-core-tasktrees-alignment-test/.project
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/.project	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/.project	(revision 1647)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>autoquest-core-tasktrees-test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.jdt.core.prefs	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.jdt.core.prefs	(revision 1647)
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
Index: /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.m2e.core.prefs
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.m2e.core.prefs	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/.settings/org.eclipse.m2e.core.prefs	(revision 1647)
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
Index: /branches/autoquest-core-tasktrees-alignment-test/pom.xml
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/pom.xml	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/pom.xml	(revision 1647)
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>de.ugoe.cs.autoquest</groupId>
+        <artifactId>autoquest-test</artifactId>
+        <version>0.1.1-SNAPSHOT</version>
+        <relativePath>../autoquest-test/pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>autoquest-core-tasktrees-test</artifactId>
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+    </licenses>
+    <scm>
+        <url>${autoquest-scm-trunk-dir}/${project.artifactId}</url>
+        <connection>scm:svn:${autoquest-scm-trunk-dir}/${project.artifactId}</connection>
+    </scm>
+    <properties>
+        <tested-artifactId>autoquest-core-tasktrees</tested-artifactId>
+    </properties>
+</project>
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManagerTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManagerTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManagerTest.java	(revision 1647)
@@ -0,0 +1,1038 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.manager;
+
+import java.util.logging.Level;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeChecker;
+import de.ugoe.cs.autoquest.tasktrees.manager.ComponentManager;
+import de.ugoe.cs.autoquest.tasktrees.manager.TaskTreeManager;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+import de.ugoe.cs.autoquest.test.DummyInteraction;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.TextConsole;
+
+/**
+ * @author Patrick Harms
+ */
+public class TaskTreeManagerTest {
+    
+    /** */
+    TaskTreeManager manager;
+
+    /**
+     *
+     */
+    @Before
+    public void setUp() {
+        Console.reset();
+        new TextConsole(Level.FINEST);
+        manager = new TaskTreeManager();
+    }
+
+    /**
+     *
+     */
+    @After
+    public void tearDown() {
+        manager = null;
+        ComponentManager.clearInstance();
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOneEventOnOneElement() {
+        simulateEvent(new DummyInteraction("bla", 1), new DummyGUIElement("elem1"));
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Event bla {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testManyEventsOnOneElement() {
+        IEventTarget eventTarget = new DummyGUIElement("elem1");
+        simulateEvent(new DummyInteraction("bla", 1), eventTarget);
+        simulateEvent(new DummyInteraction("bli", 1), eventTarget);
+        simulateEvent(new DummyInteraction("blo", 1), eventTarget);
+        simulateEvent(new DummyInteraction("blu", 1), eventTarget);
+        simulateEvent(new DummyInteraction("ble", 1), eventTarget);
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Event bla {}" +
+             "  Event bli {}" +
+             "  Event blo {}" +
+             "  Event blu {}" +
+             "  Event ble {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOneEventOnManyElements() {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        IEventTarget eventTarget3 = new DummyGUIElement("elem3");
+        IEventTarget eventTarget4 = new DummyGUIElement("elem4");
+        IEventTarget eventTarget5 = new DummyGUIElement("elem5");
+        IEventTarget eventTarget6 = new DummyGUIElement("elem6");
+        simulateEvent(new DummyInteraction("bla", 1), eventTarget1);
+        simulateEvent(new DummyInteraction("bli", 1), eventTarget2);
+        simulateEvent(new DummyInteraction("blo", 1), eventTarget3);
+        simulateEvent(new DummyInteraction("blu", 1), eventTarget4);
+        simulateEvent(new DummyInteraction("ble", 1), eventTarget5);
+        simulateEvent(new DummyInteraction("blum", 1), eventTarget6);
+
+        new TaskTreeChecker(true).assertUserSession
+            ("UserSession session {" +
+             "  Event bla {}" +
+             "  Event bli {}" +
+             "  Event blo {}" +
+             "  Event blu {}" +
+             "  Event ble {}" +
+             "  Event blum {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testManyEventsOnManyElements() {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        IEventTarget eventTarget3 = new DummyGUIElement("elem3");
+        IEventTarget eventTarget4 = new DummyGUIElement("elem4");
+        IEventTarget eventTarget5 = new DummyGUIElement("elem5");
+        IEventTarget eventTarget6 = new DummyGUIElement("elem6");
+        simulateEvent(new DummyInteraction("bla", 1), eventTarget1);
+        simulateEvent(new DummyInteraction("bli", 1), eventTarget1);
+        simulateEvent(new DummyInteraction("blup", 1), eventTarget1);
+        simulateEvent(new DummyInteraction("ble", 1), eventTarget2);
+        simulateEvent(new DummyInteraction("blo", 1), eventTarget2);
+        simulateEvent(new DummyInteraction("blau", 1), eventTarget3);
+        simulateEvent(new DummyInteraction("blass", 1), eventTarget4);
+        simulateEvent(new DummyInteraction("blum", 1), eventTarget4);
+        simulateEvent(new DummyInteraction("blim", 1), eventTarget4);
+        simulateEvent(new DummyInteraction("blom", 1), eventTarget4);
+        simulateEvent(new DummyInteraction("blam", 1), eventTarget5);
+        simulateEvent(new DummyInteraction("blip", 1), eventTarget6);
+        simulateEvent(new DummyInteraction("blap", 1), eventTarget6);
+        simulateEvent(new DummyInteraction("blep", 1), eventTarget6);
+        simulateEvent(new DummyInteraction("blop", 1), eventTarget6);
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Event bla {}" +
+             "  Event bli {}" +
+             "  Event blup {}" +
+             "  Event ble {}" +
+             "  Event blo {}" +
+             "  Event blau {}" +
+             "  Event blass {}" +
+             "  Event blum {}" +
+             "  Event blim {}" +
+             "  Event blom {}" +
+             "  Event blam {}" +
+             "  Event blip {}" +
+             "  Event blap {}" +
+             "  Event blep {}" +
+             "  Event blop {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testEventIterationDetection_01() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        simulateEvent(event1, eventTarget1);
+        simulateEvent(event1, eventTarget1);
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration1 {" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testEventIterationDetection_02() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        for (int i = 0; i < 10; i++) {
+            simulateEvent(event1, eventTarget1);
+        }
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration1 {" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testEventIterationDetection_03() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+
+        // now test with preceding and trailing other interactions
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+        IEventType event4 = new DummyInteraction("ble", 1);
+        IEventType event5 = new DummyInteraction("blo", 1);
+
+        simulateEvent(event2, eventTarget1);
+        simulateEvent(event3, eventTarget1);
+        for (int i = 0; i < 10; i++) {
+            simulateEvent(event1, eventTarget1);
+        }
+        simulateEvent(event4, eventTarget1);
+        simulateEvent(event5, eventTarget1);
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Event bli {}" +
+             "  Event blup {}" +
+             "  Iteration iteration2 {" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "    Event bla {}" +
+             "  }" +
+             "  Event ble {}" +
+             "  Event blo {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testEventIterationDetection_04() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+
+        // now test with iterations of iterations
+        for (int i = 0; i < 5; i++) {
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event1, eventTarget1);
+            }
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event2, eventTarget1);
+            }
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event3, eventTarget1);
+            }
+        }
+
+        new TaskTreeChecker(true).assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration2 {" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration3 {" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "      }" +
+             "      Iteration iteration4 {" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration3 {" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "      }" +
+             "      Iteration iteration4 {" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration3 {" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "      }" +
+             "      Iteration iteration4 {" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration3 {" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "      }" +
+             "      Iteration iteration4 {" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration3 {" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "        Event bla {}" +
+             "      }" +
+             "      Iteration iteration4 {" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "        Event bli {}" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "        Event blup {}" +
+             "      }" +
+             "    }" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testSequenceIterationDetection_01() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+
+        simulateEvent(event1, eventTarget1);
+        simulateEvent(event2, eventTarget1);
+        simulateEvent(event3, eventTarget1);
+
+        simulateEvent(event1, eventTarget1);
+        simulateEvent(event2, eventTarget1);
+        simulateEvent(event3, eventTarget1);
+        
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration1 {" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testSequenceIterationDetection_02() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+
+        for (int i = 0; i < 10; i++) {
+            simulateEvent(event1, eventTarget1);
+            simulateEvent(event2, eventTarget1);
+            simulateEvent(event3, eventTarget1);
+        }
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration1 {" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence2 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testSequenceIterationDetection_03() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+        
+        // now test with preceding and trailing other interactions
+        IEventType event4 = new DummyInteraction("ble", 1);
+        IEventType event5 = new DummyInteraction("blo", 1);
+        IEventType event6 = new DummyInteraction("blu", 1);
+        
+        simulateEvent(event4, eventTarget1);
+        for (int i = 0; i < 5; i++) {
+            simulateEvent(event1, eventTarget1);
+            simulateEvent(event2, eventTarget1);
+            simulateEvent(event3, eventTarget1);
+        }
+        simulateEvent(event5, eventTarget1);
+        simulateEvent(event6, eventTarget1);
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Event ble {}" +
+             "  Iteration iteration2 {" +
+             "    Sequence sequence3 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence3 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence3 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence3 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "    Sequence sequence3 {" +
+             "      Event bla {}" +
+             "      Event bli {}" +
+             "      Event blup {}" +
+             "    }" +
+             "  }" +
+             "  Event blo {}" +
+             "  Event blu {}" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testSequenceIterationDetection_04() throws Exception {
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        IEventType event1 = new DummyInteraction("bla", 1);
+        IEventType event2 = new DummyInteraction("bli", 1);
+        IEventType event3 = new DummyInteraction("blup", 1);
+        IEventType event4 = new DummyInteraction("blo", 1);
+        IEventType event5 = new DummyInteraction("blau", 1);
+        IEventType event6 = new DummyInteraction("blass", 1);
+        IEventType event7 = new DummyInteraction("ble", 1);
+        IEventType event8 = new DummyInteraction("blum", 1);
+        IEventType event9 = new DummyInteraction("blop", 1);
+
+        // now test with iterations of iterations
+        for (int i = 0; i < 5; i++) {
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event1, eventTarget1);
+                simulateEvent(event2, eventTarget1);
+                simulateEvent(event3, eventTarget1);
+            }
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event4, eventTarget1);
+                simulateEvent(event5, eventTarget1);
+                simulateEvent(event6, eventTarget1);
+            }
+            for (int j = 0; j < 5; j++) {
+                simulateEvent(event7, eventTarget1);
+                simulateEvent(event8, eventTarget1);
+                simulateEvent(event9, eventTarget1);
+            }
+        }
+
+        new TaskTreeChecker().assertUserSession
+            ("UserSession session {" +
+             "  Iteration iteration3 {" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration4 {" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration6 {" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration4 {" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration6 {" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration4 {" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration6 {" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration4 {" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration6 {" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "      }" +
+             "    }" +
+             "    Sequence sequence1 {" +
+             "      Iteration iteration4 {" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "        Sequence sequence4 {" +
+             "          Event bla {}" +
+             "          Event bli {}" +
+             "          Event blup {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration5 {" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "        Sequence sequence5 {" +
+             "          Event blo {}" +
+             "          Event blau {}" +
+             "          Event blass {}" +
+             "        }" +
+             "      }" +
+             "      Iteration iteration6 {" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "        Sequence sequence6 {" +
+             "          Event ble {}" +
+             "          Event blum {}" +
+             "          Event blop {}" +
+             "        }" +
+             "      }" +
+             "    }" +
+             "  }" +
+             "}", manager.getTaskModel().getUserSessions().get(0));
+    }
+
+    /**
+     *
+     */
+    private void simulateEvent(IEventType eventType, IEventTarget eventTarget) {
+        manager.handleNewEvent(new Event(eventType, eventTarget));
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/AbstractComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/AbstractComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/AbstractComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,293 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIterationInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelectionInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequenceInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+
+/**
+ * @author Patrick Harms
+ */
+public class AbstractComparisonRuleTest {
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+
+    /** */
+    private ITaskBuilder taskBuilder = new TaskBuilder();
+
+    /**
+     *
+     */
+    protected IEventTask createNewEventTask(IEventType eventType, IEventTarget eventTarget) {
+        IEventTask eventTask = taskFactory.createNewEventTask(eventType + " --> " + eventTarget);
+        taskFactory.createNewTaskInstance(eventTask, new Event(eventType, eventTarget));
+        return eventTask;
+    }
+
+    /**
+     *
+     */
+    protected ISequence createNewSequence() {
+        ISequence sequence = taskFactory.createNewSequence();
+        taskFactory.createNewTaskInstance(sequence);
+        return sequence;
+    }
+
+    /**
+     *
+     */
+    protected ISelection createNewSelection() {
+        ISelection selection = taskFactory.createNewSelection();
+        taskFactory.createNewTaskInstance(selection);
+        return selection;
+    }
+
+    /**
+     *
+     */
+    protected IOptional createNewOptional() {
+        IOptional optional = taskFactory.createNewOptional();
+        taskFactory.createNewTaskInstance(optional);
+        return optional;
+    }
+
+    /**
+     *
+     */
+    protected IIteration createNewIteration() {
+        IIteration iteration = taskFactory.createNewIteration();
+        taskFactory.createNewTaskInstance(iteration);
+        return iteration;
+    }
+    
+    /**
+     *
+     */
+    protected void setMarkedTask(IIteration iteration, ITask task) {
+        taskBuilder.setMarkedTask(iteration, task);
+        taskBuilder.addChild((IIterationInstance) iteration.getInstances().iterator().next(),
+                             task.getInstances().iterator().next());
+    }
+
+    /**
+     *
+     */
+    protected void addChild(ISelection selection, ITask task) {
+        taskBuilder.addChild(selection, task);
+        taskBuilder.setChild((ISelectionInstance) selection.getInstances().iterator().next(),
+                             task.getInstances().iterator().next());
+    }
+
+    /**
+     *
+     */
+    protected void addChild(ISequence sequence, ITask task) {
+        taskBuilder.addChild(sequence, task);
+        taskBuilder.addChild((ISequenceInstance) sequence.getInstances().iterator().next(),
+                             task.getInstances().iterator().next());
+    }
+
+    /**
+     *
+     */
+    protected void assertLexicallyEqual(TaskComparisonRule rule, ITask task1, ITask task2) {
+        assertEquals(TaskEquality.LEXICALLY_EQUAL, rule.compare(task1, task2));
+        assertTrue(rule.areLexicallyEqual(task1, task2));
+        assertTrue(rule.areSyntacticallyEqual(task1, task2));
+        assertTrue(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.LEXICALLY_EQUAL, rule.compare(task2, task1));
+        assertTrue(rule.areLexicallyEqual(task2, task1));
+        assertTrue(rule.areSyntacticallyEqual(task2, task1));
+        assertTrue(rule.areSemanticallyEqual(task2, task1));
+        
+        assertEquals(TaskEquality.LEXICALLY_EQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertTrue(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                          task2.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                             task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.LEXICALLY_EQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertTrue(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                          task1.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                             task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    protected void assertSyntacticallyEqual(TaskComparisonRule rule, ITask task1, ITask task2) {
+        assertEquals(TaskEquality.SYNTACTICALLY_EQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertTrue(rule.areSyntacticallyEqual(task1, task2));
+        assertTrue(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.SYNTACTICALLY_EQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertTrue(rule.areSyntacticallyEqual(task2, task1));
+        assertTrue(rule.areSemanticallyEqual(task2, task1));
+        
+        assertEquals(TaskEquality.SYNTACTICALLY_EQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                             task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.SYNTACTICALLY_EQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                             task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    protected void assertSemanticallyEqual(TaskComparisonRule rule, ITask task1, ITask task2) {
+        assertEquals(TaskEquality.SEMANTICALLY_EQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertTrue(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.SEMANTICALLY_EQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertTrue(rule.areSemanticallyEqual(task2, task1));
+        
+        assertEquals(TaskEquality.SEMANTICALLY_EQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                             task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.SEMANTICALLY_EQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                             task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    protected void assertUnequal(TaskComparisonRule rule, ITask task1, ITask task2) {
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertFalse(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertFalse(rule.areSemanticallyEqual(task2, task1));
+        
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    protected void assertNullEquality(TaskComparisonRule rule, ITask task1, ITask task2) {
+        assertNull(rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertFalse(rule.areSemanticallyEqual(task1, task2));
+
+        assertNull(rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertFalse(rule.areSemanticallyEqual(task2, task1));
+        
+        assertNull(rule.compare(task1.getInstances().iterator().next(),
+                                task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+
+        assertNull(rule.compare(task2.getInstances().iterator().next(),
+                                task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+    }
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/EventTaskComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/EventTaskComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/EventTaskComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,529 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.EventTaskComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class EventTaskComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        assertTrue(rule.isApplicable(task1, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+   
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+       
+        ITask selection = createNewSelection();
+
+        assertFalse(rule.isApplicable(task1, selection));
+        assertFalse(rule.isApplicable(selection, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask sequence = createNewSequence();
+
+        assertFalse(rule.isApplicable(task1, sequence));
+        assertFalse(rule.isApplicable(sequence, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask iteration = createNewIteration();
+
+        assertFalse(rule.isApplicable(task1, iteration));
+        assertFalse(rule.isApplicable(iteration, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask optional = createNewOptional();
+
+        assertFalse(rule.isApplicable(task1, optional));
+        assertFalse(rule.isApplicable(optional, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_07() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+   
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_08() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_09() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask selection = createNewSelection();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      selection.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(selection.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_10() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask sequence = createNewSequence();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      sequence.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(sequence.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_11() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask iteration = createNewIteration();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      iteration.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(iteration.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_12() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask optional = createNewOptional();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      optional.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(optional.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_01() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertEquals(TaskEquality.LEXICALLY_EQUAL, rule.compare(task1, task1));
+        assertTrue(rule.areLexicallyEqual(task1, task1));
+        assertTrue(rule.areSyntacticallyEqual(task1, task1));
+        assertTrue(rule.areSemanticallyEqual(task1, task1));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_02() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertEquals(TaskEquality.LEXICALLY_EQUAL, rule.compare(task1, task2));
+        assertTrue(rule.areLexicallyEqual(task1, task2));
+        assertTrue(rule.areSyntacticallyEqual(task1, task2));
+        assertTrue(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.LEXICALLY_EQUAL, rule.compare(task2, task1));
+        assertTrue(rule.areLexicallyEqual(task2, task1));
+        assertTrue(rule.areSyntacticallyEqual(task2, task1));
+        assertTrue(rule.areSemanticallyEqual(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_03() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertFalse(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertFalse(rule.areSemanticallyEqual(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_04() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType1, eventTarget2);
+        
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertFalse(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertFalse(rule.areSemanticallyEqual(task2, task1));
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_05() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task1, task2));
+        assertFalse(rule.areLexicallyEqual(task1, task2));
+        assertFalse(rule.areSyntacticallyEqual(task1, task2));
+        assertFalse(rule.areSemanticallyEqual(task1, task2));
+
+        assertEquals(TaskEquality.UNEQUAL, rule.compare(task2, task1));
+        assertFalse(rule.areLexicallyEqual(task2, task1));
+        assertFalse(rule.areSyntacticallyEqual(task2, task1));
+        assertFalse(rule.areSemanticallyEqual(task2, task1));
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_06() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertEquals(TaskEquality.LEXICALLY_EQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertTrue(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                          task1.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                             task1.getInstances().iterator().next()));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_07() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertEquals(TaskEquality.LEXICALLY_EQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertTrue(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                          task2.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                             task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.LEXICALLY_EQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertTrue(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                          task1.getInstances().iterator().next()));
+        assertTrue(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+        assertTrue(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                             task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_08() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_09() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType1, eventTarget2);
+        
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_10() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task1.getInstances().iterator().next(),
+                                  task2.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task1.getInstances().iterator().next(),
+                                           task2.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task1.getInstances().iterator().next(),
+                                               task2.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task1.getInstances().iterator().next(),
+                                              task2.getInstances().iterator().next()));
+
+        assertEquals(TaskEquality.UNEQUAL,
+                     rule.compare(task2.getInstances().iterator().next(),
+                                  task1.getInstances().iterator().next()));
+        assertFalse(rule.areLexicallyEqual(task2.getInstances().iterator().next(),
+                                           task1.getInstances().iterator().next()));
+        assertFalse(rule.areSyntacticallyEqual(task2.getInstances().iterator().next(),
+                                               task1.getInstances().iterator().next()));
+        assertFalse(rule.areSemanticallyEqual(task2.getInstances().iterator().next(),
+                                              task1.getInstances().iterator().next()));
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/GUIEventTaskComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/GUIEventTaskComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/GUIEventTaskComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,1564 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.eventcore.gui.KeyPressed;
+import de.ugoe.cs.autoquest.eventcore.gui.KeyReleased;
+import de.ugoe.cs.autoquest.eventcore.gui.KeyTyped;
+import de.ugoe.cs.autoquest.eventcore.gui.KeyboardFocusChange;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseButtonDown;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseButtonInteraction;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseButtonUp;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseClick;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseDoubleClick;
+import de.ugoe.cs.autoquest.eventcore.gui.MouseDragAndDrop;
+import de.ugoe.cs.autoquest.eventcore.gui.Scroll;
+import de.ugoe.cs.autoquest.eventcore.gui.TextInput;
+import de.ugoe.cs.autoquest.eventcore.gui.TextSelection;
+import de.ugoe.cs.autoquest.eventcore.gui.ValueSelection;
+import de.ugoe.cs.autoquest.keyboardmaps.VirtualKey;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.EventTaskComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class GUIEventTaskComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        assertTrue(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyboardFocusChange();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyboardFocusChange();
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyReleased(VirtualKey.LETTER_B);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_C);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyTyped(VirtualKey.LETTER_D);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 5, 6);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.MIDDLE, 3, 1);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_07() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.RIGHT, 4, 7);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.X, 9, 12);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_08() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseDragAndDrop(5, 6, 7, 8);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_09() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new Scroll(3, 4);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_10() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        List<Event> inputEvents = new ArrayList<Event>();
+        IEventType eventType1 = new TextInput("text1", inputEvents);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new TextInput("text2", inputEvents);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_11() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new TextSelection();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new ValueSelection<String>("value");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_12() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask selection = createNewSelection();
+
+        assertFalse(rule.isApplicable(task1, selection));
+        assertFalse(rule.isApplicable(selection, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_13() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask sequence = createNewSequence();
+
+        assertFalse(rule.isApplicable(task1, sequence));
+        assertFalse(rule.isApplicable(sequence, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_14() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask iteration = createNewIteration();
+
+        assertFalse(rule.isApplicable(task1, iteration));
+        assertFalse(rule.isApplicable(iteration, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_15() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask optional = createNewOptional();
+
+        assertFalse(rule.isApplicable(task1, optional));
+        assertFalse(rule.isApplicable(optional, task1));
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_16() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_17() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_18() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyboardFocusChange();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyboardFocusChange();
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_19() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyReleased(VirtualKey.LETTER_B);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_20() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_C);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyTyped(VirtualKey.LETTER_D);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_21() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 5, 6);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.MIDDLE, 3, 1);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_22() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.RIGHT, 4, 7);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.X, 9, 12);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_23() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new MouseDragAndDrop(5, 6, 7, 8);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_24() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new Scroll(3, 4);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_25() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        List<Event> inputEvents = new ArrayList<Event>();
+        IEventType eventType1 = new TextInput("text1", inputEvents);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new TextInput("text2", inputEvents);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(), task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(), task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_26() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new TextSelection();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new ValueSelection<String>("value");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+
+        assertTrue(rule.isApplicable(task1.getInstances().iterator().next(),
+                                     task2.getInstances().iterator().next()));
+        assertTrue(rule.isApplicable(task2.getInstances().iterator().next(),
+                                     task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_27() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask selection = createNewSelection();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      selection.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(selection.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_28() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask sequence = createNewSequence();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      sequence.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(sequence.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_29() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask iteration = createNewIteration();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      iteration.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(iteration.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_30() {
+        EventTaskComparisonRule rule = new EventTaskComparisonRule();
+
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        ITask optional = createNewOptional();
+
+        assertFalse(rule.isApplicable(task1.getInstances().iterator().next(),
+                                      optional.getInstances().iterator().next()));
+        assertFalse(rule.isApplicable(optional.getInstances().iterator().next(),
+                                      task1.getInstances().iterator().next()));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyboardFocusChange_01() {
+        IEventType eventType1 = new KeyboardFocusChange();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyboardFocusChange_02() {
+        IEventType eventType1 = new KeyboardFocusChange();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyboardFocusChange();
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyboardFocusChange_03() {
+        IEventType eventType1 = new KeyboardFocusChange();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new KeyboardFocusChange();
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyPressed_01() {
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyPressed_02() {
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyPressed(VirtualKey.LETTER_A);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyPressed_03() {
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyPressed(VirtualKey.LETTER_B);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyPressed_04() {
+        IEventType eventType1 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyPressed(VirtualKey.LETTER_A);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyReleased_01() {
+        IEventType eventType1 = new KeyReleased(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyReleased_02() {
+        IEventType eventType1 = new KeyReleased(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyReleased(VirtualKey.LETTER_A);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyReleased_03() {
+        IEventType eventType1 = new KeyReleased(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyReleased(VirtualKey.LETTER_B);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyReleased_04() {
+        IEventType eventType1 = new KeyReleased(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyReleased(VirtualKey.LETTER_A);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyTyped_01() {
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyTyped_02() {
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyTyped(VirtualKey.LETTER_A);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyTyped_03() {
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyTyped(VirtualKey.LETTER_B);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_KeyTyped_04() {
+        IEventType eventType1 = new KeyTyped(VirtualKey.LETTER_A);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new KeyTyped(VirtualKey.LETTER_A);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_01() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_02() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_03() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 3);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_04() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 3, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_05() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonDown(MouseButtonInteraction.Button.RIGHT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonDown_06() {
+        IEventType eventType1 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonDown(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_01() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_02() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_03() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 3);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_04() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 3, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_05() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.RIGHT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseButtonUp_06() {
+        IEventType eventType1 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseButtonUp(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_01() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_02() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_03() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 3);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_04() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseClick(MouseButtonInteraction.Button.LEFT, 3, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_05() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseClick(MouseButtonInteraction.Button.RIGHT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseClick_06() {
+        IEventType eventType1 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_01() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_02() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_03() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 3);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_04() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 3, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_05() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.RIGHT, 1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDoubleClick_06() {
+        IEventType eventType1 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDoubleClick(MouseButtonInteraction.Button.LEFT, 1, 2);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_01() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_02() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(1, 2, 3, 4);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_03() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(5, 2, 3, 4);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_04() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(1, 5, 3, 4);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_05() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(1, 2, 5, 4);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_06() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(1, 2, 3, 5);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_MouseDragAndDrop_07() {
+        IEventType eventType1 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new MouseDragAndDrop(1, 2, 3, 4);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_Scroll_01() {
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_Scroll_02() {
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new Scroll(1, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_Scroll_03() {
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new Scroll(3, 2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_Scroll_04() {
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new Scroll(1, 3);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_Scroll_05() {
+        IEventType eventType1 = new Scroll(1, 2);
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new Scroll(1, 2);
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextInput_01() {
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        List<Event> textInputEvents1 = new ArrayList<Event>();
+        textInputEvents1.add(new Event(eventType1, eventTarget1));
+        eventType1 = new TextInput("enteredText1", textInputEvents1);
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextInput_02() {
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        List<Event> textInputEvents1 = new ArrayList<Event>();
+        textInputEvents1.add(new Event(eventType1, eventTarget1));
+        eventType1 = new TextInput("enteredText1", textInputEvents1);
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new TextInput("enteredText1", textInputEvents1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextInput_03() {
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        List<Event> textInputEvents1 = new ArrayList<Event>();
+        textInputEvents1.add(new Event(eventType1, eventTarget1));
+        eventType1 = new TextInput("enteredText1", textInputEvents1);
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        List<Event> textInputEvents2 = new ArrayList<Event>();
+        textInputEvents2.add(new Event(eventType2, eventTarget1));
+        eventType2 = new TextInput("enteredText1", textInputEvents2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+
+        assertSyntacticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextInput_04() {
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        List<Event> textInputEvents1 = new ArrayList<Event>();
+        textInputEvents1.add(new Event(eventType1, eventTarget1));
+        eventType1 = new TextInput("enteredText1", textInputEvents1);
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new StringEventType("eventType2");
+        List<Event> textInputEvents2 = new ArrayList<Event>();
+        textInputEvents2.add(new Event(eventType2, eventTarget1));
+        eventType2 = new TextInput("enteredText2", textInputEvents2);
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextInput_05() {
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        List<Event> textInputEvents1 = new ArrayList<Event>();
+        textInputEvents1.add(new Event(eventType1, eventTarget1));
+        eventType1 = new TextInput("enteredText1", textInputEvents1);
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType1, eventTarget2);
+
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextSelection_01() {
+        IEventType eventType1 = new TextSelection();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextSelection_02() {
+        IEventType eventType1 = new TextSelection();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new TextSelection();
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_TextSelection_03() {
+        IEventType eventType1 = new TextSelection();
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+
+        IEventType eventType2 = new TextSelection();
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_ValueSelection_01() {
+        IEventType eventType1 = new ValueSelection<String>("value1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_ValueSelection_02() {
+        IEventType eventType1 = new ValueSelection<String>("value1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new ValueSelection<String>("value1");
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertLexicallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_ValueSelection_03() {
+        IEventType eventType1 = new ValueSelection<String>("value1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new ValueSelection<String>("value2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget1);
+        
+        assertSemanticallyEqual(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_ValueSelection_04() {
+        IEventType eventType1 = new ValueSelection<String>("value1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IEventType eventType2 = new ValueSelection<String>("value1");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        assertUnequal(new GUIEventTaskComparisonRule(), task1, task2);
+    }
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/IterationComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/IterationComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/IterationComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,292 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.IterationComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class IterationComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        ITask task1 = createNewIteration();
+        
+        assertTrue(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewIteration();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewSequence();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewSelection();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_01() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IIteration iteration1 = createNewIteration();
+        
+        assertLexicallyEqual(rule, iteration1, iteration1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_02() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        assertLexicallyEqual(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_03() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        setMarkedTask(iteration1, task1);
+        
+        assertUnequal(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_04() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        setMarkedTask(iteration1, task1);
+        setMarkedTask(iteration2, task1);
+        
+        assertLexicallyEqual(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_05() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        setMarkedTask(iteration1, task1);
+        setMarkedTask(iteration1, task2);
+        
+        assertUnequal(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_06() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        ISelection selection1 = createNewSelection();
+        addChild(selection1, task1);
+        setMarkedTask(iteration1, selection1);
+        
+        setMarkedTask(iteration2, task1);
+        
+        assertLexicallyEqual(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_07() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        ISelection selection1 = createNewSelection();
+        addChild(selection1, task1);
+        setMarkedTask(iteration1, selection1);
+        
+        ISelection selection2 = createNewSelection();
+        addChild(selection2, task1);
+        setMarkedTask(iteration2, selection2);
+        
+        assertLexicallyEqual(rule, iteration1, iteration2);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_08() {
+        IterationComparisonRule rule = new IterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        IIteration iteration1 = createNewIteration();
+        IIteration iteration2 = createNewIteration();
+        
+        ISelection selection1 = createNewSelection();
+        addChild(selection1, task1);
+        addChild(selection1, task2);
+        setMarkedTask(iteration1, selection1);
+
+        ISelection selection2 = createNewSelection();
+        addChild(selection2, task2);
+        setMarkedTask(iteration2, selection2);
+        
+        assertLexicallyEqual(rule, iteration1, iteration2);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SelectionComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SelectionComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SelectionComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,239 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.SelectionComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class SelectionComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        ITask task1 = createNewSelection();
+        
+        assertTrue(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewSelection();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewSequence();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewIteration();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_01() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        ISelection selection1 = createNewSelection();
+        assertLexicallyEqual(rule, selection1, selection1);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_02() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        ISelection selection1 = createNewSelection();
+        ISelection selection2 = createNewSelection();
+        
+        assertLexicallyEqual(rule, selection1, selection2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_03() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISelection selection1 = createNewSelection();
+        ISelection selection2 = createNewSelection();
+        
+        addChild(selection1, task1);
+        
+        assertUnequal(rule, selection1, selection2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_04() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISelection selection1 = createNewSelection();
+        ISelection selection2 = createNewSelection();
+        
+        addChild(selection1, task1);
+        addChild(selection2, task1);
+        
+        assertLexicallyEqual(rule, selection1, selection2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_05() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        ISelection selection1 = createNewSelection();
+        ISelection selection2 = createNewSelection();
+        
+        addChild(selection1, task1);
+        addChild(selection2, task2);
+        
+        assertUnequal(rule, selection1, selection2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_06() {
+        SelectionComparisonRule rule = new SelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        ISelection selection1 = createNewSelection();
+        ISelection selection2 = createNewSelection();
+        
+        addChild(selection1, task1);
+        addChild(selection2, task2);
+        
+        ISelection selection3 = createNewSelection();
+        addChild(selection3, task1);
+        assertLexicallyEqual(rule, selection1, selection3);
+        
+        addChild(selection3, task2);
+        assertLexicallyEqual(rule, selection2, selection3);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SequenceComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SequenceComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/SequenceComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,267 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.SequenceComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class SequenceComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        ITask task1 = createNewSequence();
+        
+        assertTrue(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewSequence();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewSelection();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewIteration();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_01() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        ISequence sequence1 = createNewSequence();
+        assertLexicallyEqual(rule, sequence1, sequence1);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_02() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        assertLexicallyEqual(rule, sequence1, sequence2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_03() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        addChild(sequence1, task1);
+        
+        assertUnequal(rule, sequence1, sequence2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_04() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        addChild(sequence1, task1);
+        addChild(sequence2, task1);
+        
+        assertLexicallyEqual(rule, sequence1, sequence2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_05() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        addChild(sequence1, task1);
+        addChild(sequence2, task1);
+        
+        addChild(sequence1, task2);
+        
+        assertUnequal(rule, sequence1, sequence2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_06() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        addChild(sequence1, task1);
+        addChild(sequence2, task1);
+        
+        addChild(sequence1, task2);
+        addChild(sequence2, task2);
+        
+        assertLexicallyEqual(rule, sequence1, sequence2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_compare_07() {
+        SequenceComparisonRule rule = new SequenceComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        IEventType eventType2 = new StringEventType("eventType2");
+        IEventTarget eventTarget2 = new DummyGUIElement("elem2");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        ITask task2 = createNewEventTask(eventType2, eventTarget2);
+        
+        ISequence sequence1 = createNewSequence();
+        ISequence sequence2 = createNewSequence();
+        
+        addChild(sequence1, task1);
+        addChild(sequence1, task2);
+        
+        addChild(sequence2, task2);
+        addChild(sequence2, task1);
+        
+        assertUnequal(rule, sequence1, sequence2);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndIterationComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndIterationComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndIterationComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,289 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskAndIterationComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class TaskAndIterationComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        ITask task1 = createNewSequence();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        ITask task1 = createNewSelection();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        ITask task1 = createNewIteration();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        ITask task1 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewSequence();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_07() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewSelection();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_08() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewOptional();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_09() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewIteration();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_10() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewSelection();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_11() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_12() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewSequence();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_13() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_14() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+
+        ITask task1 = createNewSelection();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_01() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        
+        assertNullEquality(rule, iteration1, task1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_02() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        setMarkedTask(iteration1, task1);
+        
+        assertLexicallyEqual(rule, task1, iteration1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_03() {
+        TaskAndIterationComparisonRule rule = new TaskAndIterationComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        IIteration iteration1 = createNewIteration();
+        
+        ISelection selection1 = createNewSelection();
+        addChild(selection1, task1);
+        setMarkedTask(iteration1, selection1);
+        
+        assertLexicallyEqual(rule, task1, iteration1);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndSelectionComparisonRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndSelectionComparisonRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskAndSelectionComparisonRuleTest.java	(revision 1647)
@@ -0,0 +1,268 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.StringEventType;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskAndSelectionComparisonRule;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+
+/**
+ * @author Patrick Harms
+ */
+public class TaskAndSelectionComparisonRuleTest extends AbstractComparisonRuleTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_01() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        ITask task1 = createNewSequence();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_02() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        ITask task1 = createNewSelection();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_03() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        ITask task1 = createNewIteration();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_04() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        ITask task1 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_05() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_06() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewSequence();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_07() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewIteration();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_08() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        ITask task2 = createNewOptional();
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_09() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSelection();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertTrue(rule.isApplicable(task1, task2));
+        assertTrue(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_10() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewIteration();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_11() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSequence();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_12() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewSequence();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_13() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewIteration();
+        ITask task2 = createNewOptional();
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_isApplicable_14() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+
+        ITask task1 = createNewIteration();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+
+        ITask task2 = createNewEventTask(eventType1, eventTarget1);
+        
+        assertFalse(rule.isApplicable(task1, task2));
+        assertFalse(rule.isApplicable(task2, task1));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_01() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISelection selection1 = createNewSelection();
+        
+        assertNullEquality(rule, task1, selection1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_compare_02() {
+        TaskAndSelectionComparisonRule rule = new TaskAndSelectionComparisonRule();
+        
+        IEventType eventType1 = new StringEventType("eventType1");
+        IEventTarget eventTarget1 = new DummyGUIElement("elem1");
+        ITask task1 = createNewEventTask(eventType1, eventTarget1);
+        
+        ISelection selection1 = createNewSelection();
+        addChild(selection1, task1);
+        
+        assertLexicallyEqual(rule, task1, selection1);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskEqualityTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskEqualityTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/taskequality/TaskEqualityTest.java	(revision 1647)
@@ -0,0 +1,64 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.taskequality;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
+
+/**
+ * @author Patrick Harms
+ */
+public class TaskEqualityTest {
+
+    /**
+     *
+     */
+    @Test
+    public void test() {
+        assertTrue(TaskEquality.IDENTICAL.isAtLeast(TaskEquality.IDENTICAL));
+        assertTrue(TaskEquality.IDENTICAL.isAtLeast(TaskEquality.LEXICALLY_EQUAL));
+        assertTrue(TaskEquality.IDENTICAL.isAtLeast(TaskEquality.SYNTACTICALLY_EQUAL));
+        assertTrue(TaskEquality.IDENTICAL.isAtLeast(TaskEquality.SEMANTICALLY_EQUAL));
+        assertFalse(TaskEquality.IDENTICAL.isAtLeast(TaskEquality.UNEQUAL));
+
+        assertFalse(TaskEquality.LEXICALLY_EQUAL.isAtLeast(TaskEquality.IDENTICAL));
+        assertTrue(TaskEquality.LEXICALLY_EQUAL.isAtLeast(TaskEquality.LEXICALLY_EQUAL));
+        assertTrue(TaskEquality.LEXICALLY_EQUAL.isAtLeast(TaskEquality.SYNTACTICALLY_EQUAL));
+        assertTrue(TaskEquality.LEXICALLY_EQUAL.isAtLeast(TaskEquality.SEMANTICALLY_EQUAL));
+        assertFalse(TaskEquality.LEXICALLY_EQUAL.isAtLeast(TaskEquality.UNEQUAL));
+
+        assertFalse(TaskEquality.SYNTACTICALLY_EQUAL.isAtLeast(TaskEquality.IDENTICAL));
+        assertFalse(TaskEquality.SYNTACTICALLY_EQUAL.isAtLeast(TaskEquality.LEXICALLY_EQUAL));
+        assertTrue(TaskEquality.SYNTACTICALLY_EQUAL.isAtLeast(TaskEquality.SYNTACTICALLY_EQUAL));
+        assertTrue(TaskEquality.SYNTACTICALLY_EQUAL.isAtLeast(TaskEquality.SEMANTICALLY_EQUAL));
+        assertFalse(TaskEquality.SYNTACTICALLY_EQUAL.isAtLeast(TaskEquality.UNEQUAL));
+
+        assertFalse(TaskEquality.SEMANTICALLY_EQUAL.isAtLeast(TaskEquality.IDENTICAL));
+        assertFalse(TaskEquality.SEMANTICALLY_EQUAL.isAtLeast(TaskEquality.LEXICALLY_EQUAL));
+        assertFalse(TaskEquality.SEMANTICALLY_EQUAL.isAtLeast(TaskEquality.SYNTACTICALLY_EQUAL));
+        assertTrue(TaskEquality.SEMANTICALLY_EQUAL.isAtLeast(TaskEquality.SEMANTICALLY_EQUAL));
+        assertFalse(TaskEquality.SEMANTICALLY_EQUAL.isAtLeast(TaskEquality.UNEQUAL));
+
+        assertFalse(TaskEquality.UNEQUAL.isAtLeast(TaskEquality.IDENTICAL));
+        assertFalse(TaskEquality.UNEQUAL.isAtLeast(TaskEquality.LEXICALLY_EQUAL));
+        assertFalse(TaskEquality.UNEQUAL.isAtLeast(TaskEquality.SYNTACTICALLY_EQUAL));
+        assertFalse(TaskEquality.UNEQUAL.isAtLeast(TaskEquality.SEMANTICALLY_EQUAL));
+        assertTrue(TaskEquality.UNEQUAL.isAtLeast(TaskEquality.UNEQUAL));
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/AbstractTemporalRelationshipTC.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/AbstractTemporalRelationshipTC.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/AbstractTemporalRelationshipTC.java	(revision 1647)
@@ -0,0 +1,243 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Stack;
+import java.util.logging.Level;
+
+import org.junit.Before;
+
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeChecker;
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeDecoder;
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeEncoder;
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeValidator;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstanceList;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.TextConsole;
+
+/**
+ * @version $Revision: $ $Date: 28.04.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+public class AbstractTemporalRelationshipTC {
+
+    /** */
+    private ITaskBuilder taskBuilder = new TaskBuilder();
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+    
+    /** */
+    private TaskTreeDecoder decoder = null;
+
+    /** */
+    private TaskTreeEncoder encoder = new TaskTreeEncoder();
+    
+    /**
+     *
+     */
+    @Before
+    public void setUp() {
+        Console.reset();
+        new TextConsole(Level.FINEST);
+        
+        decoder = new TaskTreeDecoder(taskFactory, taskBuilder);
+    }
+
+    /**
+     *
+     */
+    protected void applyRule(Class<? extends ITaskInstanceScopeRule> ruleClass,
+                             String                                  inputSpec,
+                             String                                  expectedOutputSpec)
+    {
+        ITaskInstanceScopeRule rule = null;
+        
+        CONSTRUCTOR_ITERATION:
+        for (Constructor<?> constructor : ruleClass.getDeclaredConstructors()) {
+            List<Object> parameters = new LinkedList<Object>();
+            
+            for (Class<?> type : constructor.getParameterTypes()) {
+                if (ITaskFactory.class.equals(type)) {
+                    parameters.add(taskFactory);
+                }
+                else if (ITaskBuilder.class.equals(type)) {
+                    parameters.add(taskBuilder);
+                }
+                else if (TaskEquality.class.equals(type)) {
+                    parameters.add(TaskEquality.LEXICALLY_EQUAL);
+                }
+                else {
+                    continue CONSTRUCTOR_ITERATION;
+                }
+            }
+            
+            try {
+                rule = (ITaskInstanceScopeRule) constructor.newInstance(parameters.toArray());
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (InstantiationException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (IllegalAccessException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (InvocationTargetException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+        }
+        
+        if (rule == null) {
+            fail("no matching constructor found to instantiate rule " + ruleClass);
+        }
+        
+        RuleApplicationResult result;
+        RuleApplicationStatus status;
+        
+        ITaskInstance inputList = (ITaskInstance) decoder.decode(inputSpec);
+        
+        Stack<ITaskInstance> toBeAppliedOn = new Stack<ITaskInstance>();
+        toBeAppliedOn.push(inputList);
+        
+        do {
+            result = rule.apply(toBeAppliedOn.peek());
+            
+            if (result != null) {
+                status = result.getRuleApplicationStatus();
+                assertNotNull(status);
+            }
+            else {
+                status = RuleApplicationStatus.NOT_APPLIED;
+            }
+            
+            if ((result != null) && (result.getNewlyCreatedTaskInstances() != null)) {
+                for (int i = result.getNewlyCreatedTaskInstances().size() - 1; i >= 0; i--) {
+                    toBeAppliedOn.push(result.getNewlyCreatedTaskInstances().get(i));
+                }
+            }
+            
+            if (status == RuleApplicationStatus.NOT_APPLIED) {
+                toBeAppliedOn.pop();
+            }
+            
+        }
+        while ((!toBeAppliedOn.isEmpty()) || (status == RuleApplicationStatus.FINISHED));
+
+        ITaskInstance expectedList = (ITaskInstance) decoder.decode(expectedOutputSpec);
+        
+        new TaskTreeChecker().assertTaskInstancesEqual(expectedList, inputList);
+    }
+
+    /**
+     *
+     */
+    protected void applySessionScopeRule(Class<? extends ISessionScopeRule> ruleClass,
+                                         String                             inputSpec,
+                                         String                             expectedOutputSpec)
+    {
+        ISessionScopeRule rule = null;
+        
+        CONSTRUCTOR_ITERATION:
+        for (Constructor<?> constructor : ruleClass.getDeclaredConstructors()) {
+            List<Object> parameters = new LinkedList<Object>();
+            
+            for (Class<?> type : constructor.getParameterTypes()) {
+                if (ITaskFactory.class.equals(type)) {
+                    parameters.add(taskFactory);
+                }
+                else if (ITaskBuilder.class.equals(type)) {
+                    parameters.add(taskBuilder);
+                }
+                else if (TaskEquality.class.equals(type)) {
+                    parameters.add(TaskEquality.LEXICALLY_EQUAL);
+                }
+                else {
+                    continue CONSTRUCTOR_ITERATION;
+                }
+            }
+            
+            try {
+                rule = (ISessionScopeRule) constructor.newInstance(parameters.toArray());
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (InstantiationException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (IllegalAccessException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+            catch (InvocationTargetException e) {
+                e.printStackTrace();
+                fail("could not invoke the constructor " + constructor);
+            }
+        }
+        
+        if (rule == null) {
+            fail("no matching constructor found to instantiate rule " + ruleClass);
+        }
+        
+        ITaskInstanceList inputList = decoder.decode(inputSpec);
+        
+        assertTrue(inputList instanceof IUserSession);
+        
+        List<IUserSession> sessionList = new LinkedList<IUserSession>();
+        sessionList.add((IUserSession) inputList);
+        
+        System.out.println("Input:");
+        encoder.encode(inputList, System.out);
+        
+        RuleApplicationResult result = rule.apply(sessionList);
+        
+        assertNotNull(result);
+        assertNotNull(result.getRuleApplicationStatus());
+            
+        ITaskInstanceList expectedList = decoder.decode(expectedOutputSpec);
+        
+        System.out.println("\nExpected Result:");
+        encoder.encode(expectedList, System.out);
+        System.out.println("\nResult:");
+        encoder.encode(inputList, System.out);
+
+        new TaskTreeChecker().assertTaskInstanceListsEqual(expectedList, inputList);
+        new TaskTreeValidator().validate(inputList);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleTest.java	(revision 1647)
@@ -0,0 +1,176 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
+
+import org.junit.Test;
+
+/**
+ * @author Patrick Harms
+ */
+public class SequenceForTaskDetectionRuleTest extends AbstractTemporalRelationshipTC {
+
+    /**
+     *
+     */
+    @Test
+    public void test_TaskDetection_01() throws Exception {
+        String input =
+            "UserSession {" +
+            "  Event noise0 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event noise1 {}" +
+            "  Event noise2 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event noise3 {}" +
+            "  Event noise4 {}" +
+            "  Event noise5 {}" +
+            "  Event noise6 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event noise7 {}" +
+            "}";
+
+        String output =
+            "UserSession {" +
+            "  Event noise0 {}" +
+            "  Iteration iteration1 {" +
+            "    Sequence sequence1 {" +
+            "      Event action1 {}" +
+            "      Event action2 {}" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "  }" +
+            "  Event noise1 {}" +
+            "  Event noise2 {}" +
+            "  Iteration iteration1 {" +
+            "    Sequence sequence1 {" +
+            "      Event action1 {}" +
+            "      Event action2 {}" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "  }" +
+            "  Event noise3 {}" +
+            "  Event noise4 {}" +
+            "  Event noise5 {}" +
+            "  Event noise6 {}" +
+            "  Iteration iteration1 {" +
+            "    Sequence sequence1 {" +
+            "      Event action1 {}" +
+            "      Event action2 {}" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "    Sequence sequence1 {" +
+            "      Event action1 {}" +
+            "      Event action2 {}" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "  }" +
+            "  Event noise7 {}" +
+            "}";
+
+        applySessionScopeRule(SequenceForTaskDetectionRule.class, input, output);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_TaskDetection_02() throws Exception {
+        String input =
+            "UserSession {" +
+            "  Event noise0 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event noise1 {}" +
+            "  Event noise2 {}" +
+            "  Event action3 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action4 {}" +
+            "  Event noise3 {}" +
+            "  Event noise4 {}" +
+            "  Event noise5 {}" +
+            "  Event noise6 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event action1 {}" +
+            "  Event action2 {}" +
+            "  Event action3 {}" +
+            "  Event action4 {}" +
+            "  Event noise7 {}" +
+            "}";
+
+        String output =
+            "UserSession {" +
+            "  Event noise0 {}" +
+            "  Sequence sequence1 {" +
+            "    Event action1 {}" +
+            "    Event action2 {}" +
+            "  }" +
+            "  Event noise1 {}" +
+            "  Event noise2 {}" +
+            "  Event action3 {}" +
+            "  Sequence sequence1 {" +
+            "    Event action1 {}" +
+            "    Event action2 {}" +
+            "  }" +
+            "  Event action4 {}" +
+            "  Event noise3 {}" +
+            "  Event noise4 {}" +
+            "  Event noise5 {}" +
+            "  Event noise6 {}" +
+            "  Iteration iteration1 {" +
+            "    Sequence sequence3 {" +
+            "      Sequence sequence1 {" +
+            "        Event action1 {}" +
+            "        Event action2 {}" +
+            "      }" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "    Sequence sequence3 {" +
+            "      Sequence sequence1 {" +
+            "        Event action1 {}" +
+            "        Event action2 {}" +
+            "      }" +
+            "      Event action3 {}" +
+            "      Event action4 {}" +
+            "    }" +
+            "  }" +
+            "  Event noise7 {}" +
+            "}";
+
+        applySessionScopeRule(SequenceForTaskDetectionRule.class, input, output);
+    }
+
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceTrieTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceTrieTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceTrieTest.java	(revision 1647)
@@ -0,0 +1,1712 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.*;
+
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeDecoder;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+import de.ugoe.cs.autoquest.usageprofiles.TrieProcessor;
+
+import static org.junit.Assert.*;
+
+/**
+ * The class <code>TaskInstanceTrieTest</code> contains tests for the class
+ * <code>{@link TaskInstanceTrie}</code>.
+ * 
+ * @author Patrick Harms
+ * @version 1.0
+ */
+public class TaskInstanceTrieTest {
+
+    /** */
+    private ITaskBuilder taskBuilder = new TaskBuilder();
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+    
+    /** */
+    private TaskTreeDecoder decoder = new TaskTreeDecoder(taskFactory, taskBuilder);
+    
+    /** */
+    private TaskHandlingStrategy strategy =
+        new TaskHandlingStrategy(TaskEquality.IDENTICAL);
+    
+    /** */
+    private IUserSession session = (IUserSession) decoder.decode
+         ("UserSession {" +
+          "  Event actionA {}" +
+          "  Event actionB {}" +
+          "  Event actionR {}" +
+          "  Event actionA {}" +
+          "  Event actionC {}" +
+          "  Event actionA {}" +
+          "  Event actionD {}" +
+          "  Event actionA {}" +
+          "  Event actionB {}" +
+          "  Event actionR {}" +
+          "  Event actionA {}" +
+          "}");
+
+    /**
+     * 
+     */
+    private static void assertCollectionContent(Collection<?> c1, Collection<?> c2) {
+        assertEquals(c1.size(), c2.size());
+        for (Object obj : c1) {
+            assertTrue(c2.contains(obj));
+        }
+    }
+
+    @Test
+    public void testTaskInstanceTaskInstanceTrie_1() throws Exception {
+        TaskInstanceTrie result = new TaskInstanceTrie(strategy);
+
+        assertNotNull(result);
+        assertEquals(0, result.getNumLeafs());
+        assertEquals(0, result.getNumSymbols());
+        assertEquals(0, result.getNumLeafAncestors());
+        assertTrue(result.getKnownSymbols().isEmpty());
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testTaskInstanceTrie_2() throws Exception {
+        new TaskInstanceTrie((TaskHandlingStrategy) null);
+    }
+
+    @Test
+    public void testTrainSessions_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action3 {}" +
+             "  Event action4 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 2);
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
+        
+        // subsequences of length 1 are not trained. So for the single item sequence of the last
+        // task, the count must be 0
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        // this must return 0 as we only trained shorter sequences
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task, is not counted
+        assertEquals(3, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_2() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 2);
+        
+        for (int i = 0; i < session.size(); i++) {
+            // subsequences of length 1 are not trained. So the single item sequence of the last
+            // task is not counted. Therefore, the result must be 3
+            assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
+            
+            for (int j = 0; j < session.size(); j++) {
+                assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
+            }
+        }
+            
+        // this must return 0 as we only trained shorter sequences
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        
+        assertEquals(1, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_3() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 2);
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task is not counted. Therefore, the result must be 3
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        // this must return 0 as we only trained shorter sequences
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        
+        assertEquals(2, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_4() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action3 {}" +
+             "  Event action4 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 3);
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
+        
+        // subsequences of length 1 are not trained. So for the single item sequence of the last
+        // task, the count must be 0
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
+                                                       session.get(3))));
+        
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task, is not counted
+        assertEquals(3, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_5() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 3);
+        
+        for (int i = 0; i < session.size(); i++) {
+            // subsequences of length 1 are not trained. So the single item sequence of the last
+            // task is not counted. Therefore, the result must be 3
+            assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
+            
+            for (int j = 0; j < session.size(); j++) {
+                assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
+                
+                for (int k = 0; k < session.size(); k++) {
+                    assertEquals(2, fixture.getCount(Arrays.asList(session.get(i), session.get(j),
+                                                                   session.get(k))));                    
+                }
+            }
+        }
+            
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_6() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 3);
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task is not counted. Therefore, the result must be 3
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
+                                                       session.get(3))));
+        
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        assertEquals(2, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_7() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action3 {}" +
+             "  Event action4 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 4);
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
+        
+        // subsequences of length 1 are not trained. So for the single item sequence of the last
+        // task, the count must be 0
+        assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
+                                                       session.get(3))));
+        
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task, is not counted
+        assertEquals(3, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_8() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "  Event action1 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 4);
+        
+        for (int i = 0; i < session.size(); i++) {
+            // subsequences of length 1 are not trained. So the single item sequence of the last
+            // task is not counted. Therefore, the result must be 3
+            assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
+            
+            for (int j = 0; j < session.size(); j++) {
+                assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
+                
+                for (int k = 0; k < session.size(); k++) {
+                    assertEquals(2, fixture.getCount(Arrays.asList(session.get(i), session.get(j),
+                                                                   session.get(k))));                    
+                }
+            }
+        }
+            
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getNumSymbols());
+    }
+
+    @Test
+    public void testTrainSessions_9() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        IUserSession session = (IUserSession) decoder.decode
+            ("UserSession {" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "  Event action1 {}" +
+             "  Event action2 {}" +
+             "}");
+        
+        fixture.trainSessions(Arrays.asList(session), 4);
+        
+        // subsequences of length 1 are not trained. So the single item sequence of the last
+        // task is not counted. Therefore, the result must be 3
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
+        
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
+        assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
+        
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2))));
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
+                                                       session.get(3))));
+        
+        // we only trained shorter sequences, so we expect a count of 0 for longer ones
+        assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
+                                                       session.get(2), session.get(3))));
+        
+        assertEquals(2, fixture.getNumSymbols());
+    }
+
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur most often
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 0);
+
+        assertEquals(1, result.size());
+        
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0));
+        
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_2() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+        
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur exactly once
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 1);
+
+        assertEquals(11, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        // rac
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        // ac
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // aca
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(4)); //c
+        // c
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // ca
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(6)); //d
+        // cad
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(6)); //d
+        // ad
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // ada
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(6)); //d
+        // d
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // da
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(1)); //b
+        // dab
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_3() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur exactly twice
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 2);
+
+        assertEquals(7, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(1)); //b
+        // ab
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(2)); //r
+        // abr
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(1)); //b
+        // b
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(2)); //r
+        // br
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // bra
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(2)); //r
+        // r
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // ra
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_4() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur exactly three times
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 3);
+
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_5() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur exactly four times
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 4);
+
+        // as we did not train the last single action, we may expect the "a" action only 4 times
+        assertEquals(1, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0)); //a
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_6() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of one that occur exactly five times
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(1, 5);
+
+        // as we did not train the last single action, we may expect the "a" action only 4 times
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_7() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of two that occur most often
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(2, 0);
+
+        assertEquals(5, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(1)); //b
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(2)); //r
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(1)); //b
+        expected.add(session.get(2)); //r
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_8() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of two that occur exactly once
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(2, 1);
+
+        assertEquals(9, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        // rac
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        // ac
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // aca
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(4)); //c
+        expected.add(session.get(0)); //a
+        // ca
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(6)); //d
+        // cad
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(6)); //d
+        // ad
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // ada
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(6)); //d
+        expected.add(session.get(0)); //a
+        // da
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(1)); //b
+        // dab
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_9() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of two that occur exactly twice
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(2, 2);
+
+        assertEquals(5, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(1)); //b
+        // ab
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(2)); //r
+        // abr
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(1)); //b
+        expected.add(session.get(2)); //r
+        // br
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.add(session.get(0)); //a
+        // bra
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        // ra
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_10() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+               
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of two that occur exactly three times
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(2, 3);
+
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_11() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of three that occur most often
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(3, 0);
+
+        assertEquals(2, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(1)); //b
+        expected.add(session.get(2)); //r
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(1)); //b
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_12() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of three that occur exactly once
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(3, 1);
+
+        assertEquals(5, result.size());
+
+        List<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(2)); //r
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        // rac
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(4)); //c
+        expected.add(session.get(0)); //a
+        // aca
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(4)); //c
+        expected.add(session.get(0)); //a
+        expected.add(session.get(6)); //d
+        // cad
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(0)); //a
+        expected.add(session.get(6)); //d
+        expected.add(session.get(0)); //a
+        // ada
+        assertContains((List<List<ITaskInstance>>) result, expected);
+
+        expected.clear();
+        expected.add(session.get(6)); //d
+        expected.add(session.get(0)); //a
+        expected.add(session.get(1)); //b
+        // dab
+        assertContains((List<List<ITaskInstance>>) result, expected);
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_13() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of four that occur most often
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(4, 0);
+
+        // none of these exist, as the tree is only trained with sequences of length 3
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetSequencesWithMostOccurrences_14() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                    
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        // get all sequences with a minimal length of four that occur exactly once
+        Collection<List<ITaskInstance>> result = fixture.getSequencesWithOccurrenceCount(4, 1);
+
+        // none of these exist, as the tree is only trained with sequences of length 3
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetCount_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                        
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(session.get(0)); //a
+
+        int result = fixture.getCount(subSequence);
+
+        // as we did not train the last single action, we may expect the "a" action only 4 times
+        assertEquals(4, result);
+    }
+
+    @Test
+    public void testGetCount_2() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(session.get(0)); //a
+        subSequence.add(session.get(1)); //b
+
+        int result = fixture.getCount(subSequence);
+
+        assertEquals(2, result);
+    }
+
+    @Test
+    public void testGetCount_3() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(taskFactory.createNewTaskInstance(taskFactory.createNewSequence()));
+
+        int result = fixture.getCount(subSequence);
+
+        assertEquals(0, result);
+    }
+
+    @Test
+    public void testGetCount_4() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+
+        int result = fixture.getCount(subSequence, session.get(0)); //a
+
+        // as we did not train the last single action, we may expect the "a" action only 4 times
+        assertEquals(4, result);
+    }
+
+    @Test
+    public void testGetCount_5() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(session.get(0)); //a
+        subSequence.add(session.get(1)); //b
+
+        int result = fixture.getCount(subSequence, session.get(2)); //r
+
+        assertEquals(2, result);
+    }
+
+    @Test
+    public void testGetCount_6() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+
+        int result = fixture.getCount
+            (subSequence, taskFactory.createNewTaskInstance(taskFactory.createNewSequence()));
+
+        assertEquals(0, result);
+    }
+
+    @Test
+    public void testGetFollowingSymbols_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                    
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(session.get(0)); //a
+        Collection<ITaskInstance> expected = new ArrayList<ITaskInstance>();
+        expected.add(session.get(1)); //b
+        expected.add(session.get(4)); //c
+        expected.add(session.get(6)); //d
+
+        Collection<ITaskInstance> result = fixture.getFollowingSymbols(subSequence);
+
+        assertCollectionContent(expected, result);
+    }
+
+    @Test
+    public void testGetFollowingSymbols_2() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                        
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(session.get(0)); //a
+        subSequence.add(session.get(1)); //b
+        subSequence.add(session.get(2)); //r
+
+        Collection<ITaskInstance> result = fixture.getFollowingSymbols(subSequence);
+
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetFollowingSymbols_3() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                        
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        List<ITaskInstance> subSequence = new ArrayList<ITaskInstance>();
+        subSequence.add(taskFactory.createNewTaskInstance(taskFactory.createNewSequence()));
+
+        Collection<ITaskInstance> result = fixture.getFollowingSymbols(subSequence);
+
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetNumLeafAncestors_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        int result = fixture.getNumLeafAncestors();
+
+        assertEquals(7, result);
+    }
+
+    @Test
+    public void testGetNumLeafs_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+        int result = fixture.getNumLeafs();
+
+        assertEquals(7, result);
+    }
+
+    @Test
+    public void testGetNumSymbols_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+                                            
+        fixture.trainSessions(Arrays.asList(session), 3);
+
+
+        int result = fixture.getNumSymbols();
+
+        assertEquals(5, result);
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_1() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 2;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 50, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 50 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_2() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 2;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_3() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 2;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(30, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 30 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_4() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 2;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(300, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 300 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_5() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 2;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_6() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 50, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 50 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_7() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_8() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(30, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 30 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_9() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(300, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 300 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_10() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_11() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 4;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 50, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 50 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_12() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 4;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_13() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 4;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(30, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 30 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_14() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 4;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(300, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 300 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_15() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 4;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_16() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 5;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 50, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 50 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_17() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 5;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_18() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 5;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(30, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 30 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_19() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 5;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(300, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 300 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_20() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 5;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_21() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 6;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 50, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 50 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_22() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 6;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(3, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 3 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_23() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 6;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(30, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 30 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_24() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 6;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(300, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 300 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_25() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 6;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 10000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 10000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    @Test
+    public void testLargeTaskInstanceTrie_26() throws Exception {
+        TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
+
+        int order = 3;
+        
+        TaskInstanceTrieTester tester = new TaskInstanceTrieTester(1000, 100000, order);
+
+        long start = System.currentTimeMillis();
+        fixture.trainSessions(Arrays.asList(tester.userSession), order);
+        System.out.println("testing session with 100000 task instances and 1000 symbols took " +
+                           (System.currentTimeMillis() - start) + "ms");
+        
+        fixture.process(tester);
+        
+        // do not check if counts is empty, as some sequences may not be part of the reduced trie
+        // and may therefore not be processed by the tester.
+        //assertTrue(tester.counts.isEmpty());
+    }
+
+    /**
+     * 
+     */
+    private void assertContains(List<List<ITaskInstance>> listOfList,
+                                List<ITaskInstance>       containedList)
+    {
+        boolean found = false;
+        for (List<ITaskInstance> candidate : listOfList) {
+            if (candidate.size() == containedList.size()) {
+                found = true;
+                for (int i = 0; i < containedList.size(); i++) {
+                    if (!strategy.getTaskComparator().equals(candidate.get(0), containedList.get(0))) {
+                        found = false;
+                        break;
+                    }
+                }
+                
+                if (found) {
+                    break;
+                }
+            }
+        }
+            
+        assertTrue(found);
+    }
+
+    public static void main(String[] args) {
+        new org.junit.runner.JUnitCore().run(TaskInstanceTrieTest.class);
+    }
+    
+    /**
+     * <p>
+     * class internally used for testing large tries.
+     * </p>
+     * 
+     * @author Patrick Harms
+     */
+    private class TaskInstanceTrieTester implements TrieProcessor<ITaskInstance> {
+        
+        /**
+         * the symbols used for testing the trie
+         */
+        private Map<Integer, ITaskInstance> symbols = new HashMap<Integer, ITaskInstance>();
+
+        /**
+         * the simulated sequence
+         */
+        private IUserSession userSession;
+
+        /**
+         * the trained order of the tested trie
+         */
+        private int maxOrder;
+        
+        /**
+         * the expected counts of subsequences
+         */
+        private Map<Long, Integer> counts = new HashMap<Long, Integer>();
+        
+        /**
+         * the maximal observed count of a subsequence
+         */
+        private int maxCount = 0;
+
+        /**
+         * generates a simulated sequence and thereby stores the expected counts of the
+         * subsequences up to max order in a map. The technique uses integer and long values
+         * to be efficient and to allow testing with large sequences and symbol numbers. However,
+         * the technique is restricted to 1024 different symbols and a maximum tree depth of 6.
+         * The tester is also used as a trie processor to check for any node in the tree, if the
+         * trie calculated the count correctly and if it did not create too many nodes.
+         */
+        public TaskInstanceTrieTester(int noOfSymbols, int sequenceLength, int maxOrder) {
+            if (noOfSymbols > 1024) {
+                throw new IllegalArgumentException("too large number of symbols");
+            }
+            if (maxOrder > 6) {
+                throw new IllegalArgumentException("too large number of symbols");
+            }
+            
+            StringBuffer dummyUserSessionDef = new StringBuffer("UserSession {");
+            for (int i = 0; i < noOfSymbols; i++) {
+                dummyUserSessionDef.append("  Event action");
+                dummyUserSessionDef.append(i);
+                dummyUserSessionDef.append(" {}");
+            }
+            dummyUserSessionDef.append("}");
+            
+            IUserSession dummySession =
+                (IUserSession) decoder.decode(dummyUserSessionDef.toString());
+            
+            for (int i = 0; i < dummySession.size(); i++) {
+                this.symbols.put(i, dummySession.get(i));
+            }
+            
+            this.maxOrder = maxOrder;
+            
+            dummyUserSessionDef = new StringBuffer("UserSession {");
+            int[] symbolIds = new int[sequenceLength];
+
+            for (int i = 0; i < sequenceLength; i++) {
+                int symbolIndex = (int) (Math.random() * noOfSymbols);
+                dummyUserSessionDef.append("  Event action");
+                dummyUserSessionDef.append(symbolIndex);
+                dummyUserSessionDef.append(" {}");
+                
+                symbolIds[i] = symbolIndex;
+                
+                if ((i - maxOrder + 1) >= 0) {
+                    storeCounts(symbolIds, i - maxOrder + 1, i);
+                }
+            }
+            dummyUserSessionDef.append("}");
+            
+            this.userSession = (IUserSession) decoder.decode(dummyUserSessionDef.toString());
+            
+            for (int i = sequenceLength - maxOrder + 1; i < sequenceLength; i++) {
+                storeCounts(symbolIds, i, sequenceLength - 1);
+            }
+        }
+
+        /**
+         * <p>
+         * stores the counts for the subsequence denoted by the start and end index (inclusive).
+         * </p>
+         */
+        private void storeCounts(int[] sequence, int startIndex, int endIndex) {
+            long key = 0;
+            
+            for (int i = startIndex; i <= endIndex; i++) {
+                key = key << 10;
+                key += 1 + sequence[i];
+            
+                Integer count = this.counts.get(key);
+                if (count == null) {
+                    count = 0;
+                }
+            
+                //System.out.println(key + "  " + (count + 1));
+                
+                count++;
+                this.counts.put(key, count);
+                
+                maxCount = Math.max(count, maxCount);
+            }
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.usageprofiles.TaskInstanceTrieProcessor#process(List, int)
+         */
+        @Override
+        public TrieProcessor.Result process(List<ITaskInstance> sequence, int count) {
+            long key = 0;
+            
+            for (ITaskInstance symbol : sequence) {
+                int symbolIndex = -1;
+                
+                for (Map.Entry<Integer, ITaskInstance> entry : symbols.entrySet()) {
+                    if (strategy.getTaskComparator().equals(entry.getValue(), symbol)) {
+                        symbolIndex = entry.getKey();
+                        break;
+                    }
+                }
+                
+                assertTrue("could not find symbol", symbolIndex > -1);
+                
+                key = key << 10;
+                key += 1 + symbolIndex;
+            }
+            
+            Integer expectedCount = this.counts.remove(key);
+            assertNotNull(expectedCount);
+            
+            if (count == maxCount) {
+                assertEquals(expectedCount.intValue(), count);
+            }
+            else {
+                assertTrue(count < maxCount);
+            }
+            
+            assertTrue(sequence.size() <= this.maxOrder);
+            
+            return TrieProcessor.Result.CONTINUE;
+        }
+
+    }
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolBucketedMapTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolBucketedMapTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolBucketedMapTest.java	(revision 1647)
@@ -0,0 +1,1091 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+import de.ugoe.cs.autoquest.test.DummyInteraction;
+import de.ugoe.cs.autoquest.usageprofiles.SymbolMap;
+
+/**
+ * <p>
+ * The class <code>SymbolMapTest</code> contains tests for the class
+ * <code>{@link SymbolMap}</code>.
+ * </p>
+ * 
+ * @author Patrick Harms
+ */
+public class TaskSymbolBucketedMapTest {
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+    
+    /** */
+    Map<String, ITask> tasks = new HashMap<String, ITask>();
+    
+    @Before
+    public void setUp() {
+        tasks = new HashMap<String, ITask>();
+    }
+    
+    @Test
+    public void testSymbolMap_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        assertNotNull(symbolMap);
+        assertEquals(0, symbolMap.size());
+    }
+
+    @Test
+    public void testSymbolMap_2() {
+        TaskSymbolBucketedMap<String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        ITaskInstance taskInstance = createTaskInstance("symbol");
+        symbolMap1.addSymbol(taskInstance, "value");
+        
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>(symbolMap1);
+        
+        assertNotNull(symbolMap2);
+        assertSymbolMapEntries(symbolMap2, new ITaskInstance[] { taskInstance },
+                               new String[] { "value" });
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testSymbolMap_3() throws Exception {
+        new TaskSymbolBucketedMap<String>((TaskSymbolBucketedMap<String>) null);
+    }
+    
+    @Test
+    public void testAddSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        ITaskInstance taskInstance = createTaskInstance("symbol");
+        symbolMap.addSymbol(taskInstance, "value1");
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, new ITaskInstance[] { taskInstance },
+                               new String[] { "value1" });
+    }
+    
+    @Test
+    public void testAddSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        ITaskInstance[] symbols = new ITaskInstance[entryCount];
+        String[] values = new String[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbols[i] = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(symbols[i], "value" + i);
+            values[i] = "value" + i;
+        }
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, symbols, values);
+    }
+    
+    @Test
+    public void testAddSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        ITaskInstance[] symbols = new ITaskInstance[entryCount];
+        String[] values = new String[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbols[i] = createTaskInstance("symbol" + i);
+            if (i % 7 == 0) {
+                values[i] = "value" + i;
+            }
+            else {
+                values[i] = null;
+            }
+            
+            symbolMap.addSymbol(symbols[i], values[i]);
+        }
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, symbols, values);
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testAddSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(null, null);
+    }    
+    
+    @Test
+    public void testSize_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertEquals(1, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        assertEquals(entryCount, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        assertEquals(entryCount, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        assertEquals(2 * 150, symbolMap.size());
+    }
+    
+    @Test
+    public void testIsEmpty_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertTrue(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testContainsSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertFalse(symbolMap.containsSymbol(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testContainsSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testContainsSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testContainsSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testContainsSymbol_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertFalse(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testContainsSymbol_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.containsSymbol(null);
+    }    
+
+    @Test
+    public void testGetValue_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertNull(symbolMap.getValue(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testGetValue_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.getValue(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testGetValue_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNull(symbolMap.getValue(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testGetValue_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testGetValue_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+            }
+            else {
+                assertNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+            }
+        }
+    }
+    
+    @Test
+    public void testGetValue_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testGetValue_7() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.getValue(null);
+    }    
+
+    @Test
+    public void testRemoveSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertNull(symbolMap.removeSymbol(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testRemoveSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol1")));
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNull(symbolMap.removeSymbol(createTaskInstance("symbol1")));
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+            }
+            else {
+                assertNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+            }
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testRemoveSymbol_7() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.removeSymbol(null);
+    }    
+   
+    @Test
+    public void testGetSymbols_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(0, symbolMap.getSymbols().size());
+    }
+    
+    @Test
+    public void testGetSymbols_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+         
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap.addSymbol(task, "value1");
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(1, symbolMap.getSymbols().size());
+        assertEquals(task, symbolMap.getSymbols().iterator().next());
+    }
+    
+    @Test
+    public void testGetSymbols_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap.addSymbol(task, null);
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(1, symbolMap.getSymbols().size());
+        assertEquals(task, symbolMap.getSymbols().iterator().next());
+    }
+    
+    @Test
+    public void testGetSymbols_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        Set<ITaskInstance> expectedSymbols = new HashSet<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(task, "value" + i);
+            expectedSymbols.add(task);
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(entryCount, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetSymbols_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        Set<ITaskInstance> expectedSymbols = new HashSet<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(task, "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(task, null);
+            }
+            
+            expectedSymbols.add(task);
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(entryCount, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetSymbols_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        List<ITaskInstance> expectedSymbols = new ArrayList<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(task, "value" + i);
+            expectedSymbols.add(task);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(expectedSymbols.remove(150));
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(2 * 150, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < 2 * 150; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        assertNotNull(symbolMap.getValues());
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testGetValues_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(1, symbolMap.getValues().size());
+        assertEquals("value1", symbolMap.getValues().iterator().next());
+    }
+    
+    @Test
+    public void testGetValues_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(1, symbolMap.getValues().size());
+        assertNull(symbolMap.getValues().iterator().next());
+    }
+    
+    @Test
+    public void testGetValues_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            expectedValues.add("value" + i);
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(entryCount, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+                expectedValues.add("value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+                expectedValues.add(null);
+            }
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(entryCount, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            expectedValues.add("value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+            expectedValues.remove("value" + i);
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(2 * 150, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < 2 * 150; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testClear_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testEquals_1() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        assertTrue(symbolMap1.equals(symbolMap2));
+    }
+    
+    @Test
+    public void testEquals_2() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        symbolMap1.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertFalse(symbolMap1.equals(symbolMap2));
+    }
+    
+    @Test
+    public void testEquals_3() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+            
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap1.addSymbol(task, "value1");
+        symbolMap2.addSymbol(task, "value1");
+        
+        assertTrue(symbolMap1.equals(symbolMap2));
+    }
+
+    @Test
+    public void testEquals_4() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+                
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 1000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol1");
+            symbolMap1.addSymbol(task, "value" + i);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.addSymbol(task, "value" + i);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+    }
+    
+    @Test
+    public void testEquals_5() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+               
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 1000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            if (i % 7 == 0) {
+                symbolMap1.addSymbol(task, "value" + i);
+                assertFalse(symbolMap1.equals(symbolMap2));
+                symbolMap2.addSymbol(task, "value" + i);
+                assertTrue(symbolMap1.equals(symbolMap2));
+            }
+            else {
+                symbolMap1.addSymbol(task, null);
+                assertFalse(symbolMap1.equals(symbolMap2));
+                symbolMap2.addSymbol(task, null);
+                assertTrue(symbolMap1.equals(symbolMap2));
+            }
+        }
+    }
+    
+    @Test
+    public void testEquals_6() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+                
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolBucketedMap<String>
+            (new TaskInstanceComparator(TaskEquality.SEMANTICALLY_EQUAL));
+        
+        int entryCount = 1000;
+        
+        ITaskInstance[] taskInstances = new ITaskInstance[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            taskInstances[i] = task;
+            symbolMap1.addSymbol(task, "value" + i);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.addSymbol(task, "value" + i);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap1.removeSymbol(taskInstances[i]);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.removeSymbol(taskInstances[i]);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+    }
+    
+    /**
+     *
+     */
+    private ITaskInstance createTaskInstance(String id) {
+        ITask task = tasks.get(id);
+        Event event = null;
+       
+        if (task == null) {
+            event = new Event(new DummyInteraction(id, 0), new DummyGUIElement("default"));
+            task = taskFactory.createNewEventTask(event.toString());
+           
+            tasks.put(id, task);
+        }
+        else {
+            event = ((IEventTaskInstance) task.getInstances().iterator().next()).getEvent();
+        }
+       
+        return taskFactory.createNewTaskInstance((IEventTask) task, event);
+    }
+
+    private void assertSymbolMapEntries(SymbolMap<ITaskInstance, String> symbolMap,
+                                        ITaskInstance[]                  symbols,
+                                        String[]                         values)
+    {
+        assertEquals(symbols.length, symbolMap.size());
+        assertEquals(symbols.length, symbolMap.getSymbols().size());
+        assertEquals(values.length, symbolMap.getValues().size());
+        
+        for (int i = 0; i < symbols.length; i++) {
+            assertTrue(symbolMap.containsSymbol(symbols[i]));
+            assertEquals(values[i], symbolMap.getValue(symbols[i]));
+            assertTrue(symbolMap.getSymbols().contains(symbols[i]));
+            assertTrue(symbolMap.getValues().contains(values[i]));            
+        }
+    }
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolIdentityMapTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolIdentityMapTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskSymbolIdentityMapTest.java	(revision 1647)
@@ -0,0 +1,1095 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+import de.ugoe.cs.autoquest.test.DummyInteraction;
+import de.ugoe.cs.autoquest.usageprofiles.SymbolMap;
+
+/**
+ * <p>
+ * The class <code>SymbolMapTest</code> contains tests for the class
+ * <code>{@link SymbolMap}</code>.
+ * </p>
+ * 
+ * @author Patrick Harms
+ */
+public class TaskSymbolIdentityMapTest {
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+    
+    /** */
+    Map<String, ITask> tasks = new HashMap<String, ITask>();
+    
+    @Before
+    public void setUp() {
+        tasks = new HashMap<String, ITask>();
+    }
+    
+    @Test
+    public void testSymbolMap_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        assertNotNull(symbolMap);
+        assertEquals(0, symbolMap.size());
+    }
+
+    @Test
+    public void testSymbolMap_2() {
+        TaskSymbolIdentityMap<String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+        
+        ITaskInstance taskInstance = createTaskInstance("symbol");
+        symbolMap1.addSymbol(taskInstance, "value");
+        
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>(symbolMap1);
+        
+        assertNotNull(symbolMap2);
+        assertSymbolMapEntries(symbolMap2, new ITaskInstance[] { taskInstance },
+                               new String[] { "value" });
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testSymbolMap_3() throws Exception {
+        new TaskSymbolBucketedMap<String>((TaskSymbolBucketedMap<String>) null);
+    }
+    
+    @Test
+    public void testAddSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        ITaskInstance taskInstance = createTaskInstance("symbol");
+        symbolMap.addSymbol(taskInstance, "value1");
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, new ITaskInstance[] { taskInstance },
+                               new String[] { "value1" });
+    }
+    
+    @Test
+    public void testAddSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        ITaskInstance[] symbols = new ITaskInstance[entryCount];
+        String[] values = new String[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbols[i] = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(symbols[i], "value" + i);
+            values[i] = "value" + i;
+        }
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, symbols, values);
+    }
+    
+    @Test
+    public void testAddSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        ITaskInstance[] symbols = new ITaskInstance[entryCount];
+        String[] values = new String[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbols[i] = createTaskInstance("symbol" + i);
+            if (i % 7 == 0) {
+                values[i] = "value" + i;
+            }
+            else {
+                values[i] = null;
+            }
+            
+            symbolMap.addSymbol(symbols[i], values[i]);
+        }
+        
+        assertNotNull(symbolMap);
+        assertSymbolMapEntries(symbolMap, symbols, values);
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testAddSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(null, null);
+    }    
+    
+    @Test
+    public void testSize_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertEquals(1, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        assertEquals(entryCount, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        assertEquals(entryCount, symbolMap.size());
+    }
+    
+    @Test
+    public void testSize_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        assertEquals(2 * 150, symbolMap.size());
+    }
+    
+    @Test
+    public void testIsEmpty_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertTrue(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testIsEmpty_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        assertFalse(symbolMap.isEmpty());
+    }
+    
+    @Test
+    public void testContainsSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertFalse(symbolMap.containsSymbol(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testContainsSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testContainsSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testContainsSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testContainsSymbol_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertFalse(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertTrue(symbolMap.containsSymbol(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testContainsSymbol_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.containsSymbol(null);
+    }    
+
+    @Test
+    public void testGetValue_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertNull(symbolMap.getValue(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testGetValue_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.getValue(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testGetValue_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNull(symbolMap.getValue(createTaskInstance("symbol1")));
+    }
+    
+    @Test
+    public void testGetValue_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test
+    public void testGetValue_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+            }
+            else {
+                assertNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+            }
+        }
+    }
+    
+    @Test
+    public void testGetValue_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertNotNull(symbolMap.getValue(createTaskInstance("symbol" + i)));
+        }
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testGetValue_7() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.getValue(null);
+    }    
+
+    @Test
+    public void testRemoveSymbol_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertNull(symbolMap.removeSymbol(createTaskInstance("symbol")));
+    }
+    
+    @Test
+    public void testRemoveSymbol_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol1")));
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNull(symbolMap.removeSymbol(createTaskInstance("symbol1")));
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+            }
+            else {
+                assertNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+            }
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test
+    public void testRemoveSymbol_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        for (int i = 0; i < 150; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            assertNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        for (int i = (entryCount - 150); i < entryCount; i++) {
+            assertNotNull(symbolMap.removeSymbol(createTaskInstance("symbol" + i)));
+        }
+        
+        assertEquals(0, symbolMap.size());
+    }
+    
+    @Test(expected = java.lang.IllegalArgumentException.class)
+    public void testRemoveSymbol_7() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.removeSymbol(null);
+    }    
+   
+    @Test
+    public void testGetSymbols_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(0, symbolMap.getSymbols().size());
+    }
+    
+    @Test
+    public void testGetSymbols_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+         
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap.addSymbol(task, "value1");
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(1, symbolMap.getSymbols().size());
+        assertEquals(task, symbolMap.getSymbols().iterator().next());
+    }
+    
+    @Test
+    public void testGetSymbols_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap.addSymbol(task, null);
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(1, symbolMap.getSymbols().size());
+        assertEquals(task, symbolMap.getSymbols().iterator().next());
+    }
+    
+    @Test
+    public void testGetSymbols_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        Set<ITaskInstance> expectedSymbols = new HashSet<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(task, "value" + i);
+            expectedSymbols.add(task);
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(entryCount, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetSymbols_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        Set<ITaskInstance> expectedSymbols = new HashSet<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(task, "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(task, null);
+            }
+            
+            expectedSymbols.add(task);
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(entryCount, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetSymbols_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        List<ITaskInstance> expectedSymbols = new ArrayList<ITaskInstance>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            symbolMap.addSymbol(task, "value" + i);
+            expectedSymbols.add(task);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(expectedSymbols.remove(150));
+        }
+        
+        assertNotNull(symbolMap.getSymbols());
+        assertEquals(2 * 150, symbolMap.getSymbols().size());
+        
+        Iterator<ITaskInstance> iterator = symbolMap.getSymbols().iterator();
+        for (int i = 0; i < 2 * 150; i++) {
+            assertTrue(iterator.hasNext());
+            expectedSymbols.remove(iterator.next());
+        }
+        
+        assertTrue(expectedSymbols.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        assertNotNull(symbolMap.getValues());
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testGetValues_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(1, symbolMap.getValues().size());
+        assertEquals("value1", symbolMap.getValues().iterator().next());
+    }
+    
+    @Test
+    public void testGetValues_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(1, symbolMap.getValues().size());
+        assertNull(symbolMap.getValues().iterator().next());
+    }
+    
+    @Test
+    public void testGetValues_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            expectedValues.add("value" + i);
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(entryCount, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+                expectedValues.add("value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+                expectedValues.add(null);
+            }
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(entryCount, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < entryCount; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testGetValues_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        Set<String> expectedValues = new HashSet<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            expectedValues.add("value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+            expectedValues.remove("value" + i);
+        }
+        
+        assertNotNull(symbolMap.getValues());
+        assertEquals(2 * 150, symbolMap.getValues().size());
+        
+        Iterator<String> iterator = symbolMap.getValues().iterator();
+        for (int i = 0; i < 2 * 150; i++) {
+            assertTrue(iterator.hasNext());
+            expectedValues.remove(iterator.next());
+        }
+        
+        assertTrue(expectedValues.isEmpty());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testClear_1() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_2() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_3() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap.addSymbol(createTaskInstance("symbol1"), null);
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_4() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_5() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            if (i % 7 == 0) {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+            }
+            else {
+                symbolMap.addSymbol(createTaskInstance("symbol" + i), null);
+            }
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testClear_6() {
+        SymbolMap<ITaskInstance, String> symbolMap = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 2000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            symbolMap.addSymbol(createTaskInstance("symbol" + i), "value" + i);
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap.removeSymbol(createTaskInstance("symbol" + i));
+        }
+        
+        symbolMap.clear();
+        assertEquals(0, symbolMap.getValues().size());
+    }
+    
+    @Test
+    public void testEquals_1() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+        
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+        
+        assertTrue(symbolMap1.equals(symbolMap2));
+    }
+    
+    @Test
+    public void testEquals_2() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+            
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+            
+        symbolMap1.addSymbol(createTaskInstance("symbol1"), "value1");
+        
+        assertFalse(symbolMap1.equals(symbolMap2));
+    }
+    
+    @Test
+    public void testEquals_3() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+            
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+        
+        ITaskInstance task = createTaskInstance("symbol1");
+        symbolMap1.addSymbol(task, "value1");
+        symbolMap2.addSymbol(task, "value1");
+        
+        assertTrue(symbolMap1.equals(symbolMap2));
+    }
+
+    @Test
+    public void testEquals_4() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+                
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 1000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol1");
+            symbolMap1.addSymbol(task, "value" + i);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.addSymbol(task, "value" + i);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+    }
+    
+    @Test
+    public void testEquals_5() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+               
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 1000;
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            if (i % 7 == 0) {
+                symbolMap1.addSymbol(task, "value" + i);
+                assertFalse(symbolMap1.equals(symbolMap2));
+                symbolMap2.addSymbol(task, "value" + i);
+                assertTrue(symbolMap1.equals(symbolMap2));
+            }
+            else {
+                symbolMap1.addSymbol(task, null);
+                assertFalse(symbolMap1.equals(symbolMap2));
+                symbolMap2.addSymbol(task, null);
+                assertTrue(symbolMap1.equals(symbolMap2));
+            }
+        }
+    }
+    
+    @Test
+    public void testEquals_6() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+                
+        SymbolMap<ITaskInstance, String> symbolMap2 = new TaskSymbolIdentityMap<String>();
+        
+        int entryCount = 1000;
+        
+        ITaskInstance[] taskInstances = new ITaskInstance[entryCount];
+        
+        for (int i = 0; i < entryCount; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            taskInstances[i] = task;
+            symbolMap1.addSymbol(task, "value" + i);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.addSymbol(task, "value" + i);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+        
+        for (int i = 150; i < (entryCount - 150); i++) {
+            symbolMap1.removeSymbol(taskInstances[i]);
+            assertFalse(symbolMap1.equals(symbolMap2));
+            symbolMap2.removeSymbol(taskInstances[i]);
+            assertTrue(symbolMap1.equals(symbolMap2));
+        }
+    }
+    
+    @Test
+    public void testPerformance_Contains_1() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+        int mapSize = 100000;
+        int noOfLookups = 1000000;
+        
+        ITaskInstance[] taskInstances = new ITaskInstance[mapSize];
+        
+        for (int i = 0; i < mapSize; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            taskInstances[i] = task;
+            symbolMap1.addSymbol(task, "value" + i);
+        }
+        
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < noOfLookups; i++) {
+            symbolMap1.containsSymbol(taskInstances[noOfLookups % mapSize]);
+        }
+        
+        System.out.println(noOfLookups + " look ups in a map of size " + mapSize + " took " +
+                           (System.currentTimeMillis() - start));
+    }
+    
+    @Test
+    public void testPerformance_GetValue_1() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+        int mapSize = 100000;
+        int noOfLookups = 1000000;
+        
+        ITaskInstance[] taskInstances = new ITaskInstance[mapSize];
+        
+        for (int i = 0; i < mapSize; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            taskInstances[i] = task;
+            symbolMap1.addSymbol(task, "value" + i);
+        }
+        
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < noOfLookups; i++) {
+            symbolMap1.getValue(taskInstances[noOfLookups % mapSize]);
+        }
+        
+        System.out.println(noOfLookups + " value retrievals in a map of size " + mapSize +
+                           " took " + (System.currentTimeMillis() - start));
+    }
+    
+    
+    @Test
+    public void testPerformance_AddRemove_1() {
+        SymbolMap<ITaskInstance, String> symbolMap1 = new TaskSymbolIdentityMap<String>();
+        int mapSize = 100000;
+        int noOfLookups = 1000000;
+        
+        ITaskInstance[] taskInstances = new ITaskInstance[mapSize];
+        
+        for (int i = 0; i < mapSize; i++) {
+            ITaskInstance task = createTaskInstance("symbol" + i);
+            taskInstances[i] = task;
+            symbolMap1.addSymbol(task, "value" + i);
+        }
+        
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < noOfLookups; i++) {
+            ITaskInstance task = taskInstances[noOfLookups % mapSize];
+            symbolMap1.addSymbol(task, symbolMap1.removeSymbol(task));
+        }
+        
+        System.out.println(noOfLookups + " adds and removes in a map of size " + mapSize +
+                           " took " + (System.currentTimeMillis() - start));
+    }
+    
+    /**
+     *
+     */
+    private ITaskInstance createTaskInstance(String id) {
+        ITask task = tasks.get(id);
+        Event event = null;
+        
+        if (task == null) {
+            event = new Event(new DummyInteraction(id, 0), new DummyGUIElement("default"));
+            task = taskFactory.createNewEventTask(event.toString());
+            
+            tasks.put(id, task);
+        }
+        else {
+            event = ((IEventTaskInstance) task.getInstances().iterator().next()).getEvent();
+        }
+        
+        return taskFactory.createNewTaskInstance((IEventTask) task, event);
+    }
+
+    private void assertSymbolMapEntries(SymbolMap<ITaskInstance, String> symbolMap,
+                                        ITaskInstance[]                  symbols,
+                                        String[]                         values)
+    {
+        assertEquals(symbols.length, symbolMap.size());
+        assertEquals(symbols.length, symbolMap.getSymbols().size());
+        assertEquals(values.length, symbolMap.getValues().size());
+        
+        for (int i = 0; i < symbols.length; i++) {
+            assertTrue(symbolMap.containsSymbol(symbols[i]));
+            assertEquals(values[i], symbolMap.getValue(symbols[i]));
+            assertTrue(symbolMap.getSymbols().contains(symbols[i]));
+            assertTrue(symbolMap.getValues().contains(values[i]));            
+        }
+    }
+}
Index: /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskModelTest.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskModelTest.java	(revision 1647)
+++ /branches/autoquest-core-tasktrees-alignment-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskModelTest.java	(revision 1647)
@@ -0,0 +1,1355 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.treeimpl;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIterationInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptionalInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelectionInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequenceInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInfo;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskInfo;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskBuilder;
+import de.ugoe.cs.autoquest.tasktrees.treeimpl.TaskFactory;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+import de.ugoe.cs.autoquest.test.DummyInteraction;
+
+/**
+ *
+ */
+public class TaskModelTest {
+    
+    /** */
+    private static final int MAX_TREE_DEPTH = 10;
+
+    /** */
+    private ITaskBuilder taskBuilder = new TaskBuilder();
+
+    /** */
+    private ITaskFactory taskFactory = new TaskFactory();
+
+    /**
+     *
+     */
+    @Test
+    public void test_EventTask_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        assertNotNull(task);
+        assertNotNull(task.getId());
+        assertTrue(task.equals(task));
+        
+        IEventTaskInstance instance = (IEventTaskInstance) task.getInstances().iterator().next();
+        assertEquals(eventType, instance.getEvent().getType());
+        assertEquals(eventTarget, instance.getEvent().getTarget());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_EventTask_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        
+        // the tasks will not be equal as they should have a different id
+        assertFalse(task1.equals(task2));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_EventTask_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        ITaskInstance taskInstance1 = createNewTaskInstance(task);
+        ITaskInstance taskInstance2 = createNewTaskInstance(task);
+        
+        assertFalse(taskInstance1.equals(taskInstance2));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Sequence_01() throws Exception {
+        ISequence task = taskFactory.createNewSequence();
+        
+        assertNotNull(task);
+        assertNotNull(task.getId());
+        assertNotNull(task.getChildren());
+        assertEquals(0, task.getChildren().size());
+        assertTrue(task.equals(task));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Sequence_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child = createNewEventTask(eventType, eventTarget);
+
+        ISequence task = taskFactory.createNewSequence();
+        
+        taskBuilder.addChild(task, child);
+        
+        assertNotNull(task.getChildren());
+        assertEquals(1, task.getChildren().size());
+        assertEquals(child, task.getChildren().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Sequence_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child1 = createNewEventTask(eventType, eventTarget);
+        IEventTask child2 = createNewEventTask(eventType, eventTarget);
+        IEventTask child3 = createNewEventTask(eventType, eventTarget);
+        IEventTask child4 = createNewEventTask(eventType, eventTarget);
+        IEventTask child5 = createNewEventTask(eventType, eventTarget);
+
+        ISequence task = taskFactory.createNewSequence();
+        
+        taskBuilder.addChild(task, child1);
+        taskBuilder.addChild(task, child2);
+        taskBuilder.addChild(task, child3);
+        taskBuilder.addChild(task, child4);
+        taskBuilder.addChild(task, child5);
+        
+        assertNotNull(task.getChildren());
+        assertEquals(5, task.getChildren().size());
+        assertEquals(child1, task.getChildren().get(0));
+        assertEquals(child2, task.getChildren().get(1));
+        assertEquals(child3, task.getChildren().get(2));
+        assertEquals(child4, task.getChildren().get(3));
+        assertEquals(child5, task.getChildren().get(4));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Selection_01() throws Exception {
+        ISelection task = taskFactory.createNewSelection();
+        
+        assertNotNull(task);
+        assertNotNull(task.getId());
+        assertNotNull(task.getChildren());
+        assertEquals(0, task.getChildren().size());
+        assertTrue(task.equals(task));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Selection_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child = createNewEventTask(eventType, eventTarget);
+
+        ISelection task = taskFactory.createNewSelection();
+        
+        taskBuilder.addChild(task, child);
+        
+        assertNotNull(task.getChildren());
+        assertEquals(1, task.getChildren().size());
+        assertEquals(child, task.getChildren().get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Selection_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child1 = createNewEventTask(eventType, eventTarget);
+        IEventTask child2 = createNewEventTask(eventType, eventTarget);
+        IEventTask child3 = createNewEventTask(eventType, eventTarget);
+        IEventTask child4 = createNewEventTask(eventType, eventTarget);
+        IEventTask child5 = createNewEventTask(eventType, eventTarget);
+
+        ISelection task = taskFactory.createNewSelection();
+        
+        taskBuilder.addChild(task, child1);
+        taskBuilder.addChild(task, child2);
+        taskBuilder.addChild(task, child3);
+        taskBuilder.addChild(task, child4);
+        taskBuilder.addChild(task, child5);
+        
+        assertNotNull(task.getChildren());
+        assertEquals(5, task.getChildren().size());
+        assertEquals(child1, task.getChildren().get(0));
+        assertEquals(child2, task.getChildren().get(1));
+        assertEquals(child3, task.getChildren().get(2));
+        assertEquals(child4, task.getChildren().get(3));
+        assertEquals(child5, task.getChildren().get(4));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Iteration_01() throws Exception {
+        IIteration task = taskFactory.createNewIteration();
+        
+        assertNotNull(task);
+        assertNotNull(task.getId());
+        assertNull(task.getMarkedTask());
+        assertTrue(task.equals(task));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Iteration_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child = createNewEventTask(eventType, eventTarget);
+
+        IIteration task = taskFactory.createNewIteration();
+        
+        taskBuilder.setMarkedTask(task, child);
+        
+        assertEquals(child, task.getMarkedTask());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Iteration_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child1 = createNewEventTask(eventType, eventTarget);
+        IEventTask child2 = createNewEventTask(eventType, eventTarget);
+
+        IIteration task = taskFactory.createNewIteration();
+        
+        taskBuilder.setMarkedTask(task, child1);
+        taskBuilder.setMarkedTask(task, child2);
+        
+        assertEquals(child2, task.getMarkedTask());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Optional_01() throws Exception {
+        IOptional task = taskFactory.createNewOptional();
+        
+        assertNotNull(task);
+        assertNotNull(task.getId());
+        assertNull(task.getMarkedTask());
+        assertTrue(task.equals(task));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Optional_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child = createNewEventTask(eventType, eventTarget);
+
+        IOptional task = taskFactory.createNewOptional();
+        
+        taskBuilder.setMarkedTask(task, child);
+        
+        assertEquals(child, task.getMarkedTask());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_Optional_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask child1 = createNewEventTask(eventType, eventTarget);
+        IEventTask child2 = createNewEventTask(eventType, eventTarget);
+
+        IOptional task = taskFactory.createNewOptional();
+        
+        taskBuilder.setMarkedTask(task, child1);
+        taskBuilder.setMarkedTask(task, child2);
+        
+        assertEquals(child2, task.getMarkedTask());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_EventTaskInstance_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IEventTaskInstance taskInstance = createNewTaskInstance(task);
+        
+        assertNotNull(taskInstance);
+        assertEquals(task, taskInstance.getTask());
+        assertTrue(taskInstance.equals(taskInstance));
+        assertFalse(taskInstance.equals(task));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_EventTaskInstance_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        ITaskInstance taskInstance1 = createNewTaskInstance(task);
+        ITaskInstance taskInstance2 = createNewTaskInstance(task);
+        
+        assertFalse(taskInstance1.equals(taskInstance2));
+    }
+
+    /**
+     *
+     */
+    @Test()
+    public void test_SequenceInstance_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        ISequence sequence = taskFactory.createNewSequence();
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        ISequenceInstance sequenceInstance = createNewTaskInstance(sequence);
+        
+        taskBuilder.addChild(sequenceInstance, taskInstance);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_SequenceInstance_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        ISequence sequence = taskFactory.createNewSequence();
+        taskBuilder.addChild(sequence, task);
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        ISequenceInstance sequenceInstance = createNewTaskInstance(sequence);
+        
+        taskBuilder.addChild(sequenceInstance, taskInstance);
+        
+        assertEquals(1, sequenceInstance.size());
+        assertEquals(taskInstance, sequenceInstance.get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_SequenceInstance_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        IEventTask task3 = createNewEventTask(eventType, eventTarget);
+        IEventTask task4 = createNewEventTask(eventType, eventTarget);
+        IEventTask task5 = createNewEventTask(eventType, eventTarget);
+        
+        ISequence sequence = taskFactory.createNewSequence();
+        taskBuilder.addChild(sequence, task1);
+        taskBuilder.addChild(sequence, task2);
+        taskBuilder.addChild(sequence, task3);
+        taskBuilder.addChild(sequence, task4);
+        taskBuilder.addChild(sequence, task5);
+        
+        ITaskInstance taskInstance1 = createNewTaskInstance(task1);
+        ITaskInstance taskInstance2 = createNewTaskInstance(task2);
+        ITaskInstance taskInstance3 = createNewTaskInstance(task3);
+        ITaskInstance taskInstance4 = createNewTaskInstance(task4);
+        ITaskInstance taskInstance5 = createNewTaskInstance(task5);
+        ISequenceInstance sequenceInstance = createNewTaskInstance(sequence);
+        
+        taskBuilder.addChild(sequenceInstance, taskInstance1);
+        taskBuilder.addChild(sequenceInstance, taskInstance2);
+        taskBuilder.addChild(sequenceInstance, taskInstance3);
+        taskBuilder.addChild(sequenceInstance, taskInstance4);
+        taskBuilder.addChild(sequenceInstance, taskInstance5);
+        
+        assertEquals(5, sequenceInstance.size());
+        assertEquals(taskInstance1, sequenceInstance.get(0));
+        assertEquals(taskInstance2, sequenceInstance.get(1));
+        assertEquals(taskInstance3, sequenceInstance.get(2));
+        assertEquals(taskInstance4, sequenceInstance.get(3));
+        assertEquals(taskInstance5, sequenceInstance.get(4));
+    }
+
+    /**
+     *
+     */
+    @Test(expected=IllegalArgumentException.class)
+    public void test_SelectionInstance_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        ISelection selection = taskFactory.createNewSelection();
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        ISelectionInstance selectionInstance = createNewTaskInstance(selection);
+        
+        taskBuilder.setChild(selectionInstance, taskInstance);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_SelectionInstance_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        ISelection selection = taskFactory.createNewSelection();
+        taskBuilder.addChild(selection, task);
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        ISelectionInstance selectionInstance = createNewTaskInstance(selection);
+        
+        taskBuilder.setChild(selectionInstance, taskInstance);
+        
+        assertNotNull(selectionInstance.getChild());
+        assertEquals(taskInstance, selectionInstance.getChild());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_SelectionInstance_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        IEventTask task3 = createNewEventTask(eventType, eventTarget);
+        IEventTask task4 = createNewEventTask(eventType, eventTarget);
+        IEventTask task5 = createNewEventTask(eventType, eventTarget);
+        
+        ISelection selection = taskFactory.createNewSelection();
+        taskBuilder.addChild(selection, task1);
+        taskBuilder.addChild(selection, task2);
+        taskBuilder.addChild(selection, task3);
+        taskBuilder.addChild(selection, task4);
+        taskBuilder.addChild(selection, task5);
+        
+        ITaskInstance taskInstance1 = createNewTaskInstance(task1);
+        ITaskInstance taskInstance2 = createNewTaskInstance(task2);
+        ISelectionInstance selectionInstance = createNewTaskInstance(selection);
+        
+        taskBuilder.setChild(selectionInstance, taskInstance1);
+        taskBuilder.setChild(selectionInstance, taskInstance2);
+        
+        assertEquals(taskInstance2, selectionInstance.getChild());
+    }
+
+    /**
+     *
+     */
+    @Test()
+    public void test_IterationInstance_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IIteration iteration = taskFactory.createNewIteration();
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        IIterationInstance iterationInstance = createNewTaskInstance(iteration);
+        
+        taskBuilder.addChild(iterationInstance, taskInstance);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_IterationInstance_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IIteration iteration = taskFactory.createNewIteration();
+        taskBuilder.setMarkedTask(iteration, task);
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        IIterationInstance iterationInstance = createNewTaskInstance(iteration);
+        
+        taskBuilder.addChild(iterationInstance, taskInstance);
+        
+        assertEquals(1, iterationInstance.size());
+        assertEquals(taskInstance, iterationInstance.get(0));
+    }
+
+    /**
+     *
+     */
+    @Test(expected=IllegalArgumentException.class)
+    public void test_IterationInstance_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        
+        IIteration iteration = taskFactory.createNewIteration();
+        taskBuilder.setMarkedTask(iteration, task1);
+        taskBuilder.setMarkedTask(iteration, task2);
+        
+        ITaskInstance taskInstance1 = createNewTaskInstance(task1);
+        IIterationInstance iterationInstance = createNewTaskInstance(iteration);
+        
+        taskBuilder.addChild(iterationInstance, taskInstance1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_IterationInstance_04() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        
+        IIteration iteration = taskFactory.createNewIteration();
+        taskBuilder.setMarkedTask(iteration, task1);
+        taskBuilder.setMarkedTask(iteration, task2);
+        
+        ITaskInstance taskInstance2 = createNewTaskInstance(task2);
+        IIterationInstance iterationInstance = createNewTaskInstance(iteration);
+        
+        taskBuilder.addChild(iterationInstance, taskInstance2);
+        
+        assertEquals(1, iterationInstance.size());
+        assertEquals(taskInstance2, iterationInstance.get(0));
+    }
+
+    /**
+     *
+     */
+    @Test()
+    public void test_OptionalInstance_01() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IOptional optional = taskFactory.createNewOptional();
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        IOptionalInstance optionalInstance = createNewTaskInstance(optional);
+        
+        taskBuilder.setChild(optionalInstance, taskInstance);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_OptionalInstance_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IOptional optional = taskFactory.createNewOptional();
+        taskBuilder.setMarkedTask(optional, task);
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        IOptionalInstance optionalInstance = createNewTaskInstance(optional);
+        
+        taskBuilder.setChild(optionalInstance, taskInstance);
+        
+        assertNotNull(optionalInstance.getChild());
+        assertEquals(taskInstance, optionalInstance.getChild());
+    }
+
+    /**
+     *
+     */
+    @Test(expected=IllegalArgumentException.class)
+    public void test_OptionalInstance_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        
+        IOptional optional = taskFactory.createNewOptional();
+        taskBuilder.setMarkedTask(optional, task1);
+        taskBuilder.setMarkedTask(optional, task2);
+        
+        ITaskInstance taskInstance1 = createNewTaskInstance(task1);
+        IOptionalInstance optionalInstance = createNewTaskInstance(optional);
+        
+        taskBuilder.setChild(optionalInstance, taskInstance1);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_OptionalInstance_04() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task1 = createNewEventTask(eventType, eventTarget);
+        IEventTask task2 = createNewEventTask(eventType, eventTarget);
+        
+        IOptional optional = taskFactory.createNewOptional();
+        taskBuilder.setMarkedTask(optional, task1);
+        taskBuilder.setMarkedTask(optional, task2);
+        
+        ITaskInstance taskInstance2 = createNewTaskInstance(task2);
+        IOptionalInstance optionalInstance = createNewTaskInstance(optional);
+        
+        taskBuilder.setChild(optionalInstance, taskInstance2);
+        
+        assertNotNull(optionalInstance.getChild());
+        assertEquals(taskInstance2, optionalInstance.getChild());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_UserSession_01() throws Exception {
+        IUserSession userSession = taskFactory.createUserSession();
+        
+        assertNotNull(userSession);
+        assertEquals(0, userSession.size());
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_UserSession_02() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        
+        IUserSession userSession = taskFactory.createUserSession();
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        
+        taskBuilder.addExecutedTask(userSession, taskInstance);
+        
+        assertEquals(1, userSession.size());
+        assertEquals(taskInstance, userSession.get(0));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_UserSession_03() throws Exception {
+        IEventType eventType = new DummyInteraction("interaction", 1);
+        IEventTarget eventTarget = new DummyGUIElement("elem");
+        
+        IEventTask task = createNewEventTask(eventType, eventTarget);
+        ISequence sequence = taskFactory.createNewSequence();
+        ISelection selection = taskFactory.createNewSelection();
+        IIteration iteration = taskFactory.createNewIteration();
+        IOptional optional = taskFactory.createNewOptional();
+        
+        taskBuilder.addChild(sequence, task);
+        taskBuilder.addChild(selection, task);
+        taskBuilder.setMarkedTask(iteration, task);
+        taskBuilder.setMarkedTask(optional, task);
+        
+        ITaskInstance taskInstance = createNewTaskInstance(task);
+        ISequenceInstance sequenceInstance = createNewTaskInstance(sequence);
+        ISelectionInstance selectionInstance = createNewTaskInstance(selection);
+        IIterationInstance iterationInstance = createNewTaskInstance(iteration);
+        IOptionalInstance optionalInstance = createNewTaskInstance(optional);
+        
+        taskBuilder.addChild(sequenceInstance, createNewTaskInstance(task));
+        taskBuilder.setChild(selectionInstance, createNewTaskInstance(task));
+        taskBuilder.addChild(iterationInstance, createNewTaskInstance(task));
+        taskBuilder.setChild(optionalInstance, createNewTaskInstance(task));
+        
+        IUserSession userSession = taskFactory.createUserSession();
+        
+        taskBuilder.addExecutedTask(userSession, taskInstance);
+        taskBuilder.addExecutedTask(userSession, sequenceInstance);
+        taskBuilder.addExecutedTask(userSession, selectionInstance);
+        taskBuilder.addExecutedTask(userSession, iterationInstance);
+        taskBuilder.addExecutedTask(userSession, optionalInstance);
+        
+        assertEquals(5, userSession.size());
+        assertEquals(taskInstance, userSession.get(0));
+        assertEquals(sequenceInstance, userSession.get(1));
+        assertEquals(selectionInstance, userSession.get(2));
+        assertEquals(iterationInstance, userSession.get(3));
+        assertEquals(optionalInstance, userSession.get(4));
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void testRandomTrees() throws Exception {
+        int noOfTrees = 10;
+        int noOfMaxChildren = 8;
+        int maxDepth = MAX_TREE_DEPTH;
+
+        for (int i = 0; i < noOfTrees; i++) {
+            System.err.println("\niteration " + (i + 1) + ":");
+            System.err.println("  creating tasks");
+            Map<ITask, ITaskInfo> expectedTaskInfos = new HashMap<ITask, ITaskInfo>();
+            ITask task = createTaskTree(noOfMaxChildren, maxDepth, expectedTaskInfos);
+            if (!(task instanceof ISequence)) {
+                ISequence sequence = taskFactory.createNewSequence();
+                taskBuilder.addChild(sequence, task);
+                task = sequence;
+            }
+            else {
+                expectedTaskInfos.remove(task);
+            }
+            
+            //new TaskTreeEncoder().encode(task, System.err);
+
+            ISequenceInstance sequenceInstance =
+                (ISequenceInstance) instantiateTask(task, noOfMaxChildren);
+            
+            System.err.println("  creating user session");
+            
+            IUserSession session = taskFactory.createUserSession();
+            
+            for (ITaskInstance child : sequenceInstance) {
+                taskBuilder.addExecutedTask(session, child);
+            }
+            
+            List<IUserSession> sessions = new LinkedList<IUserSession>();
+            sessions.add(session);
+            
+            //new TaskTreeEncoder().encode(session, System.err);
+            
+            ITaskModel taskModel = taskFactory.createTaskModel(sessions);
+
+            System.err.println("  validating task tree");
+            Map<ITask, ITaskInfo> actualTaskInfos = new HashMap<ITask, ITaskInfo>();
+            
+            for (ITask currentTask : taskModel.getTasks()) {
+                actualTaskInfos.put(currentTask, taskModel.getTaskInfo(currentTask));
+            }
+            
+            assertMapsEqual(expectedTaskInfos, actualTaskInfos);
+        }
+    }
+
+    /**
+     *
+     */
+    private void assertMapsEqual(Map<ITask, ITaskInfo> map1,
+                                 Map<ITask, ITaskInfo> map2)
+    {
+        try {
+            if (map1 == null) {
+                assertNull(map2);
+                return;
+            }
+
+            assertEquals(map1.size(), map2.size());
+
+            for (Map.Entry<ITask, ITaskInfo> entry : map1.entrySet()) {
+                ITaskInfo value2 = map2.get(entry.getKey());
+                assertNotNull(value2);
+                assertEquals(entry.getValue().getTask(), value2.getTask());
+                //assertEquals(entry.getValue().getNoOfOccurencesInTree(),
+                //             value2.getNoOfOccurencesInTree());
+            }
+        }
+        catch (AssertionError e) {
+            dumpMap(map1);
+            dumpMap(map2);
+            
+            if (map1.size() > map2.size()) {
+                for (ITask task : map2.keySet()) {
+                    map1.remove(task);
+                }
+                
+                System.err.println("difference: ");
+                dumpMap(map1);
+            }
+            else if (map2.size() > map1.size()) {
+                for (ITask task : map1.keySet()) {
+                    map2.remove(task);
+                }
+                
+                System.err.println("difference: ");
+                dumpMap(map2);
+            }
+            
+            throw e;
+        }
+    }
+
+    /**
+     *
+     */
+    private void dumpMap(Map<ITask, ITaskInfo> map) {
+        System.err.println();
+
+        if (map == null) {
+            System.err.println("map is null");
+        }
+        else {
+            System.err.println("map:");
+            for (Map.Entry<ITask, ITaskInfo> entry : map.entrySet()) {
+                int lineLength = 2;
+                System.err.print("  ");
+                System.err.print(entry.getKey());
+                lineLength += entry.getKey().toString().length();
+                for (int i = lineLength; i < 70; i++) {
+                    System.err.print(" ");
+                }
+                lineLength = 60;
+                System.err.print(" : ");
+                lineLength += 3;
+                System.err.print(entry.getValue());
+                lineLength += entry.getValue().toString().length();
+                for (int i = lineLength; i < 140; i++) {
+                    System.err.print(" ");
+                }
+                System.err.print(" : ");
+                System.err.println(entry.getKey().getDescription());
+            }
+        }
+
+        System.err.println();
+    }
+
+    /**
+     *
+     */
+    private ITask createTaskTree(int                   maxNoOfChildren,
+                                 int                   maxDepth,
+                                 Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+
+        ITask task;
+
+        // integrating the maximum depth here assures, that either something between 0 and 8 will
+        // be the type, or if the max depth decreases near 0 only event tasks will be created
+        // to finish the tree creation
+        int type = randomize(Math.min(10, maxDepth));
+
+        switch (type)
+        {
+            case 0: {
+                // System.err.print("creating new event task ");
+                task = createNewEventTask(taskInfos);
+                break;
+            }
+            case 1: {
+                // System.err.print("reusing event task ");
+                task = reuseEventTask(taskInfos);
+                break;
+            }
+            case 2: {
+                // System.err.println("creating new sequence {");
+                task = createNewSequence(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 3: {
+                // System.err.println("reusing sequence {");
+                task = reuseSequence(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 4: {
+                // System.err.println("creating new selection {");
+                task = createNewSelection(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 5: {
+                // System.err.println("reusing selection {");
+                task = reuseSelection(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 6: {
+                // System.err.println("creating new iteration {");
+                task = createNewIteration(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 7: {
+                // System.err.println("reusing iteration {");
+                task = reuseIteration(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 8: {
+                // System.err.println("creating new optional {");
+                task = createNewOptional(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            case 9: {
+                // System.err.println("reusing optional {");
+                task = reuseOptional(maxNoOfChildren, maxDepth, taskInfos);
+                break;
+            }
+            default: {
+                // System.err.print("creating new event task per default ");
+                task = createNewEventTask(taskInfos);
+            }
+        }
+
+        return task;
+    }
+
+    /**
+     *
+     */
+    private ITask createNewEventTask(Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        Thread.sleep(2);
+        long id = System.currentTimeMillis();
+        IEventTask task = createNewEventTask
+            (new DummyInteraction("interaction" + id, 1), new DummyGUIElement("elem" + id));
+
+        taskInfos.put(task, new TaskInfo(task));
+
+        return task;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseEventTask(Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ITask eventTask = reuseTask(taskInfos, IEventTask.class);
+        
+        if (eventTask == null) {
+            eventTask = createNewEventTask(taskInfos);
+        }
+
+        return eventTask;
+    }
+
+    /**
+     *
+     */
+    private ITask createNewSequence(int                   maxNoOfChildren,
+                                    int                   maxDepth,
+                                    Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ISequence sequence = taskFactory.createNewSequence();
+
+        // ensure at the minimum 2 children
+        int noOfChildren = randomize(2, maxNoOfChildren);
+
+        for (int i = 0; i < noOfChildren; i++) {
+            ITask child = createTaskTree(maxNoOfChildren, maxDepth - 1, taskInfos);
+            
+            //((Task) child).setDescription(sequence.toString());
+            taskBuilder.addChild(sequence, child);
+        }
+
+        taskInfos.put(sequence, new TaskInfo(sequence));
+        return sequence;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseSequence(int                   maxNoOfChildren,
+                                int                   maxDepth,
+                                Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ITask sequence = reuseTask(taskInfos, ISequence.class);
+        
+        if (sequence == null) {
+            sequence = createNewSequence(maxNoOfChildren, maxDepth, taskInfos);
+        }
+
+        return sequence;
+    }
+
+    /**
+     *
+     */
+    private ITask createNewSelection(int                   maxNoOfChildren,
+                                     int                   maxDepth,
+                                     Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ISelection selection = taskFactory.createNewSelection();
+
+        // ensure at the minimum 1 child
+        int noOfChildren = randomize(1, maxNoOfChildren);
+        
+        Map<ITask, ITaskInfo> childrenTaskInfos = new HashMap<ITask, ITaskInfo>();
+        for (int i = 0; i < noOfChildren; i++) {
+            ITask child;
+            do {
+                childrenTaskInfos.clear();
+                child = createTaskTree(maxNoOfChildren, maxDepth - 1, childrenTaskInfos);
+            }
+            while (child instanceof ISelection);
+            
+            //((Task) child).setDescription(selection.toString());
+            taskBuilder.addChild(selection, child);
+            taskInfos.putAll(childrenTaskInfos);
+        }
+
+        taskInfos.put(selection, new TaskInfo(selection));
+        return selection;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseSelection(int                   maxNoOfChildren,
+                                 int                   maxDepth,
+                                 Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ITask selection = reuseTask(taskInfos, ISelection.class);
+        
+        if (selection == null) {
+            selection = createNewSelection(maxNoOfChildren, maxDepth, taskInfos);
+        }
+
+        return selection;
+    }
+
+    /**
+     * 
+     */
+    private ITask createNewIteration(int                   maxNoOfChildren,
+                                     int                   maxDepth,
+                                     Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        IIteration iteration = taskFactory.createNewIteration();
+
+        Map<ITask, ITaskInfo> childrenTaskInfos = new HashMap<ITask, ITaskInfo>();
+        ITask child;
+        do {
+            childrenTaskInfos.clear();
+            child = createTaskTree(maxNoOfChildren, maxDepth - 1, childrenTaskInfos);
+        }
+        while ((child instanceof IOptional) || (child instanceof IIteration));
+        
+        //((Task) child).setDescription(iteration.toString());
+        taskBuilder.setMarkedTask(iteration, child);
+        taskInfos.putAll(childrenTaskInfos);
+
+        taskInfos.put(iteration, new TaskInfo(iteration));
+        return iteration;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseIteration(int                   maxNoOfChildren,
+                                 int                   maxDepth,
+                                 Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ITask iteration = reuseTask(taskInfos, IIteration.class);
+        
+        if (iteration == null) {
+            iteration = createNewIteration(maxNoOfChildren, maxDepth, taskInfos);
+        }
+
+        return iteration;
+    }
+
+    /**
+     * 
+     */
+    private ITask createNewOptional(int                   maxNoOfChildren,
+                                    int                   maxDepth,
+                                    Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        IOptional optional = taskFactory.createNewOptional();
+
+        Map<ITask, ITaskInfo> childrenTaskInfos = new HashMap<ITask, ITaskInfo>();
+        ITask child;
+        do {
+            childrenTaskInfos.clear();
+            child = createTaskTree(maxNoOfChildren, maxDepth - 1, childrenTaskInfos);
+        }
+        while (child instanceof IOptional);
+        
+        //((Task) child).setDescription(optional.toString());
+        taskBuilder.setMarkedTask(optional, child);
+        taskInfos.putAll(childrenTaskInfos);
+
+        taskInfos.put(optional, new TaskInfo(optional));
+        return optional;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseOptional(int                   maxNoOfChildren,
+                                int                   maxDepth,
+                                Map<ITask, ITaskInfo> taskInfos)
+        throws Exception
+    {
+        ITask optional = reuseTask(taskInfos, IOptional.class);
+        
+        if (optional == null) {
+            optional = createNewOptional(maxNoOfChildren, maxDepth, taskInfos);
+        }
+
+        return optional;
+    }
+
+    /**
+     *
+     */
+    private ITask reuseTask(Map<ITask, ITaskInfo> taskInfos, Class<? extends ITask> type)
+        throws Exception
+    {
+        int noOfTasks = 0;
+
+        for (Map.Entry<ITask, ITaskInfo> entry : taskInfos.entrySet()) {
+            if (type.isInstance(entry.getKey())) {
+                noOfTasks++;
+            }
+        }
+
+        if (noOfTasks > 0) {
+            noOfTasks = randomize(noOfTasks);
+
+            for (Map.Entry<ITask, ITaskInfo> entry : taskInfos.entrySet()) {
+                if (type.isInstance(entry.getKey())) {
+                    if (--noOfTasks <= 0) {
+                        return entry.getKey();
+                    }
+                }
+            }
+        }
+        else {
+            return null;
+        }
+
+        throw new RuntimeException("this is an implementation error");
+    }
+
+    /**
+     *
+     */
+    private ITaskInstance instantiateTask(ITask task, int maxIterationCount) throws Exception {
+        ITaskInstance instance = createNewTaskInstance(task);
+
+        if (task instanceof ISequence) {
+            for (ITask child : ((ISequence) task).getChildren()) {
+                taskBuilder.addChild
+                    ((ISequenceInstance) instance, instantiateTask(child, maxIterationCount));
+            }
+        }
+        else if (task instanceof ISelection) {
+            List<ITask> children = ((ISelection) task).getChildren();
+            int index = randomize(children.size());
+            taskBuilder.setChild((ISelectionInstance) instance,
+                                 instantiateTask(children.get(index),maxIterationCount));
+        }
+        else if (task instanceof IIteration) {
+            int count = randomize(maxIterationCount);
+            ITask child = ((IIteration) task).getMarkedTask();
+            
+            for (int i = 0; i < count; i++) {
+                taskBuilder.addChild
+                    ((IIterationInstance) instance, instantiateTask(child, maxIterationCount));
+            }
+        }
+        else if (task instanceof IOptional) {
+            ITask child = ((IOptional) task).getMarkedTask();
+            
+            if (randomize(1) == 0) {
+                taskBuilder.setChild((IOptionalInstance) instance,
+                                     instantiateTask(child, maxIterationCount));
+            }
+        }
+        
+        return instance;
+    }
+
+    /**
+     *
+     */
+    private int randomize(int max) throws Exception {
+        return randomize(0, max);
+    }
+    
+    /**
+     *
+     */
+    private int randomize(int min, int max) throws Exception {
+        if (min > max) {
+            throw new IllegalArgumentException("min must always be smaller or equal than max");
+        }
+        
+        int deviation = max - min;
+        int value = (int) (Math.random() * deviation);
+        
+        return value + min;
+    }
+    
+    /**
+     *
+     */
+    protected IEventTask createNewEventTask(IEventType eventType, IEventTarget eventTarget) {
+        IEventTask eventTask = taskFactory.createNewEventTask(eventType + " --> " + eventTarget);
+        taskFactory.createNewTaskInstance(eventTask, new Event(eventType, eventTarget));
+        return eventTask;
+    }
+
+    /**
+     *
+     */
+    private ITaskInstance createNewTaskInstance(ITask task) {
+        if (task instanceof IEventTask) {
+            return createNewTaskInstance((IEventTask) task);
+        }
+        else if (task instanceof ISequence) {
+            return createNewTaskInstance((ISequence) task);
+        }
+        else if (task instanceof ISelection) {
+            return createNewTaskInstance((ISelection) task);
+        }
+        else if (task instanceof IIteration) {
+            return createNewTaskInstance((IIteration) task);
+        }
+        else if (task instanceof IOptional) {
+            return createNewTaskInstance((IOptional) task);
+        }
+        
+        throw new IllegalArgumentException("unknown type of task");
+    }
+
+    /**
+     *
+     */
+    private IEventTaskInstance createNewTaskInstance(IEventTask task) {
+        IEventTaskInstance existingInstance =
+            (IEventTaskInstance) task.getInstances().iterator().next();
+        return taskFactory.createNewTaskInstance(task, existingInstance.getEvent());
+    }
+
+    /**
+     *
+     */
+    private ISequenceInstance createNewTaskInstance(ISequence task) {
+        return taskFactory.createNewTaskInstance(task);
+    }
+
+    /**
+     *
+     */
+    private ISelectionInstance createNewTaskInstance(ISelection task) {
+        return taskFactory.createNewTaskInstance(task);
+    }
+
+    /**
+     *
+     */
+    private IIterationInstance createNewTaskInstance(IIteration task) {
+        return taskFactory.createNewTaskInstance(task);
+    }
+
+    /**
+     *
+     */
+    private IOptionalInstance createNewTaskInstance(IOptional task) {
+        return taskFactory.createNewTaskInstance(task);
+    }
+
+}
