Index: /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorterTest.java
===================================================================
--- /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorterTest.java	(revision 765)
+++ /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorterTest.java	(revision 765)
@@ -0,0 +1,432 @@
+
+package de.ugoe.cs.quest.eventcore.gui;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.mockito.Mockito.*;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.gui.KeyInteractionSorter.CleanupMode;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonInteraction.Button;
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.TextConsole;
+
+/**
+ * @author Patrick Harms, Steffen Herbold
+ */
+public class KeyInteractionSorterTest {
+
+    @Test
+    public void testSortKeyInteractions_1() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // Normal pressing and releasing of A and B
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_2() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // A is pressed and not released before B is pressed
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_3() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // SHIFT is pressed and released after all keys are pressed
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_4() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // SHIFT is released before the last key is released
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_5() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // SHIFT is released before all other keys are released
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_C), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_C), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_C), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_6() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // SHIFT, CTRL and ALT are pressed and released after all keys are pressed
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_7() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // now SHIFT, CTRL and ALT are released before the last key is released
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_8() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // SHIFT, CTRL and ALT are released in another order and before some other keys are
+        // released
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_C), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_C), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_C), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_9() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // holding of A
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_10() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // holding of shift and meanwhile pressing of A
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        expected.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_11() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // Check if keyboard focus change is moved in front of a sequence in case it is in between a
+        // pressed
+        // released pair
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyboardFocusChange(), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+
+        expected.add(new Event(new KeyboardFocusChange(), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_12() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter();
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // Check if mouse events stay where they are
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new MouseButtonDown(Button.LEFT), guiElement));
+        input.add(new Event(new MouseButtonUp(Button.LEFT), guiElement));
+        input.add(new Event(new MouseClick(Button.LEFT), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new MouseButtonDown(Button.LEFT), guiElement));
+        expected.add(new Event(new MouseButtonUp(Button.LEFT), guiElement));
+        expected.add(new Event(new MouseClick(Button.LEFT), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_13() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter(CleanupMode.REMOVAL);
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // Check if mouse events stay where they are
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @Test
+    public void testSortKeyInteractions_14() {
+        List<Event> input = new LinkedList<Event>();
+        List<Event> expected = new LinkedList<Event>();
+
+        KeyInteractionSorter sorter = new KeyInteractionSorter(CleanupMode.ADDITION);
+
+        IGUIElement guiElement = mock(IGUIElement.class);
+
+        // Check if mouse events stay where they are
+        input.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
+        input.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
+
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_A), guiElement));
+        expected.add(new Event(new KeyTyped(VirtualKey.LETTER_B), guiElement));
+
+        List<Event> output = sorter.sortKeyInteractions(input);
+
+        assertEquals(expected, output);
+    }
+
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        Console.reset();
+        Console.getInstance().registerTraceListener(new TextConsole(Level.INFO));
+    }
+}
Index: unk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/SortedInteractionEventListTest.java
===================================================================
--- /trunk/quest-core-events-test/src/test/java/de/ugoe/cs/quest/eventcore/gui/SortedInteractionEventListTest.java	(revision 764)
+++ 	(revision )
@@ -1,355 +1,0 @@
-
-package de.ugoe.cs.quest.eventcore.gui;
-
-import static org.junit.Assert.assertEquals;
-
-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.guimodel.AbstractDefaultGUIElement;
-import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
-import de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec;
-import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
-
-/**
- * @author Patrick Harms
- */
-public class SortedInteractionEventListTest {
-
-    /**
-   * 
-   */
-    @Test
-    public void testDifferentCombinationKeyCombinations() {
-        List<Event> checkList = new ArrayList<Event>();
-        SortedInteractionEventList eventList = new SortedInteractionEventList();
-
-        IGUIElement guiElement = new AbstractDefaultGUIElement(null, null) {
-
-            /**  */
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public void updateSpecification(IGUIElementSpec furtherSpec) {
-                // ignore
-            }
-
-            @Override
-            public String getPlatform() {
-                return "TEST";
-            }
-
-            @Override
-            public String getStringIdentifier() {
-                return "DUMMY";
-            }
-
-        };
-
-        // check first of all a normal pressing and releasing of A and B
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_B), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_B), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // check what happens if A is pressed and not released before B is pressed
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_C), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_D), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_C), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_D), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_C), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_C), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_D), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_D), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT is pressed and released after all keys are pressed
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_E), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_E), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_F), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_F), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_E), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_E), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_F), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_F), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT is released before the last key is released
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_G), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_G), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_H), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_H), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_G), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_G), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_H), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_H), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT is released before all other keys are released
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_I), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_J), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_K), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_J), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_K), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_I), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_I), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_I), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_J), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_J), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_K), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_K), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT, CTRL and ALT are pressed and released after all keys are pressed
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_L), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_L), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_M), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_M), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_L), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_L), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_M), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_M), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT, CTRL and ALT are released before the last key is released
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_N), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_N), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_O), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_O), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_N), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_N), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_O), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_O), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // now SHIFT, CTRL and ALT are released in another order and before some other keys are
-        // released
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_P), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_Q), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_R), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_Q), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_R), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_P), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_P), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_P), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_Q), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_Q), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_R), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_R), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.ALT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.CONTROL), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-    }
-
-    /**
-   * 
-   */
-    @Test
-    public void testSeveralSubsequentKeyPressedEvents() {
-        List<Event> checkList = new ArrayList<Event>();
-        SortedInteractionEventList eventList = new SortedInteractionEventList();
-
-        IGUIElement guiElement = new AbstractDefaultGUIElement(null, null) {
-
-            /**  */
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public void updateSpecification(IGUIElementSpec furtherSpec) {
-                // ignore
-            }
-
-            @Override
-            public String getPlatform() {
-                return "TEST";
-            }
-
-            @Override
-            public String getStringIdentifier() {
-                return "DUMMY";
-            }
-
-        };
-
-        // check first of all a normal pressing and releasing of A and B
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-
-        // check first of all a normal pressing and releasing of A and B
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        eventList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        eventList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.SHIFT), guiElement));
-        checkList.add(new Event(new KeyPressed(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.LETTER_A), guiElement));
-        checkList.add(new Event(new KeyReleased(VirtualKey.SHIFT), guiElement));
-
-        assertEquals(checkList.size(), eventList.size());
-
-        for (int i = 0; i < checkList.size(); i++) {
-            assertEquals(checkList.get(i).getType(), eventList.get(i).getType());
-        }
-    }
-
-}
Index: unk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionCleaner.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionCleaner.java	(revision 764)
+++ 	(revision )
@@ -1,88 +1,0 @@
-
-package de.ugoe.cs.quest.eventcore.gui;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-
-import de.ugoe.cs.quest.eventcore.Event;
-import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
-import de.ugoe.cs.util.console.Console;
-
-/**
- * <p>
- * Because often not all events are recorded properly, it is possible that there is not always a
- * KEYDOWN interaction each KEYUP interaction. This class provides the functionality to correct
- * these mismatches with one of the following two strategies:
- * <ul>
- * <li>Removal: each interaction that does not form a proper KEYDOWN/KEYUP pair is removed.</li>
- * <li>Addition: for each interaction that does not form a proper KEYDOWN/KEYUP pair, the missing
- * message is added to the sequence directly before/after the existing message.</li>
- * </ul>
- * </p>
- * 
- * @version $Revision: $ $Date: Sep 3, 2012$
- * @author 2012, last modified by $Author: sherbold$
- */
-public class KeyInteractionCleaner {
-
-    /**
-     * <p>
-     * Describes the clean-up mode.
-     * </p>
-     * 
-     * @version $Revision: $ $Date: Sep 3, 2012$
-     * @author 2012, last modified by $Author: sherbold$
-     */
-    public enum CleanupMode {
-        REMOVAL, ADDITION
-    };
-
-    /**
-     * <p>
-     * Creates a copy of the passed sequence and performs the clean-up (see class description) on
-     * the copy.
-     * </p>
-     * 
-     * @param sequence
-     *            sequence on which the clean-up is performed
-     * @param mode
-     *            defines whether removal or addition mode is used
-     * @return copy of sequence with cleaned up key interactions
-     */
-    public List<Event> cleanupKeyInteractions(List<Event> sequence, CleanupMode mode) {
-        List<Event> sequenceCopy = new LinkedList<Event>(sequence);
-        List<VirtualKey> pressedKeys = new LinkedList<VirtualKey>();
-        
-        for( int i=0 ; i<sequenceCopy.size() ; i++ ) {
-            Event event = sequenceCopy.get(i);
-            if( event.getType() instanceof KeyPressed ) {
-                pressedKeys.add(((KeyPressed) event.getType()).getKey());
-            }
-            if( event.getType() instanceof KeyReleased ) {
-                VirtualKey key = ((KeyReleased) event.getType()).getKey();
-                if( pressedKeys.contains(key)) {
-                    pressedKeys.remove(key);
-                }
-                else {
-                    Console.traceln(Level.INFO, "KeyReleased without KeyDown for key " + key + " found at index " + i);
-                    switch(mode) {
-                        case REMOVAL:
-                            sequenceCopy.remove(i);
-                            i--;
-                            break;
-                        case ADDITION:
-                            KeyPressed pressed = new KeyPressed(key);
-                            Event keyPressedEvent = new Event(pressed, event.getTarget());
-                            sequenceCopy.add(i, keyPressedEvent);
-                            i++;
-                            break;
-                        default:
-                            throw new AssertionError("reached source code that should be unreachable");
-                    }
-                }
-            }
-        }
-        return sequenceCopy;
-    }
-}
Index: /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorter.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorter.java	(revision 765)
+++ /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyInteractionSorter.java	(revision 765)
@@ -0,0 +1,199 @@
+
+package de.ugoe.cs.quest.eventcore.gui;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+import java.util.logging.Level;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * 
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @version $Revision: $ $Date: Sep 4, 2012$
+ * @author 2012, last modified by $Author: sherbold$
+ */
+public class KeyInteractionSorter {
+
+    /**
+     * <p>
+     * Describes the clean-up mode.
+     * </p>
+     * 
+     * @version $Revision: $ $Date: Sep 3, 2012$
+     * @author 2012, last modified by $Author: sherbold$
+     */
+    public static enum CleanupMode {
+        REMOVAL, ADDITION
+    };
+
+    private final CleanupMode mode;
+
+    public KeyInteractionSorter() {
+        this(CleanupMode.ADDITION);
+    }
+
+    public KeyInteractionSorter(CleanupMode mode) {
+        this.mode = mode;
+    }
+
+    public List<Event> sortKeyInteractions(final List<Event> sequence) {
+        List<Event> sortedSequence = new LinkedList<Event>(sequence);
+
+        handleIncompleteKeyPairs(sortedSequence);
+        sortCombinationKeyPairs(sortedSequence);
+
+        return sortedSequence;
+    }
+
+    private void sortCombinationKeyPairs(List<Event> sequence) {
+        LinkedList<VirtualKey> pressedCombinationKeys = new LinkedList<VirtualKey>();
+
+        for (int i = 0; i < sequence.size(); i++) {
+            Event event = sequence.get(i);
+            if (event.getType() instanceof KeyPressed) {
+                final VirtualKey key = ((KeyPressed) event.getType()).getKey();
+                if (key.isCombinationKey()) {
+                    pressedCombinationKeys.add(key);
+                }
+            }
+            if (event.getType() instanceof KeyReleased) {
+                final VirtualKey key = ((KeyReleased) event.getType()).getKey();
+                if (key.isCombinationKey()) {
+                    /*
+                     * if( pressedCombinationKeys.isEmpty() ) { Console.traceln(Level.INFO, "" + i);
+                     * for( int j=i-30 ; j<=i ; j++ ) { Console.traceln(Level.INFO,
+                     * sequence.get(i).toString()); } }
+                     */
+                    if (key.equals(pressedCombinationKeys.getLast())) {
+                        pressedCombinationKeys.removeLast();
+                    }
+                    else {
+                        // look-ahead to find new position
+                        int offset;
+                        for (offset = 1; offset + i < sequence.size(); offset++) {
+                            Event lookaheadEvent = sequence.get(i + offset);
+                            if (lookaheadEvent.getType() instanceof KeyReleased) {
+                                if (((KeyReleased) lookaheadEvent.getType()).getKey()
+                                    .equals(pressedCombinationKeys.getLast()))
+                                {
+                                    break;
+                                }
+                            }
+                        }
+                        sequence.add(i + offset + 1, event);
+                        sequence.remove(i);
+                        i--;
+                    }
+                }
+            }
+        }
+    }
+
+    private void handleIncompleteKeyPairs(List<Event> sequence) {
+        Set<VirtualKey> pressedKeys = new HashSet<VirtualKey>();
+        int firstPressedIndex = -1;
+
+        Set<VirtualKey> pressedCombinationKeysSession = new HashSet<VirtualKey>();
+
+        for (int i = 0; i < sequence.size(); i++) {
+            Event event = sequence.get(i);
+            if (event.getType() instanceof KeyboardFocusChange) {
+                if (firstPressedIndex != -1) {
+                    sequence.remove(i);
+                    sequence.add(firstPressedIndex, event);
+                }
+            }
+
+            if (event.getType() instanceof KeyPressed) {
+                if (pressedKeys.isEmpty()) {
+                    firstPressedIndex = i;
+                }
+                VirtualKey key = ((KeyPressed) event.getType()).getKey();
+                if (!key.isCombinationKey()) {
+                    ListIterator<Event> iter = sequence.listIterator(i);
+                    iter.next();
+                    iter.set(new Event(new KeyTyped(key), event.getTarget()));
+                }
+                else {
+                    pressedCombinationKeysSession.add(key);
+                    if (pressedKeys.contains(key)) {
+                        sequence.remove(i);
+                        i--;
+                    }
+                }
+                pressedKeys.add(key);
+            }
+            if (event.getType() instanceof KeyReleased) {
+                VirtualKey key = ((KeyReleased) event.getType()).getKey();
+                if (!key.isCombinationKey()) {
+                    if (pressedKeys.contains(key)) {
+                        sequence.remove(i);
+                        i--;
+                    }
+                    else {
+                        // found KeyReleased event without KeyPressed
+                        switch (mode)
+                        {
+                            case REMOVAL:
+                                sequence.remove(i);
+                                i--;
+                                break;
+                            case ADDITION:
+                                ListIterator<Event> iter = sequence.listIterator(i);
+                                iter.next();
+                                iter.set(new Event(new KeyTyped(key), event.getTarget()));
+                                break;
+                            default:
+                                throw new AssertionError(
+                                                         "reached source code that should be unreachable");
+                        }
+                    }
+                }
+                else {
+                    if (!pressedKeys.contains(key)) {
+                        if (pressedCombinationKeysSession.contains(key)) {
+                            Console.traceln(Level.SEVERE, "Found a " + key +
+                                " KeyReleased event without a KeyPressed event." +
+                                "The event will be dropped and the session is possibly faulty.");
+                            sequence.remove(i);
+                            i--;
+                        }
+                        else {
+                            Console
+                                .traceln(Level.SEVERE,
+                                         "Found a " +
+                                             key +
+                                             " KeyReleased event without a KeyPressed event." +
+                                             "Since no KeyPressed of key " +
+                                             key +
+                                             " has been part of the session " +
+                                             "till now, we assume that the key has been pressed since the beginning " +
+                                             "of the session and add a KeyPressed event for " +
+                                             key + " to the start " + "of the session.");
+                            sequence.add(0, new Event(new KeyPressed(key), event.getTarget()));
+                            i++;
+                        }
+                    }
+                }
+                pressedKeys.remove(key);
+                if (pressedKeys.isEmpty()) {
+                    firstPressedIndex = -1;
+                }
+            }
+        }
+        if (!pressedKeys.isEmpty()) {
+            Console
+                .traceln(Level.WARNING,
+                         "There was probably a failure during the handling of incomplete key event pairs.");
+        }
+    }
+}
Index: /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyTyped.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyTyped.java	(revision 765)
+++ /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/KeyTyped.java	(revision 765)
@@ -0,0 +1,81 @@
+
+package de.ugoe.cs.quest.eventcore.gui;
+
+import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
+
+public class KeyTyped extends KeyInteraction {
+
+    /**  */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @param key
+     */
+    public KeyTyped(VirtualKey key) {
+        super(key);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.harms.attef.userinteraction.Interaction#getName()
+     */
+    public String getName() {
+        return "KeyTyped " + super.getKey();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "typed key " + super.getKey();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.harms.attef.userinteraction.Interaction#startsLogicalSequence()
+     */
+    public boolean startsLogicalSequence() {
+        // TODO handle lock keys correctly
+        return super.getKey().isCombinationKey();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.harms.attef.userinteraction.Interaction#finishesLogicalSequence()
+     */
+    public boolean finishesLogicalSequence() {
+        return false;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(Object other) {
+        if (other instanceof KeyTyped) {
+            return (super.getKey() == ((KeyTyped) other).getKey());
+        }
+        else {
+            return false;
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return super.getKey().hashCode();
+    }
+
+}
Index: unk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/SortedInteractionEventList.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/SortedInteractionEventList.java	(revision 764)
+++ 	(revision )
@@ -1,242 +1,0 @@
-package de.ugoe.cs.quest.eventcore.gui;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import de.ugoe.cs.quest.eventcore.Event;
-
-/**
- * TODO comment
- * 
- * @version $Revision: $ $Date: $
- * @author 2011, last modified by $Author: $
- */
-public class SortedInteractionEventList extends ArrayList<Event> implements List<Event> {
-    
-    /**  */
-    private static final long serialVersionUID = 1L;
-    
-    /** stores the events to be handled later in the order, they should be processed */
-    private List<KeyEventPair> eventPairs = new ArrayList<KeyEventPair>();
-
-    /**
-     * this method sorts interaction events for pressed keys. The reason is, that sometimes the
-     * release of one key comes after the pressing of the succeeding key. This only makes sense for
-     * shift, ctrl or alt keys, but not for usual characters. So the events are sorted.<br/>
-     * Furthermore, this methods creates key released events in the specific case, where a key is
-     * pressed for a long time. Here, many subsequent key pressed events for the same key can be
-     * observed, for which there are no key released events.
-     */
-    @Override
-    public boolean add(Event event) {
-        if (event.getType() instanceof KeyInteraction) {
-            for (int i = 0; i < eventPairs.size(); i++) {
-                KeyEventPair eventPair = eventPairs.get(i);
-
-                if (eventPair.process(event)) {
-                    // handle all leading and completed event pairs, if any
-                    while ((eventPairs.size() > 0) && (eventPairs.get(0).isComplete())) {
-                        addEventPair(eventPairs.get(0));
-                        eventPairs.remove(0);
-                    }
-                    return true;
-                }
-            }
-
-            // in the case the log has an error because it has a key up for which there is no
-            // key down, log a warning and add the key up event without sorting it
-            if (event.getType() instanceof KeyPressed) {
-                eventPairs.add(new KeyEventPair(event));
-                return true;
-            }
-            else {
-                return super.add(event);
-            }
-        }
-        else {
-            // any other event is simply added
-            return super.add(event);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.util.ArrayList#add(int, java.lang.Object)
-     */
-    @Override
-    public void add(int index, Event event) {
-        List<Event> remaining = new ArrayList<Event>();
-
-        while (index < super.size()) {
-            remaining.add(super.remove(index));
-        }
-
-        add(event);
-        addAll(remaining);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.util.ArrayList#addAll(java.util.Collection)
-     */
-    @Override
-    public boolean addAll(Collection<? extends Event> events) {
-        int initialSize = super.size();
-
-        for (Event event : events) {
-            add(event);
-        }
-
-        return initialSize != super.size();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.util.ArrayList#addAll(int, java.util.Collection)
-     */
-    @Override
-    public boolean addAll(int index, Collection<? extends Event> events) {
-        int initialSize = super.size();
-
-        List<Event> remaining = new ArrayList<Event>();
-
-        while (index < super.size()) {
-            remaining.add(super.remove(index));
-        }
-
-        addAll(events);
-        addAll(remaining);
-
-        return initialSize != super.size();
-    }
-
-    /**
-     *
-     */
-    private void addEventPair(KeyEventPair eventPair) {
-        super.add(eventPair.first);
-
-        for (KeyEventPair child : eventPair.children) {
-            addEventPair(child);
-        }
-
-        super.add(eventPair.second);
-    }
-
-    /**
-     *
-     */
-    private static class KeyEventPair implements Serializable {
-        
-        /**  */
-        private static final long serialVersionUID = 1L;
-
-        /** the first key interaction event */
-        private Event first;
-
-        /** the second key interaction event */
-        private Event second;
-
-        /** the children, this event pair may have */
-        private List<KeyEventPair> children = new ArrayList<KeyEventPair>();
-
-        /**
-         *
-         */
-        private KeyEventPair(Event first) {
-            if (!(first.getType() instanceof KeyPressed)) {
-                throw new IllegalArgumentException
-                  ("can only handle key pressed interaction events as first element of an" +
-                   "event pair");
-            }
-            this.first = first;
-        }
-
-        /**
-         * sorts the event as the second of the pair or as the closing of this. Returns true, if
-         * this matched, false else
-         */
-        private boolean process(Event event) {
-            if (!(event.getType() instanceof KeyInteraction)) {
-                throw new IllegalArgumentException("can only handle key interaction events");
-            }
-
-            if (this.isComplete()) {
-                // do not process events, if there are no more events expected
-                return false;
-            }
-
-            if ((event.getType() instanceof KeyReleased) &&
-                (((KeyInteraction) first.getType()).getKey() ==
-                 ((KeyInteraction) event.getType()).getKey()) &&
-                (second == null))
-            {
-                // this is the release of the represented key. Store it and notify the processing.
-                second = event;
-                return true;
-            }
-            else if ((event.getType() instanceof KeyPressed) &&
-                     (((KeyInteraction) first.getType()).getKey() ==
-                      ((KeyInteraction) event.getType()).getKey()) &&
-                     (second == null))
-            {
-                // the key was pressed before it was released again. This happens, if the key
-                // stays pressed for a long time. Generate a key released event but do not mark
-                // the new event as processed
-                second = new Event
-                    (new KeyReleased(((KeyInteraction) event.getType()).getKey()),
-                     first.getTarget());
-                
-                return false;
-            }
-            else if (((KeyInteraction) first.getType()).getKey().isCombinationKey() &&
-                     (((KeyInteraction) first.getType()).getKey() !=
-                      ((KeyInteraction) event.getType()).getKey()))
-            {
-                // this pair may have children. Let the event be processed by the children. If this
-                // doesn't work, add the event as a new child pair, if it is a new key pressed
-
-                for (KeyEventPair child : children) {
-                    if (child.process(event)) {
-                        return true;
-                    }
-                }
-
-                if (event.getType() instanceof KeyPressed) {
-                    children.add(new KeyEventPair(event));
-                    return true;
-                }
-                else {
-                    return false;
-                }
-            }
-            else {
-                // this pair may not have children
-                return false;
-            }
-        }
-
-        /**
-         * @return
-         */
-        private boolean isComplete() {
-            if ((first != null) && (second != null)) {
-                for (KeyEventPair child : children) {
-                    if (!child.isComplete()) {
-                        return false;
-                    }
-                }
-
-                return true;
-            }
-            else {
-                return false;
-            }
-        }
-    }
-}
Index: /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/TextInputDetector.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/TextInputDetector.java	(revision 764)
+++ /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/gui/TextInputDetector.java	(revision 765)
@@ -228,6 +228,6 @@
             event = sequence.get(i);
             
-            if (event.getType() instanceof KeyPressed) {
-                VirtualKey key = ((KeyPressed) event.getType()).getKey();
+            if (event.getType() instanceof KeyPressed || event.getType() instanceof KeyTyped) {
+                VirtualKey key = ((KeyInteraction) event.getType()).getKey();
 
                 pressedKeys.add(key);
@@ -251,6 +251,6 @@
                 }
             }
-            else if (event.getType() instanceof KeyReleased) {
-                pressedKeys.remove(((KeyReleased) event.getType()).getKey());
+            else if (event.getType() instanceof KeyReleased || event.getType() instanceof KeyTyped) {
+                pressedKeys.remove(((KeyInteraction) event.getType()).getKey());
             }
             else {
Index: unk/quest-ui-core/src/main/java/de/ugoe/cs/quest/commands/sequences/CMDcleanupKeyInteractions.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/commands/sequences/CMDcleanupKeyInteractions.java	(revision 764)
+++ 	(revision )
@@ -1,95 +1,0 @@
-
-package de.ugoe.cs.quest.commands.sequences;
-
-import java.security.InvalidParameterException;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-
-import de.ugoe.cs.quest.CommandHelpers;
-import de.ugoe.cs.quest.SequenceInstanceOf;
-import de.ugoe.cs.quest.eventcore.Event;
-import de.ugoe.cs.quest.eventcore.gui.KeyInteractionCleaner;
-import de.ugoe.cs.quest.eventcore.gui.KeyInteractionCleaner.CleanupMode;
-import de.ugoe.cs.util.console.Command;
-import de.ugoe.cs.util.console.Console;
-import de.ugoe.cs.util.console.GlobalDataContainer;
-
-/**
- * <p>
- * TODO comment
- * </p>
- * 
- * @version $Revision: $ $Date: Sep 3, 2012$
- * @author 2012, last modified by $Author: sherbold$
- */
-public class CMDcleanupKeyInteractions implements Command {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void run(List<Object> parameters) {
-        String sequencesName = null;
-        String newSequencesName = null;
-        String modeString = null;
-        if (parameters.size() > 2) {
-            sequencesName = (String) parameters.get(0);
-            newSequencesName = (String) parameters.get(1);
-            modeString = (String) parameters.get(2);
-        }
-        else {
-            throw new InvalidParameterException();
-        }
-
-        Collection<List<Event>> sequences = null;
-        Object dataObject = GlobalDataContainer.getInstance().getData(sequencesName);
-        if (dataObject == null) {
-            CommandHelpers.objectNotFoundMessage(sequencesName);
-            return;
-        }
-        if (!SequenceInstanceOf.isCollectionOfSequences(dataObject)) {
-            CommandHelpers.objectNotType(sequencesName, "Collection<List<Event>>");
-            return;
-        }
-        sequences = (Collection<List<Event>>) dataObject;
-
-        KeyInteractionCleaner.CleanupMode mode = null;
-        try {
-            mode = CleanupMode.valueOf(modeString);
-        }
-        catch (IllegalArgumentException e) {
-            Console.printerrln("Invalid mode. Only REMOVAL and ADDITION are allowed values!");
-            return;
-        }
-
-        Collection<List<Event>> newSequences = new LinkedList<List<Event>>();
-        KeyInteractionCleaner cleaner = new KeyInteractionCleaner();
-
-        int i=0;
-        for (List<Event> sequence : sequences) {
-            Console.traceln(Level.INFO, "Cleaning up sequence " + i++);
-            newSequences.add(cleaner.cleanupKeyInteractions(sequence, mode));
-        }
-
-        if (GlobalDataContainer.getInstance().addData(newSequencesName, newSequences)) {
-            CommandHelpers.dataOverwritten(newSequencesName);
-        }
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see de.ugoe.cs.util.console.Command#help()
-     */
-    @Override
-    public String help() {
-        return "cleanupKeyInteractions <sequencesName> <newSequencesName> <mode>";
-    }
-
-}
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/commands/sequences/CMDsortKeyInteractions.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/commands/sequences/CMDsortKeyInteractions.java	(revision 764)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/commands/sequences/CMDsortKeyInteractions.java	(revision 765)
@@ -6,21 +6,24 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.logging.Level;
 
 import de.ugoe.cs.quest.CommandHelpers;
 import de.ugoe.cs.quest.SequenceInstanceOf;
 import de.ugoe.cs.quest.eventcore.Event;
-import de.ugoe.cs.quest.eventcore.gui.SortedInteractionEventList;
+import de.ugoe.cs.quest.eventcore.gui.KeyInteractionSorter;
+import de.ugoe.cs.quest.eventcore.gui.KeyInteractionSorter.CleanupMode;
 import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
 import de.ugoe.cs.util.console.GlobalDataContainer;
 
 /**
  * <p>
- * Command to sort the key interactions in a sequence of events. An example, the sequence
- * to write the upper case D
+ * Command to sort the key interactions in a sequence of events. An example, the sequence to write
+ * the upper case D
  * <ul>
- *   <li>press shift key</li>
- *   <li>press D key</li>
- *   <li>release shift key</li>
- *   <li>release D key</li>
+ * <li>press shift key</li>
+ * <li>press D key</li>
+ * <li>release shift key</li>
+ * <li>release D key</li>
  * </ul>
  * 
@@ -28,12 +31,12 @@
  * 
  * <ul>
- *   <li>press shift key</li>
- *   <li>press D key</li>
- *   <li>release D key</li>
- *   <li>release shift key</li>
+ * <li>press shift key</li>
+ * <li>press D key</li>
+ * <li>release D key</li>
+ * <li>release shift key</li>
  * </ul>
  * 
- * in which the first pressed key (shift in this case) is always released last. The same is done
- * for the alt and the ctrl keys.
+ * in which the first pressed key (shift in this case) is always released last. The same is done for
+ * the alt and the ctrl keys.
  * 
  * </p>
@@ -64,4 +67,5 @@
         String sequencesName;
         String newSequencesName;
+        String modeString = "ADDITION";
         try {
             sequencesName = (String) parameters.get(0);
@@ -71,4 +75,7 @@
             else {
                 newSequencesName = sequencesName;
+            }
+            if (parameters.size() > 2) {
+                modeString = (String) parameters.get(2);
             }
         }
@@ -88,17 +95,21 @@
         }
 
+        CleanupMode mode = null;
+        try {
+            mode = CleanupMode.valueOf(modeString);
+        }
+        catch (IllegalArgumentException e) {
+            Console.printerrln("Invalid mode. Only REMOVAL and ADDITION are allowed values!");
+            return;
+        }
+
         sequences = (Collection<List<Event>>) dataObject;
-        SortedInteractionEventList sortedEventList;
 
         Collection<List<Event>> newSequences = new LinkedList<List<Event>>();
-        
+
+        int i = 1;
         for (List<Event> sequence : sequences) {
-            sortedEventList = new SortedInteractionEventList();
-            
-            for (Event event : sequence) {
-                sortedEventList.add(event);
-            }
-            
-            newSequences.add(sortedEventList);
+            Console.traceln(Level.INFO, "Processing sequence " + i++);
+            newSequences.add(new KeyInteractionSorter(mode).sortKeyInteractions(sequence));
         }
 
@@ -106,5 +117,5 @@
             CommandHelpers.dataOverwritten(newSequencesName);
         }
-        
+
     }
 
Index: unk/quest-ui-core/src/main/resources/manuals/cleanupKeyInteractions
===================================================================
--- /trunk/quest-ui-core/src/main/resources/manuals/cleanupKeyInteractions	(revision 764)
+++ 	(revision )
@@ -1,10 +1,0 @@
-Deletes an object, e.g., a selection of sequences, from the global data storage.
-
-$USAGE$
-<sequencesName> name of the sequences to be cleaned-up
-<neqSequencesName> name of the cleaned-up sequences
-<mode> defines whether KeyReleased events without a matching KeyPressed are removed (mode: REMOVAL) or if a matching KeyPressed event is added directly in front of the KeyReleased event (mode: ADDITION)
-
-Example(s):
-cleanupKeyInteractions sequences cleanedSequences REMOVAL
-cleanupKeyInteractions sequences cleanedSequences ADDITION
