Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/IOptional.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/IOptional.java	(revision 1126)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/IOptional.java	(revision 1126)
@@ -0,0 +1,30 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.treeifc;
+
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 21.02.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+public interface IOptional extends ITemporalRelationship {
+
+    /**
+     *
+     */
+    public IOptional clone();
+
+}
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeBuilder.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeBuilder.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeBuilder.java	(revision 1126)
@@ -34,4 +34,11 @@
 
     /**
+     * 
+     * @param parent
+     * @param i
+     */
+    void setChild(ISequence parent, int index, ITaskTreeNode child);
+
+    /**
      * @param sequence
      * @param task
@@ -45,4 +52,11 @@
      */
     void setChild(IIteration iteration, ITaskTreeNode newChild);
+
+    /**
+     * 
+     * @param optional
+     * @param newChild
+     */
+    void setChild(IOptional optional, ITaskTreeNode newChild);
 
     /**
@@ -61,4 +75,11 @@
 
     /**
+     *
+     * @param parent
+     * @param i
+     */
+    void replaceChild(ISelection parent, ITaskTreeNode oldChild, ITaskTreeNode newChild);
+
+    /**
      * 
      * @param parent
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeNodeFactory.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeNodeFactory.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITaskTreeNodeFactory.java	(revision 1126)
@@ -51,4 +51,10 @@
    * @return
    */
+  IOptional createNewOptional();
+
+  /**
+   *
+   * @return
+   */
   ISelection createNewSelection();
 
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/EventTask.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/EventTask.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/EventTask.java	(revision 1126)
@@ -39,6 +39,6 @@
      */
     EventTask(IEventType eventType, IEventTarget eventTarget) {
-        super(eventType.getName() + "(" + eventTarget + ")");
-        super.setDescription(eventType + " on " + eventTarget);
+        super(eventType.toString());
+        super.setDescription("executed on " + eventTarget);
         this.eventType = eventType;
         this.eventTarget = eventTarget;
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Iteration.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Iteration.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Iteration.java	(revision 1126)
@@ -42,5 +42,5 @@
         // adding more children is not allowed
         throw new UnsupportedOperationException
-          ("iterations may not have a list of children. Use setChild() instead.");
+            ("iterations may not have a list of children. Use setChild() instead.");
     }
 
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Optional.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Optional.java	(revision 1126)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Optional.java	(revision 1126)
@@ -0,0 +1,70 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.tasktrees.treeimpl;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
+
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 19.02.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+public class Optional extends TaskTreeNode implements IOptional {
+
+    /**
+     *
+     */
+    Optional() {
+        super("Optional");
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.tasktree.treeifc.TaskTreeNode#addChild(TaskTreeNode)
+     */
+    @Override
+    public void addChild(ITaskTreeNode child) {
+        // adding more children is not allowed
+        throw new UnsupportedOperationException
+            ("optionalities may not have a list of children. Use setChild() instead.");
+    }
+
+    /**
+     * TODO: comment
+     * 
+     * @param selection
+     * @return
+     */
+    public void setChild(ITaskTreeNode child) {
+        if (super.getChildren().size() > 0) {
+            super.removeChild(0);
+        }
+        super.addChild(child);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#clone()
+     */
+    @Override
+    public Optional clone() {
+        return (Optional) super.clone();
+    }
+
+}
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeBuilder.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeBuilder.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeBuilder.java	(revision 1126)
@@ -15,5 +15,8 @@
 package de.ugoe.cs.autoquest.tasktrees.treeimpl;
 
+import java.util.List;
+
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
@@ -59,4 +62,18 @@
     }
 
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder#setChild(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence, int, de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode)
+     */
+    @Override
+    public void setChild(ISequence parent, int index, ITaskTreeNode child) {
+        if (!(parent instanceof Sequence)) {
+            throw new IllegalArgumentException
+                ("illegal type of task tree node provided: " + parent.getClass());
+        }
+
+        ((TaskTreeNode) parent).removeChild(index);
+        addChildInternal(parent, index, child);
+    }
+
     /*
      * (non-Javadoc)
@@ -94,4 +111,22 @@
     }
 
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder#setChild(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional, de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode)
+     */
+    @Override
+    public void setChild(IOptional optional, ITaskTreeNode newChild) {
+        if (!(optional instanceof Optional)) {
+            throw new IllegalArgumentException
+                ("illegal type of optional provided: " + optional.getClass());
+        }
+
+        if (!(newChild instanceof TaskTreeNode)) {
+            throw new IllegalArgumentException
+                ("illegal type of task tree node provided: " + newChild.getClass());
+        }
+
+        ((Optional) optional).setChild(newChild);
+    }
+
     /*
      * (non-Javadoc)
@@ -121,8 +156,9 @@
         }
 
-        for (int i = 0; i < parent.getChildren().size(); i++) {
-            if ((parent.getChildren().get(i) == child) ||
-                ((parent.getChildren().get(i) != null) &&
-                 (parent.getChildren().get(i).equals(child))))
+        List<ITaskTreeNode> children = parent.getChildren();
+        
+        for (int i = 0; i < children.size(); i++) {
+            if ((children.get(i) == child) ||
+                ((children.get(i) != null) && (children.get(i).equals(child))))
             {
                 ((TaskTreeNode) parent).removeChild(i);
@@ -132,4 +168,27 @@
     }
 
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder#replaceChild(de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection, de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode, de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode)
+     */
+    @Override
+    public void replaceChild(ISelection parent, ITaskTreeNode oldChild, ITaskTreeNode newChild) {
+        if (!(parent instanceof TaskTreeNode)) {
+            throw new IllegalArgumentException
+                ("illegal type of task tree node provided: " + parent.getClass());
+        }
+
+        List<ITaskTreeNode> children = parent.getChildren();
+        
+        for (int i = 0; i < children.size(); i++) {
+            if ((children.get(i) == oldChild) ||
+                ((children.get(i) != null) && (children.get(i).equals(oldChild))))
+            {
+                ((TaskTreeNode) parent).removeChild(i);
+                ((TaskTreeNode) parent).addChild(i, newChild);
+                break;
+            }
+        }
+    }
+
     /*
      * (non-Javadoc)
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNode.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNode.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNode.java	(revision 1126)
@@ -15,5 +15,6 @@
 package de.ugoe.cs.autoquest.tasktrees.treeimpl;
 
-import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 
@@ -85,8 +86,8 @@
     public synchronized List<ITaskTreeNode> getChildren() {
         if ((children == null) || (children.size() == 0)) {
-            return new ArrayList<ITaskTreeNode>();
-        }
-
-        return children.subList(0, children.size());
+            return new LinkedList<ITaskTreeNode>();
+        }
+
+        return Collections.unmodifiableList(children);
     }
 
@@ -154,10 +155,22 @@
     @Override
     public synchronized String toString() {
-        if (children == null) {
-            return name + "(" + id + ")";
-        }
-        else {
-            return name + "(" + id + ", " + children.size() + " children)";
-        }
+        StringBuffer result = new StringBuffer();
+        result.append(name);
+        result.append('(');
+        result.append(id);
+        
+        if (description != null) {
+            result.append(", ");
+            result.append(description);
+        }
+        
+        if (children != null) {
+            result.append(", ");
+            result.append(children.size());
+            result.append(" children");
+        }
+        
+        result.append(')');
+        return result.toString();
     }
 
@@ -177,5 +190,5 @@
     synchronized void addChild(ITaskTreeNode child) {
         if (children == null) {
-            children = new ArrayList<ITaskTreeNode>();
+            children = new LinkedList<ITaskTreeNode>();
         }
 
@@ -188,5 +201,5 @@
     synchronized void addChild(int index, ITaskTreeNode child) {
         if (children == null) {
-            children = new ArrayList<ITaskTreeNode>();
+            children = new LinkedList<ITaskTreeNode>();
         }
 
@@ -216,5 +229,5 @@
 
             if (children != null) {
-                clone.children = new ArrayList<ITaskTreeNode>();
+                clone.children = new LinkedList<ITaskTreeNode>();
 
                 for (ITaskTreeNode child : children) {
Index: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNodeFactory.java
===================================================================
--- trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNodeFactory.java	(revision 1125)
+++ trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/TaskTreeNodeFactory.java	(revision 1126)
@@ -19,4 +19,5 @@
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
@@ -63,4 +64,12 @@
     }
 
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNodeFactory#createNewOptional()
+     */
+    @Override
+    public IOptional createNewOptional() {
+        return new Optional();
+    }
+
     /*
      * (non-Javadoc)
