Index: /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenserTest.java
===================================================================
--- /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenserTest.java	(revision 721)
+++ /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenserTest.java	(revision 721)
@@ -0,0 +1,109 @@
+package de.ugoe.cs.quest.eventcore.gui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.IEventType;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonDown;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonInteraction;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonUp;
+import de.ugoe.cs.quest.eventcore.gui.MouseClick;
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.quest.test.DummyGUIElement;
+import de.ugoe.cs.quest.test.DummyInteraction;
+
+/**
+ * @author Patrick Harms
+ */
+public class MouseClickCondenserTest {
+
+    /** */
+    private List<Event> events = new ArrayList<Event>();
+
+    /**
+     *
+     */
+    @Test
+    public void testMouseClickInOneSequenceElement() {
+        MouseButtonInteraction.Button leftBtn = MouseButtonInteraction.Button.LEFT;
+        MouseButtonInteraction.Button middleBtn = MouseButtonInteraction.Button.MIDDLE;
+        MouseButtonInteraction.Button rightBtn = MouseButtonInteraction.Button.RIGHT;
+
+        IGUIElement element1 = new DummyGUIElement("elem1");
+        IGUIElement element2 = new DummyGUIElement("elem2");
+
+        simulateEvent(new MouseButtonDown(leftBtn), element1);
+        simulateEvent(new MouseButtonUp(leftBtn), element1);
+        simulateEvent(new MouseClick(leftBtn), element1);
+        assertCondensedMouseClicks("elem1");
+
+        simulateEvent(new DummyInteraction("bla", 1), element1);
+        simulateEvent(new DummyInteraction("bli", 1), element1);
+        simulateEvent(new MouseButtonDown(middleBtn), element1);
+        simulateEvent(new MouseButtonUp(middleBtn), element1);
+        simulateEvent(new MouseClick(middleBtn), element1);
+        simulateEvent(new DummyInteraction("blo", 1), element1);
+        simulateEvent(new DummyInteraction("blu", 1), element1);
+        assertCondensedMouseClicks("elem1", "", "", "elem1", "", "");
+
+        simulateEvent(new DummyInteraction("bla", 1), element2);
+        simulateEvent(new DummyInteraction("bli", 1), element2);
+        simulateEvent(new MouseButtonDown(rightBtn), element2);
+        simulateEvent(new MouseButtonUp(rightBtn), element2);
+        simulateEvent(new MouseClick(rightBtn), element2);
+        simulateEvent(new DummyInteraction("blo", 1), element2);
+        simulateEvent(new DummyInteraction("blu", 1), element2);
+        assertCondensedMouseClicks("elem1", "", "", "elem1", "", "", "", "", "elem2", "", "");
+
+        simulateEvent(new MouseButtonDown(leftBtn), element1);
+        simulateEvent(new MouseButtonUp(leftBtn), element1);
+        simulateEvent(new MouseClick(leftBtn), element2);
+        assertCondensedMouseClicks("elem1", "", "", "elem1", "", "", "", "", "elem2", "", "",
+                                   "", "", "elem2");
+
+        simulateEvent(new MouseButtonDown(middleBtn), element1);
+        simulateEvent(new MouseButtonUp(middleBtn), element1);
+        simulateEvent(new MouseClick(rightBtn), element1);
+        simulateEvent(new DummyInteraction("bla", 1), element2);
+        assertCondensedMouseClicks("elem1", "", "", "elem1", "", "", "", "", "elem2", "", "",
+                                   "", "", "elem2", "", "", "elem1", "");
+    }
+
+    /**
+     *
+     */
+    private void simulateEvent(IEventType eventType, IGUIElement guiElement) {
+        events.add(new Event(eventType, guiElement));
+    }
+
+    /**
+    *
+    */
+   private void assertCondensedMouseClicks(String... clickedTargets) {
+       MouseClickCondenser condenser = new MouseClickCondenser();
+       List<Event> result = condenser.condenseMouseClicks(events);
+       
+       assertEquals(clickedTargets.length, result.size());
+       
+       for (int i = 0; i < clickedTargets.length; i++) {
+           String clickedTarget = clickedTargets[i];
+           
+           if ((clickedTarget != null) && (!"".equals(clickedTarget))) {
+               assertTrue(result.get(i).getType() instanceof MouseClick);
+               assertTrue(result.get(i).getTarget() instanceof DummyGUIElement);
+               assertEquals
+                 (clickedTarget, ((DummyGUIElement) result.get(i).getTarget()).getStringIdentifier());
+           }
+           else {
+               assertFalse(result.get(i).getType() instanceof MouseClick);
+           }
+       }
+   }
+}
Index: /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenser.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenser.java	(revision 721)
+++ /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/MouseClickCondenser.java	(revision 721)
@@ -0,0 +1,110 @@
+// Module    : $RCSfile: MouseClickCondenser.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 31.08.2012 $
+// Project   : quest-core-events
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+package de.ugoe.cs.quest.eventcore.gui;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.IEventTarget;
+
+/**
+ * <p>
+ * This class condenses mouse clicks, i.e. it reduces a sequence of mouse button down,
+ * mouse button up and mouse click with the same button on the same event target to a single
+ * mouse click with that button on that target. The mouse button down and mouse button up events
+ * are discarded. For this, it iterates the provided sequence and identifies any match of the named
+ * event sequence pattern. This match is condensed to the mouse click event.
+ * </p>
+ * 
+ * @version $Revision: $ $Date: 31.08.2012$
+ * @author 2012, last modified by $Author: pharms$
+ */
+public class MouseClickCondenser {
+
+    /**
+     * <p>
+     * This method performs the work described in the description of the class. A new list is
+     * instantiated and returned. This list is filled with the events provided by the sequence
+     * being the parameter of the method except for mouse button down and mouse button up events
+     * which are followed by a mouse click event with the same button on the same target.
+     * </p>
+     * 
+     * @param sequence the event sequence to condense the mouse clicks in
+     * 
+     * @return the resulting sequence, in which mouse clicks are condensed to single mouse click
+     *         events
+     */
+    public List<Event> condenseMouseClicks(List<Event> sequence) {
+        List<Event> resultingSequence = new LinkedList<Event>();
+        
+        int index = 0;
+        while (index < sequence.size()) // -2 because we don't need to go to the end
+        {
+            if ((index + 2) < sequence.size()) {
+                Event mouseButtonDown = sequence.get(index);
+                Event mouseButtonUp = sequence.get(index + 1);
+                Event mouseClick = sequence.get(index + 2);
+                if (mouseClickSequenceFound(mouseButtonDown, mouseButtonUp, mouseClick)) {
+                    // skip the mouse button down and mouse button up event
+                    index += 2;
+                }
+            }
+
+            resultingSequence.add(sequence.get(index));
+            index++;
+        }
+
+        return resultingSequence;
+    }
+
+    /**
+     * 
+     */
+    private boolean mouseClickSequenceFound(Event mouseButtonDown,
+                                            Event mouseButtonUp,
+                                            Event mouseClick)
+    {
+        // check the first in a row of three for validity
+        if (!(mouseButtonDown.getType() instanceof MouseButtonDown)) {
+            return false;
+        }
+
+        // check the second node for validity
+        if (!(mouseButtonUp.getType() instanceof MouseButtonUp)) {
+            return false;
+        }
+
+        IEventTarget eventTarget = mouseButtonDown.getTarget();
+
+        if (!eventTarget.equals(mouseButtonUp.getTarget())) {
+            return false;
+        }
+
+        MouseButtonInteraction.Button button =
+            ((MouseButtonDown) mouseButtonDown.getType()).getButton();
+
+        if (!button.equals(((MouseButtonUp) mouseButtonUp.getType()).getButton())) {
+            return false;
+        }
+
+        // check the third node for validity
+        if (!(mouseClick.getType() instanceof MouseClick)) {
+            return false;
+        }
+
+        if (!eventTarget.equals(mouseClick.getTarget())) {
+            return false;
+        }
+
+        if (!button.equals(((MouseClick) mouseClick.getType()).getButton())) {
+            return false;
+        }
+
+        return true;
+    }
+
+}
Index: unk/quest-core-tasktrees/src/main/java/de/ugoe/cs/quest/tasktrees/temporalrelation/DefaultMouseClickReductionRule.java
===================================================================
--- /trunk/quest-core-tasktrees/src/main/java/de/ugoe/cs/quest/tasktrees/temporalrelation/DefaultMouseClickReductionRule.java	(revision 720)
+++ 	(revision )
@@ -1,130 +1,0 @@
-package de.ugoe.cs.quest.tasktrees.temporalrelation;
-
-import de.ugoe.cs.quest.eventcore.IEventTarget;
-import de.ugoe.cs.quest.eventcore.gui.MouseButtonDown;
-import de.ugoe.cs.quest.eventcore.gui.MouseButtonInteraction;
-import de.ugoe.cs.quest.eventcore.gui.MouseButtonUp;
-import de.ugoe.cs.quest.eventcore.gui.MouseClick;
-import de.ugoe.cs.quest.tasktrees.treeifc.IEventTask;
-import de.ugoe.cs.quest.tasktrees.treeifc.ISequence;
-import de.ugoe.cs.quest.tasktrees.treeifc.ITaskTreeBuilder;
-import de.ugoe.cs.quest.tasktrees.treeifc.ITaskTreeNode;
-import de.ugoe.cs.quest.tasktrees.treeifc.ITaskTreeNodeFactory;
-
-/**
- * TODO comment
- * 
- * @version $Revision: $ $Date: 18.03.2012$
- * @author 2012, last modified by $Author: patrick$
- */
-public class DefaultMouseClickReductionRule implements TemporalRelationshipRule {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see de.ugoe.cs.tasktree.temporalrelation.TemporalRelationshipRule#apply(TaskTreeNode,
-     * TaskTreeBuilder, TaskTreeNodeFactory)
-     */
-    @Override
-    public RuleApplicationResult apply(ITaskTreeNode        parent,
-                                       ITaskTreeBuilder     builder,
-                                       ITaskTreeNodeFactory nodeFactory,
-                                       boolean              finalize)
-    {
-        if (!(parent instanceof ISequence)) {
-            return null;
-        }
-
-        RuleApplicationResult result = new RuleApplicationResult();
-
-        int index = 0;
-        while (index < parent.getChildren().size() - 2) // -2 because we don't need to go to the end
-        {
-            if (mouseClickSequenceFound(parent.getChildren().get(index),
-                                        parent.getChildren().get(index + 1),
-                                        parent.getChildren().get(index + 2)))
-            {
-                builder.removeChild((ISequence) parent, index);
-                builder.removeChild((ISequence) parent, index);
-                result.setRuleApplicationStatus(RuleApplicationStatus.RULE_APPLICATION_FINISHED);
-                return result;
-            }
-            else if
-                ((parent.getChildren().get(index) instanceof ISequence) &&
-                 (parent.getChildren().get(index).getChildren().size() == 2) &&
-                 (mouseClickSequenceFound(parent.getChildren().get(index).getChildren().get(0),
-                                          parent.getChildren().get(index).getChildren().get(1),
-                                          parent.getChildren().get(index + 1))))
-            {
-                builder.removeChild((ISequence) parent, index);
-                result.setRuleApplicationStatus(RuleApplicationStatus.RULE_APPLICATION_FINISHED);
-                return result;
-            }
-
-            index++;
-        }
-
-        return result;
-    }
-
-    /**
-     * 
-     */
-    private boolean mouseClickSequenceFound(ITaskTreeNode mouseButtonDown,
-                                            ITaskTreeNode mouseButtonUp,
-                                            ITaskTreeNode mouseClick)
-    {
-        // check the first in a row of three for validity
-        if (!(mouseButtonDown instanceof IEventTask)) {
-            return false;
-        }
-
-        if (!(((IEventTask) mouseButtonDown).getEventType() instanceof MouseButtonDown)) {
-            return false;
-        }
-
-        // check the second node for validity
-        if (!(mouseButtonUp instanceof IEventTask)) {
-            return false;
-        }
-
-        IEventTarget eventTarget = ((IEventTask) mouseButtonDown).getEventTarget();
-
-        if (!eventTarget.equals(((IEventTask) mouseButtonUp).getEventTarget())) {
-            return false;
-        }
-
-        if (!(((IEventTask) mouseButtonUp).getEventType() instanceof MouseButtonUp)) {
-            return false;
-        }
-
-        MouseButtonInteraction.Button button =
-                ((MouseButtonDown) ((IEventTask) mouseButtonDown).getEventType()).getButton();
-
-        if (!button.equals(((MouseButtonUp) ((IEventTask) mouseButtonUp).getEventType())
-            .getButton()))
-        {
-            return false;
-        }
-
-        // check the third node for validity
-        if (!(mouseClick instanceof IEventTask)) {
-            return false;
-        }
-
-        if (!eventTarget.equals(((IEventTask) mouseClick).getEventTarget())) {
-            return false;
-        }
-
-        if (!(((IEventTask) mouseClick).getEventType() instanceof MouseClick)) {
-            return false;
-        }
-
-        if (!button.equals(((MouseClick) ((IEventTask) mouseClick).getEventType()).getButton())) {
-            return false;
-        }
-
-        return true;
-    }
-
-}
Index: /trunk/quest-core-tasktrees/src/main/java/de/ugoe/cs/quest/tasktrees/temporalrelation/TemporalRelationshipRuleManager.java
===================================================================
--- /trunk/quest-core-tasktrees/src/main/java/de/ugoe/cs/quest/tasktrees/temporalrelation/TemporalRelationshipRuleManager.java	(revision 720)
+++ /trunk/quest-core-tasktrees/src/main/java/de/ugoe/cs/quest/tasktrees/temporalrelation/TemporalRelationshipRuleManager.java	(revision 721)
@@ -43,5 +43,4 @@
         LOG.info("initializing");
 
-        ruleIndex.add(new DefaultMouseClickReductionRule());
         ruleIndex.add(new DefaultEventTargetSequenceDetectionRule());
         ruleIndex.add(new TrackBarSelectionDetectionRule(nodeEqualityRuleManager));
