Index: /trunk/autoquest-core-tasktrees-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/DefaultTaskSequenceDetectionRuleTest.java
===================================================================
--- /trunk/autoquest-core-tasktrees-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/DefaultTaskSequenceDetectionRuleTest.java	(revision 1109)
+++ /trunk/autoquest-core-tasktrees-test/src/test/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/DefaultTaskSequenceDetectionRuleTest.java	(revision 1109)
@@ -0,0 +1,100 @@
+//   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;
+
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
+import de.ugoe.cs.autoquest.eventcore.gui.IInteraction;
+import de.ugoe.cs.autoquest.tasktrees.TaskTreeChecker;
+import de.ugoe.cs.autoquest.test.DummyGUIElement;
+import de.ugoe.cs.autoquest.test.DummyInteraction;
+
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 28.04.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+public class DefaultTaskSequenceDetectionRuleTest extends AbstractTemporalRelationshipTC {
+
+    /**
+     *
+     */
+    @Test
+    public void testTaskDetection() throws Exception {
+        IEventTarget element1 = new DummyGUIElement("elem1");
+        
+        IInteraction action1 = new DummyInteraction("action1", 1);
+        IInteraction action2 = new DummyInteraction("action2", 1);
+        IInteraction action3 = new DummyInteraction("action3", 1);
+        IInteraction action4 = new DummyInteraction("action4", 1);
+        
+        simulateEvent(new DummyInteraction("noise0", 1), element1);
+        simulateEvent(action1, element1);
+        simulateEvent(action2, element1);
+        simulateEvent(action3, element1);
+        simulateEvent(action4, element1);
+        simulateEvent(new DummyInteraction("noise1", 1), element1);
+        simulateEvent(new DummyInteraction("noise2", 1), element1);
+        simulateEvent(action1, element1);
+        simulateEvent(action2, element1);
+        simulateEvent(action3, element1);
+        simulateEvent(action4, element1);
+        simulateEvent(new DummyInteraction("noise3", 1), element1);
+        simulateEvent(new DummyInteraction("noise4", 1), element1);
+        simulateEvent(new DummyInteraction("noise5", 1), element1);
+        simulateEvent(new DummyInteraction("noise6", 1), element1);
+        simulateEvent(action1, element1);
+        simulateEvent(action2, element1);
+        simulateEvent(action3, element1);
+        simulateEvent(action4, element1);
+        simulateEvent(new DummyInteraction("noise7", 1), element1);
+        simulateEvent(new DummyInteraction("noise8", 1), element1);
+        
+        new TaskTreeChecker().assertTaskTree
+            ("Sequence sequence1 {" +
+             "  Event noise0 {}" +
+             "  Sequence sequence2 {" +
+             "    Event action1 {}" +
+             "    Event action2 {}" +
+             "    Event action3 {}" +
+             "    Event action4 {}" +
+             "  }" +
+             "  Event noise1 {}" +
+             "  Event noise2 {}" +
+             "  Sequence sequence2 {" +
+             "    Event action1 {}" +
+             "    Event action2 {}" +
+             "    Event action3 {}" +
+             "    Event action4 {}" +
+             "  }" +
+             "  Event noise3 {}" +
+             "  Event noise4 {}" +
+             "  Event noise5 {}" +
+             "  Event noise6 {}" +
+             "  Sequence sequence2 {" +
+             "    Event action1 {}" +
+             "    Event action2 {}" +
+             "    Event action3 {}" +
+             "    Event action4 {}" +
+             "  }" +
+             "  Event noise7 {}" +
+             "  Event noise8 {}" +
+             "}", getTaskTree());
+
+    }
+
+}
Index: /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/ComponentManager.java
===================================================================
--- /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/ComponentManager.java	(revision 1108)
+++ /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/ComponentManager.java	(revision 1109)
@@ -84,10 +84,10 @@
         nodeEqualityRuleManager.init();
 
-        temporalRelationshipRuleManager =
-            new TemporalRelationshipRuleManager(nodeEqualityRuleManager);
-        temporalRelationshipRuleManager.init();
-
         taskTreeBuilder = new TaskTreeBuilder();
         taskTreeNodeFactory = new TaskTreeNodeFactory();
+
+        temporalRelationshipRuleManager = new TemporalRelationshipRuleManager
+            (nodeEqualityRuleManager, taskTreeNodeFactory, taskTreeBuilder);
+        temporalRelationshipRuleManager.init();
     }
 
Index: /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManager.java
===================================================================
--- /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManager.java	(revision 1108)
+++ /trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManager.java	(revision 1109)
@@ -2,14 +2,13 @@
 
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Level;
 
 import de.ugoe.cs.autoquest.eventcore.Event;
-import de.ugoe.cs.autoquest.eventcore.gui.KeyboardFocusChange;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder;
-import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNodeFactory;
 import de.ugoe.cs.util.console.Console;
@@ -24,7 +23,4 @@
     
     /** */
-    private static final int MAX_EVENTS_TILL_RULE_APPLICATION = 100;
-
-    /** */
     private ITaskTreeBuilder taskTreeBuilder = ComponentManager.getDefaultTaskTreeBuilder();
 
@@ -34,30 +30,32 @@
 
     /** */
-    private int eventsTillRuleApplication = MAX_EVENTS_TILL_RULE_APPLICATION;
+    private List<List<IEventTask>> sessions = null;
 
     /** */
-    private ISequence rootSequence;
+    private List<IEventTask> currentSession = null;
 
     /**
-     * TODO: comment
-     * 
+     *
      */
     public TaskTreeManager() {
-        rootSequence = taskTreeNodeFactory.createNewSequence();
+        sessions = new LinkedList<List<IEventTask>>();
     }
 
     /**
-     * <p>
-     * TODO: comment
-     * </p>
      *
-     * @param sequences
-     * @return
      */
-    public synchronized ITaskTree createTaskTree(Collection<List<Event>> sequences) {
+    public synchronized ITaskTree createTaskTree(Collection<List<Event>> newSessions) {
+        if ((currentSession != null) || (sessions.size() > 0)) {
+            throw new IllegalStateException("do not mix calls to this method with calls to the " +
+                                            "other methods for handling tasks. Use only one " +
+                                            "variant instead.");
+        }
         
-        for (List<Event> sequence : sequences) {
-            for (Event event : sequence) {
-                handleNewEvent(event);
+        for (List<Event> newSession : newSessions) {
+            if (newSession.size() > 0) {
+                for (Event event : newSession) {
+                    handleNewEvent(event);
+                }
+                finishSession();
             }
         }
@@ -70,5 +68,17 @@
      */
     public void handleNewEvent(Event event) {
-        handleEventTask(taskTreeNodeFactory.createNewEventTask(event.getType(), event.getTarget()));
+        assertSessionSequence();
+        currentSession.add
+            (taskTreeNodeFactory.createNewEventTask(event.getType(), event.getTarget()));
+    }
+
+    /**
+     * 
+     */
+    public void finishSession() {
+        if ((currentSession != null) && (currentSession.size() > 0)) {
+            sessions.add(currentSession);
+            currentSession = null;
+        }
     }
 
@@ -77,24 +87,26 @@
      */
     public synchronized ITaskTree getTaskTree() {
+        finishSession();
+        
         Console.traceln(Level.INFO, "applying temporal relationship generation rules");
+        
+        ISequence rootSequence = taskTreeNodeFactory.createNewSequence();
+        taskTreeBuilder.setDescription(rootSequence, "root");
+        
+        for (List<IEventTask> session : sessions) {
+            ISequence sequence = taskTreeNodeFactory.createNewSequence();
+            taskTreeBuilder.setDescription(sequence, "session");
+            
+            for (IEventTask eventTask : session) {
+                taskTreeBuilder.addChild(sequence, eventTask);
+            }
+            
+            taskTreeBuilder.addChild(rootSequence, sequence);
+        }
+        
+        
+        ComponentManager.getTemporalRelationshipRuleManager().applyRules(rootSequence);
 
-        ISequence currentRootSequence = rootSequence.clone();
-        ComponentManager.getTemporalRelationshipRuleManager().applyRules
-          (currentRootSequence, taskTreeBuilder, taskTreeNodeFactory, true);
-
-        return taskTreeNodeFactory.createTaskTree(currentRootSequence);
-    }
-
-    /**
-     * adds the task to the current or the new sequence. The decision depends on the type of task.
-     * If the task finishes the current sequence, the sequence is marked as finished If the task
-     * does not start a new sequence, it is added to the current sequence, before it is marked s
-     * finished. Otherwise it is added to a new sequence.
-     */
-    private synchronized void handleEventTask(IEventTask eventTask) {
-        if (!(eventTask.getEventType() instanceof KeyboardFocusChange)) {
-            Console.traceln(Level.INFO, "handling interaction event task \"" + eventTask + "\"");
-            addTaskToSequence(eventTask);
-        }
+        return taskTreeNodeFactory.createTaskTree(rootSequence);
     }
 
@@ -102,16 +114,7 @@
      *
      */
-    private void addTaskToSequence(ITaskTreeNode task)
-    {
-        taskTreeBuilder.addChild(rootSequence, task);
-
-        if (--eventsTillRuleApplication == 0) {
-            eventsTillRuleApplication = MAX_EVENTS_TILL_RULE_APPLICATION;
-
-            Console.traceln(Level.INFO, "applying temporal relationship generation rules");
-            ComponentManager.getTemporalRelationshipRuleManager().applyRules(rootSequence,
-                                                                             taskTreeBuilder,
-                                                                             taskTreeNodeFactory,
-                                                                             false);
+    private void assertSessionSequence() {
+        if (currentSession == null) {
+            currentSession = new LinkedList<IEventTask>();
         }
     }
