Index: /trunk/autoquest-test-utils/src/main/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoder.java
===================================================================
--- /trunk/autoquest-test-utils/src/main/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoder.java	(revision 1326)
+++ /trunk/autoquest-test-utils/src/main/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoder.java	(revision 1327)
@@ -17,7 +17,9 @@
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -99,4 +101,6 @@
         }
         
+        correctTargets(taskInstanceList);
+        
         return taskInstanceList;
     }
@@ -190,8 +194,5 @@
         }
         else {
-            Event event = !task.getInstances().isEmpty() ?
-                ((IEventTaskInstance) task.getInstances().iterator().next()).getEvent() :
-                createUserInteractionEvent(type, id, matcher.group(4));
-                
+            Event event = createUserInteractionEvent(type, id, matcher.group(4));
             instance = taskFactory.createNewTaskInstance((IEventTask) task, event);
         }  
@@ -237,15 +238,9 @@
 
     /**
-     * <p>
-     * TODO: comment
-     * </p>
-     *
-     * @param id
-     * @param type
-     * @param children
-     * @return
+     *
      */
     private ITask getCreateTask(String id, String type, List<ITaskInstance> children) {
-        ITask task = tasks.get(id);
+        String effectiveId = id;
+        ITask task = tasks.get(effectiveId);
         
         if (task == null) {
@@ -263,7 +258,12 @@
             }
             else {
-                task = taskFactory.createNewEventTask(type + " --> " + id);
+                effectiveId = type + " --> " + id;
+                task = tasks.get(effectiveId);
+                
+                if (task == null) {
+                    task = taskFactory.createNewEventTask(effectiveId);
+                }
             }  
-            tasks.put(id, task);
+            tasks.put(effectiveId, task);
 
             for (ITaskInstance childInstance : children) {
@@ -332,28 +332,11 @@
         IEventTarget eventTarget = targets.get(targetId);
         if (eventTarget == null) {
-            eventTarget = determineTarget(type, targetId, furtherInfo);
+            eventTarget = new DummyGUIElement(targetId);
             targets.put(targetId, eventTarget);
         }
+        
         IEventType eventType = determineType(type, furtherInfo);
         
         return new Event(eventType, eventTarget);
-    }
-
-    /**
-     * <p>
-     * </p>
-     *
-     * @param type
-     * @param id
-     * @param enteredText
-     * @return
-     */
-    private IEventTarget determineTarget(String type, String id, String enteredText) {
-        if ("TextInput".equals(type) && enteredText != null) {
-            return new DummyTextField(enteredText);
-        }
-        else {
-            return new DummyGUIElement(id);
-        }
     }
 
@@ -367,5 +350,5 @@
      */
     private IEventType determineType(String type, String enteredText) {
-        if ("TextInput".equals(type) && enteredText != null) {
+        if ("TextInput".equals(type)) {
             return new TextInput(enteredText, new ArrayList<Event>());
         }
@@ -375,3 +358,87 @@
     }
 
+    /**
+     *
+     */
+    private void correctTargets(ITaskInstanceList taskInstanceList) {
+        Set<IEventTarget> textInputTargets = new HashSet<IEventTarget>();
+        
+        for (ITaskInstance instance : taskInstanceList) {
+            getTextInputTargets(instance, textInputTargets);
+        }
+        
+        Map<IEventTarget, IEventTarget> replacements = new HashMap<IEventTarget, IEventTarget>();
+        
+        for (IEventTarget oldTarget : textInputTargets) {
+            replacements.put(oldTarget, new DummyTextField(oldTarget.toString()));
+        }
+        
+        for (int i = 0; i < taskInstanceList.size(); i++) {
+            taskBuilder.setTaskInstance
+                (taskInstanceList, i, replaceTargets(taskInstanceList.get(i), replacements));
+        }
+        
+    }
+
+    /**
+     *
+     */
+    private void getTextInputTargets(ITaskInstance instance, Set<IEventTarget> textInputTargets) {
+        if (instance instanceof ISequenceInstance) {
+            for (ITaskInstance child : (ISequenceInstance) instance) {
+                getTextInputTargets(child, textInputTargets);
+            }
+        }
+        else if (instance instanceof ISelectionInstance) {
+            getTextInputTargets(((ISelectionInstance) instance).getChild(), textInputTargets);
+        }
+        else if (instance instanceof IIterationInstance) {
+            for (ITaskInstance child : (IIterationInstance) instance) {
+                getTextInputTargets(child, textInputTargets);
+            }
+        }
+        else if (instance instanceof IOptionalInstance) {
+            getTextInputTargets(((IOptionalInstance) instance).getChild(), textInputTargets);
+        }
+        else if ((instance instanceof IEventTaskInstance) &&
+                 (((IEventTaskInstance) instance).getEvent().getType() instanceof TextInput))
+        {
+            textInputTargets.add(((IEventTaskInstance) instance).getEvent().getTarget());
+        }
+    }
+
+    /**
+     *
+     */
+    private ITaskInstance replaceTargets(ITaskInstance                   instance,
+                                         Map<IEventTarget, IEventTarget> replacements)
+    {
+        ITaskInstance replacement = instance;
+        if (instance instanceof ITaskInstanceList) {
+            for (int i = 0; i < ((ITaskInstanceList) instance).size(); i++) {
+                taskBuilder.setTaskInstance
+                    ((ITaskInstanceList) instance, i,
+                     replaceTargets(((ITaskInstanceList) instance).get(i), replacements));
+            }
+        }
+        else if (instance instanceof ISelectionInstance) {
+            ISelectionInstance selInst = (ISelectionInstance) instance;
+            taskBuilder.setChild(selInst, replaceTargets(selInst.getChild(), replacements));
+        }
+        else if (instance instanceof IOptionalInstance) {
+            IOptionalInstance optInst = (IOptionalInstance) instance;
+            taskBuilder.setChild(optInst, replaceTargets(optInst.getChild(), replacements));
+        }
+        else if ((instance instanceof IEventTaskInstance) &&
+                 (replacements.containsKey(((IEventTaskInstance) instance).getEvent().getTarget())))
+        {
+            Event origEvent = ((IEventTaskInstance) instance).getEvent();
+            replacement = taskFactory.createNewTaskInstance
+                (((IEventTaskInstance) instance).getEventTask(),
+                 new Event(origEvent.getType(), replacements.get(origEvent.getTarget())));
+        }
+        
+        return replacement;
+    }
+
 }
Index: /trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java
===================================================================
--- /trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java	(revision 1326)
+++ /trunk/autoquest-test-utils/src/test/java/de/ugoe/cs/autoquest/tasktrees/TaskTreeDecoderTest.java	(revision 1327)
@@ -19,4 +19,8 @@
 import org.junit.Test;
 
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.autoquest.eventcore.guimodel.ITextArea;
+import de.ugoe.cs.autoquest.eventcore.guimodel.ITextField;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
@@ -237,4 +241,145 @@
         assertFalse(list.get(0).equals(list.get(1)));
         assertTrue(list.get(0).getTask().equals(list.get(1).getTask()));
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_GuiElements_01() {
+        String blub =
+            "UserSession {" +
+            "  MouseClick elem1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        
+        Event event = ((IEventTaskInstance) list.get(0)).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertFalse(event.getTarget() instanceof ITextField);
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_GuiElements_02() {
+        String blub =
+            "UserSession {" +
+            "  TextInput elem1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        
+        Event event = ((IEventTaskInstance) list.get(0)).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertTrue(event.getTarget() instanceof ITextField);
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_GuiElements_03() {
+        String blub =
+            "UserSession {" +
+            "  OtherInteraction elem1 { }" +
+            "  TextInput elem1 { }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof IEventTaskInstance);
+        
+        Event event = ((IEventTaskInstance) list.get(0)).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertTrue(event.getTarget() instanceof ITextField);
+        
+        assertTrue(list.get(1) instanceof IEventTaskInstance);
+        
+        event = ((IEventTaskInstance) list.get(1)).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertTrue(event.getTarget() instanceof ITextField);
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_GuiElements_04() {
+        String blub =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 { }" +
+            "  }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof ISequenceInstance);
+        assertTrue(((ISequenceInstance) list.get(0)).get(0) instanceof IEventTaskInstance);
+        
+        Event event = ((IEventTaskInstance) ((ISequenceInstance) list.get(0)).get(0)).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertTrue(event.getTarget() instanceof ITextField);
+        
+        new TaskTreeValidator().validate(list);
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void test_GuiElements_05() {
+        String blub =
+            "UserSession {" +
+            "  Selection sel1 {" +
+            "    TextInput elem1 { }" +
+            "  }" +
+            "}";
+
+        TaskTreeDecoder decoder = new TaskTreeDecoder(new TaskFactory(), new TaskBuilder());
+        
+        ITaskInstanceList list = decoder.decode(blub);
+        
+        assertTrue(list.get(0) instanceof ISelectionInstance);
+        assertTrue(((ISelectionInstance) list.get(0)).getChild() instanceof IEventTaskInstance);
+        
+        Event event =
+            ((IEventTaskInstance) ((ISelectionInstance) list.get(0)).getChild()).getEvent();
+        
+        assertTrue(event.getTarget() instanceof IGUIElement);
+        assertFalse(event.getTarget() instanceof ITextArea);
+        assertTrue(event.getTarget() instanceof ITextField);
         
         new TaskTreeValidator().validate(list);
