Index: /trunk/autoquest-ui-swt/src/main/java/de/ugoe/cs/autoquest/ui/swt/ShowTaskTreeDialog.java
===================================================================
--- /trunk/autoquest-ui-swt/src/main/java/de/ugoe/cs/autoquest/ui/swt/ShowTaskTreeDialog.java	(revision 1152)
+++ /trunk/autoquest-ui-swt/src/main/java/de/ugoe/cs/autoquest/ui/swt/ShowTaskTreeDialog.java	(revision 1153)
@@ -15,5 +15,8 @@
 package de.ugoe.cs.autoquest.ui.swt;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.swt.SWT;
@@ -26,4 +29,6 @@
 import org.eclipse.swt.widgets.Dialog;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Tree;
@@ -90,10 +95,10 @@
     private void createContents() {
         shell = new Shell(getParent(), SWT.SHELL_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
-        shell.setSize(450, 300);
+        shell.setSize(750, 800);
         shell.setText(getText());
 
         shell.setLayout(new GridLayout(4, false));
         
-        SashForm sashForm = new SashForm(shell, SWT.VERTICAL);
+        SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL);
         sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
         
@@ -104,8 +109,11 @@
                 modelTree.removeAll();
                 TreeItem[] selectedItems = instanceTree.getSelection();
-                if ((selectedItems.length == 1) &&
-                    (selectedItems[0].getData() instanceof ITaskInstance))
-                {
-                    buildModelTree((ITaskInstance) selectedItems[0].getData());
+                if (selectedItems.length == 1) {
+                    if (selectedItems[0].getData() instanceof ITaskInstance) {
+                        buildModelTree((ITaskInstance) selectedItems[0].getData());
+                    }
+                    else if (selectedItems[0].getData() instanceof ITaskModel) {
+                        buildModelTree((ITaskModel) selectedItems[0].getData());
+                    }
                 }
             }
@@ -115,4 +123,5 @@
 
         modelTree = new Tree(sashForm, SWT.BORDER | SWT.MULTI);
+        buildModelTree(taskModel);
 
         Button btnExpandAll = new Button(shell, SWT.NONE);
@@ -149,5 +158,5 @@
         TreeItem root = new TreeItem(instanceTree, SWT.NULL);
         root.setText(sessions.size() + " sessions");
-        root.setData(sessions);
+        root.setData(taskModel);
         
         for (IUserSession session : sessions) {
@@ -167,4 +176,35 @@
             buildInstanceTree(child, childTask);
         }
+    }
+
+    /**
+     * 
+     */
+    private void buildModelTree(ITaskModel taskModel) {
+        modelTree.removeAll();
+        
+        // load the correct children on expansion
+        if (modelTree.getListeners(SWT.Expand).length == 0) {
+           modelTree.addListener(SWT.Expand, new Listener() {
+               public void handleEvent(final Event event) {
+                   ensureChildren((TreeItem) event.item);
+                   ((TreeItem) event.item).setExpanded(true);
+               }
+           });
+        }
+        
+        Collection<ITask> tasks = taskModel.getTasks();
+        
+        TreeItem root = new TreeItem(modelTree, SWT.NULL);
+        root.setText(tasks.size() + " tasks in model");
+        root.setData(taskModel);
+
+        tasks = determineRootTasks(tasks);
+        
+        for (ITask task : tasks) {
+            createTreeItemFor(task, root);
+        }
+        
+        root.setExpanded(true);
     }
 
@@ -178,23 +218,33 @@
         root.setData(taskInstance);
 
-        buildModelTree(taskInstance.getTask(), root);
-        expandAll(root, true);
-    }
-
-    /**
-     * 
-     */
-    private void buildModelTree(ITask task, TreeItem parent) {
-        TreeItem node = new TreeItem(parent, SWT.NULL);
-        node.setText(task.toString());
-        node.setData(task);
-        
+        createTreeItemFor(taskInstance.getTask(), root);
+        
+        expandAll(root, true, 20);
+    }
+
+    /**
+     *
+     */
+    private Collection<ITask> determineRootTasks(Collection<ITask> tasks) {
+        Set<ITask> result = new HashSet<ITask>(tasks);
+        
+        for (ITask task : tasks) {
+            removeChildren(task, result);
+        }
+        
+        return result;
+    }
+
+    /**
+     *
+     */
+    private void removeChildren(ITask task, Set<ITask> result) {
         if (task instanceof IStructuringTemporalRelationship) {
-            for (ITask subTask : ((IStructuringTemporalRelationship) task).getChildren()) {
-                buildModelTree(subTask, node);
+            for (ITask child : ((IStructuringTemporalRelationship) task).getChildren()) {
+                result.remove(child);
             }
         }
         else if (task instanceof IMarkingTemporalRelationship) {
-            buildModelTree(((IMarkingTemporalRelationship) task).getMarkedTask(), node);
+            result.remove(((IMarkingTemporalRelationship) task).getMarkedTask());
         }
     }
@@ -205,17 +255,66 @@
     private void expandAll(Tree tree, boolean expanded) {
         for (TreeItem item : tree.getItems()) {
-            expandAll(item, expanded);
-        }
-    }
-
-    /**
-     * 
-     */
-    private void expandAll(TreeItem item, boolean expanded) {
-        item.setExpanded(expanded);
-        for (TreeItem childItem : item.getItems()) {
-            expandAll(childItem, expanded);
+            expandAll(item, expanded, Integer.MAX_VALUE);
+        }
+    }
+
+    /**
+     * 
+     */
+    private void expandAll(TreeItem item, boolean expanded, int maxChildrenToExpand) {
+        if (expanded) {
+            ensureChildren(item);
+        }
+        
+        if (item.getItems().length < maxChildrenToExpand) {
+            item.setExpanded(expanded);
+
+            for (TreeItem childItem : item.getItems()) {
+                expandAll(childItem, expanded, maxChildrenToExpand);
+            }
         }
     }
     
+    /**
+     * 
+     */
+    private void ensureChildren(TreeItem parent) {
+        if (parent.getData() instanceof ITask) {
+            TreeItem[] items = parent.getItems();
+            if ((items == null) || (items.length == 0) || (items[0].getData() == null)) {
+                for (int i = 0; i < items.length; i++) {
+                    items[i].dispose();
+                }
+
+                ITask task = (ITask) parent.getData();
+
+                if (task instanceof IStructuringTemporalRelationship) {
+                    for (ITask subTask : ((IStructuringTemporalRelationship) task).getChildren()) {
+                        createTreeItemFor(subTask, parent);
+                    }
+                }
+                else if (task instanceof IMarkingTemporalRelationship) {
+                    createTreeItemFor
+                        (((IMarkingTemporalRelationship) task).getMarkedTask(), parent);
+                }
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    private void createTreeItemFor(ITask task, TreeItem parent) {
+        TreeItem item = new TreeItem(parent, SWT.NULL);
+        item.setText(task.toString());
+        item.setData(task);
+        
+        // simulate a child
+        if ((task instanceof IStructuringTemporalRelationship) ||
+            (task instanceof IMarkingTemporalRelationship))
+        {
+            new TreeItem(item, SWT.NULL);
+        }
+    }
+
 }
