Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs	(revision 5675)
@@ -52,5 +52,4 @@
       this.experimentNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
       this.viewExperimentButton = new System.Windows.Forms.Button();
-      this.jobsTabPage = new System.Windows.Forms.TabPage();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
@@ -68,11 +67,12 @@
       this.downloadExperimentPanel = new System.Windows.Forms.Panel();
       this.useLocalPluginsCheckBox = new System.Windows.Forms.CheckBox();
-      this.jobViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ItemTreeView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.experimentTabPage.SuspendLayout();
-      this.jobsTabPage.SuspendLayout();
       this.logTabPage.SuspendLayout();
       this.downloadExperimentPanel.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -161,14 +161,4 @@
       this.viewExperimentButton.Click += new System.EventHandler(this.showExperimentButton_Click);
       // 
-      // jobsTabPage
-      // 
-      this.jobsTabPage.Controls.Add(this.jobViewHost);
-      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.jobsTabPage.Name = "jobsTabPage";
-      this.jobsTabPage.Size = new System.Drawing.Size(791, 494);
-      this.jobsTabPage.TabIndex = 5;
-      this.jobsTabPage.Text = "Jobs";
-      this.jobsTabPage.UseVisualStyleBackColor = true;
-      // 
       // logTabPage
       // 
@@ -183,13 +173,11 @@
       // logView
       // 
-      this.logView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
       this.logView.Caption = "Log View";
       this.logView.Content = null;
-      this.logView.Location = new System.Drawing.Point(3, 4);
+      this.logView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.logView.Location = new System.Drawing.Point(0, 0);
       this.logView.Name = "logView";
       this.logView.ReadOnly = false;
-      this.logView.Size = new System.Drawing.Size(721, 362);
+      this.logView.Size = new System.Drawing.Size(791, 494);
       this.logView.TabIndex = 0;
       // 
@@ -343,17 +331,26 @@
       this.useLocalPluginsCheckBox.CheckedChanged += new System.EventHandler(this.useLocalPluginsCheckBox_CheckedChanged);
       // 
-      // jobViewHost
-      // 
-      this.jobViewHost.Caption = "View";
-      this.jobViewHost.Content = null;
-      this.jobViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.jobViewHost.Enabled = false;
-      this.jobViewHost.Location = new System.Drawing.Point(0, 0);
-      this.jobViewHost.Name = "jobViewHost";
-      this.jobViewHost.ReadOnly = false;
-      this.jobViewHost.Size = new System.Drawing.Size(791, 494);
-      this.jobViewHost.TabIndex = 0;
-      this.jobViewHost.ViewsLabelVisible = true;
-      this.jobViewHost.ViewType = null;
+      // jobsTabPage
+      // 
+      this.jobsTabPage.Controls.Add(this.jobsTreeView);
+      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.jobsTabPage.Name = "jobsTabPage";
+      this.jobsTabPage.Size = new System.Drawing.Size(791, 494);
+      this.jobsTabPage.TabIndex = 5;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // jobsTreeView
+      // 
+      this.jobsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobsTreeView.Caption = "ItemTree View";
+      this.jobsTreeView.Content = null;
+      this.jobsTreeView.Location = new System.Drawing.Point(2, 3);
+      this.jobsTreeView.Name = "jobsTreeView";
+      this.jobsTreeView.ReadOnly = false;
+      this.jobsTreeView.Size = new System.Drawing.Size(786, 488);
+      this.jobsTreeView.TabIndex = 0;
       // 
       // HiveExperimentView
@@ -396,7 +393,7 @@
       this.tabControl.ResumeLayout(false);
       this.experimentTabPage.ResumeLayout(false);
-      this.jobsTabPage.ResumeLayout(false);
       this.logTabPage.ResumeLayout(false);
       this.downloadExperimentPanel.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -423,9 +420,9 @@
     private System.Windows.Forms.Button openExperimentButton;
     private System.Windows.Forms.Button newExperimentButton;
-    private System.Windows.Forms.TabPage jobsTabPage;
     private System.Windows.Forms.Button downloadExperimentButton;
     private System.Windows.Forms.Panel downloadExperimentPanel;
     private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
-    private MainForm.WindowsForms.ViewHost jobViewHost;
+    private System.Windows.Forms.TabPage jobsTabPage;
+    private ItemTreeView jobsTreeView;
 
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs	(revision 5675)
@@ -105,5 +105,5 @@
         this.descriptionTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
         this.resourceNamesTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
-        this.jobViewHost.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
+        this.jobsTreeView.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
         this.useLocalPluginsCheckBox.Enabled = Content.ExecutionState == ExecutionState.Prepared;
 
@@ -189,8 +189,8 @@
       else {
         if (Content != null) {
-          jobViewHost.Content = Content.HiveJob;
+          jobsTreeView.Content = Content.HiveJob;
           experimentNamedItemView.Content = Content.GetExperiment();
         } else {
-          jobViewHost.Content = null;
+          jobsTreeView.Content = null;
           experimentNamedItemView.Content = null;
         }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs	(revision 5675)
@@ -20,5 +20,7 @@
 #endregion
 
+using System;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core.Views;
@@ -40,11 +42,37 @@
 
     protected override void DeregisterContentEvents() {
-      // Deregister your event handlers here
+      foreach (TreeNode node in treeView.Nodes) {
+        DeregisterContentEvents((IItemTree)node.Tag, node);
+      }
       base.DeregisterContentEvents();
+    }
+
+    private void DeregisterContentEvents(IItemTree item, TreeNode node) {
+      item.ItemsAdded -= new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded);
+      item.ItemsRemoved -= new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
+      item.CollectionReset -= new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset);
+      item.ToStringChanged -= new System.EventHandler(item_ToStringChanged);
+      item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
+      foreach (TreeNode childNode in node.Nodes) {
+        DeregisterContentEvents((IItemTree)childNode.Tag, childNode);
+      }
     }
 
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      // Register your event handlers here
+      foreach (TreeNode node in treeView.Nodes) {
+        RegisterContentEvents((IItemTree)node.Tag, node);
+      }
+    }
+
+    private void RegisterContentEvents(IItemTree item, TreeNode node) {
+      item.ItemsAdded += new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded);
+      item.ItemsRemoved += new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
+      item.CollectionReset += new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset);
+      item.ToStringChanged += new System.EventHandler(item_ToStringChanged);
+      item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
+      foreach (TreeNode childNode in node.Nodes) {
+        RegisterContentEvents((IItemTree)childNode.Tag, childNode);
+      }
     }
 
@@ -57,19 +85,102 @@
       if (Content == null) {
         // Add code when content has been changed and is null
-        treeView.Nodes.Clear();
+        ClearNodes();
       } else {
         // Add code when content has been changed and is not null
-        treeView.Nodes.Clear();
-        AddChildNodes(Content, treeView.Nodes);
-      }
-    }
-
-    private void AddChildNodes(IItemTree item, TreeNodeCollection nodes) {
-      var node = CreateTreeViewNode(item);
+        ClearNodes();
+        AddChildNodes(Content, treeView.Nodes, false);
+        foreach (TreeNode node in treeView.Nodes) {
+          UpdateNodeItemImage(node);
+        }
+      }
+    }
+
+    private void ClearNodes() {
+      treeView.Nodes.Clear();
+    }
+
+    private void AddChildNodes(IItemTree item, TreeNodeCollection nodes, bool registerEvents) {
+      TreeNode node = CreateTreeViewNode(item);
       nodes.Add(node);
-      var childItems = item.GetChildNodes();
-      foreach (var childItem in childItems) {        
-        AddChildNodes(childItem, node.Nodes);
-      }
+      RebuildImageList(node);
+      RegisterContentEvents(item, node); 
+      var childItems = item.GetChildItems();
+      foreach (var childItem in childItems) {
+        AddChildNodes(childItem, node.Nodes, registerEvents);
+      }
+      node.ExpandAll();
+    }
+
+    private void RemoveChildNodes(IItemTree item, TreeNodeCollection treeNodeCollection) {
+      int idx = -1;
+      for (int i = 0; i < treeNodeCollection.Count; i++) {
+        if (treeNodeCollection[i].Tag == item) {
+          idx = i; break;
+        }
+      }
+      DeregisterContentEvents(item, treeNodeCollection[idx]);
+      treeNodeCollection.RemoveAt(idx);
+    }
+
+    private void item_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      TreeNode node = GetNodeByItem(sender as IItemTree);
+      foreach (IItemTree item in e.Items) {
+        AddChildNodes(item, node.Nodes, true);
+        node.ExpandAll();
+        UpdateNodeItemImage(node);
+      }
+    }
+
+    private void item_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      TreeNode node = GetNodeByItem(sender as IItemTree);
+      foreach (IItemTree item in e.Items) {
+        RemoveChildNodes(item, node.Nodes);
+      }
+      RebuildImageList();
+    }
+
+    private void item_CollectionReset(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      TreeNode node = GetNodeByItem(sender as IItemTree);
+      foreach (IItemTree item in e.OldItems) {
+        RemoveChildNodes(item, node.Nodes);
+      }
+      RebuildImageList();
+      foreach (IItemTree item in e.Items) {
+        AddChildNodes(item, node.Nodes, true);
+      }
+    }
+
+    private void item_ToStringChanged(object sender, EventArgs e) {
+      var item = sender as IItemTree;
+      TreeNode node = GetNodeByItem(item);
+      node.Text = item.ToString();
+    }
+
+    private void item_ItemImageChanged(object sender, EventArgs e) {
+      var item = sender as IItemTree;
+      TreeNode node = GetNodeByItem(item);
+      UpdateNodeItemImage(node);
+    }
+
+    private TreeNode GetNodeByItem(IItemTree item) {
+      TreeNode found = null;
+      foreach (TreeNode node in treeView.Nodes) {
+        found = GetNodeByItem(node, item);
+        if (found != null)
+          return found;
+      }
+      return null;
+    }
+
+    private TreeNode GetNodeByItem(TreeNode node, IItemTree item) {
+      if (node.Tag == item)
+        return node;
+      TreeNode found = null;
+      foreach (TreeNode childNode in node.Nodes) {
+        found = GetNodeByItem(childNode, item);
+        if (found != null)
+          return found;
+      }
+      return null;
     }
 
@@ -77,9 +188,18 @@
       var node = new TreeNode(item.ToString());
       node.Tag = item;
-      if (!treeView.ImageList.Images.ContainsKey(item.ItemImage.GetHashCode().ToString())) {
-        treeView.ImageList.Images.Add(item.ItemImage.GetHashCode().ToString(), item.ItemImage);
-      }
-      node.ImageKey = item.ItemImage.GetHashCode().ToString();
       return node;
+    }
+
+    private void UpdateNodeItemImage(TreeNode node) {
+      if (node == null) throw new ArgumentNullException();
+      var item = node.Tag as IItemTree;
+      int i = node.ImageIndex;
+      this.imageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
+      node.ImageIndex = -1;
+      node.ImageIndex = i;
+      node.SelectedImageIndex = node.ImageIndex;
+      foreach (TreeNode childNode in node.Nodes) {
+        UpdateNodeItemImage(childNode);
+      }
     }
 
@@ -96,5 +216,20 @@
     #endregion
 
-
+    private void RebuildImageList() {
+      treeView.ImageList.Images.Clear();
+      foreach (TreeNode node in treeView.Nodes) {
+        RebuildImageList(node);
+      }
+    }
+
+    private void RebuildImageList(TreeNode node) {
+      var item = node.Tag as IItemTree;
+      treeView.ImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
+      node.ImageIndex = treeView.ImageList.Images.Count - 1;
+      node.SelectedImageIndex = node.ImageIndex;
+      foreach (TreeNode childNode in node.Nodes) {
+        RebuildImageList(childNode);
+      }
+    }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs	(revision 5675)
@@ -27,10 +27,12 @@
       this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.treeView = new System.Windows.Forms.TreeView();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
       this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.imageList = new System.Windows.Forms.ImageList(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
       this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -38,4 +40,5 @@
       // 
       this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
       this.splitContainer.Location = new System.Drawing.Point(0, 0);
       this.splitContainer.Name = "splitContainer";
@@ -47,7 +50,7 @@
       // splitContainer.Panel2
       // 
-      this.splitContainer.Panel2.Controls.Add(this.viewHost);
-      this.splitContainer.Size = new System.Drawing.Size(551, 463);
-      this.splitContainer.SplitterDistance = 183;
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(624, 463);
+      this.splitContainer.SplitterDistance = 200;
       this.splitContainer.TabIndex = 0;
       // 
@@ -60,7 +63,24 @@
       this.treeView.Name = "treeView";
       this.treeView.SelectedImageIndex = 0;
-      this.treeView.Size = new System.Drawing.Size(183, 463);
+      this.treeView.Size = new System.Drawing.Size(200, 463);
       this.treeView.TabIndex = 0;
       this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(420, 463);
+      this.detailsGroupBox.TabIndex = 1;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
       // 
       // viewHost
@@ -70,17 +90,11 @@
       this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
       this.viewHost.Enabled = false;
-      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Location = new System.Drawing.Point(3, 16);
       this.viewHost.Name = "viewHost";
       this.viewHost.ReadOnly = false;
-      this.viewHost.Size = new System.Drawing.Size(364, 463);
+      this.viewHost.Size = new System.Drawing.Size(414, 444);
       this.viewHost.TabIndex = 0;
       this.viewHost.ViewsLabelVisible = true;
       this.viewHost.ViewType = null;
-      // 
-      // imageList
-      // 
-      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
       // 
       // ItemTreeView
@@ -89,9 +103,10 @@
       this.Controls.Add(this.splitContainer);
       this.Name = "ItemTreeView";
-      this.Size = new System.Drawing.Size(551, 463);
+      this.Size = new System.Drawing.Size(624, 463);
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel2.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -104,4 +119,5 @@
     private MainForm.WindowsForms.ViewHost viewHost;
     private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs	(revision 5675)
@@ -33,4 +33,5 @@
   using System.Configuration;
   using System.IO;
+  using HeuristicLab.Collections;
   using HeuristicLab.PluginInfrastructure;
 
@@ -773,7 +774,16 @@
 
     #region IItemTree Members
-    public IEnumerable<IItemTree> GetChildNodes() {
-      return new List<HiveJob> { hiveJob };
-    }
+    public IObservableCollection<IItemTree> GetChildItems() {
+      return new ObservableCollection<IItemTree> { hiveJob };
+    }
+    IEnumerable<IItemTree> IItemTree.GetChildItems() {
+      return this.GetChildItems();
+    }
+    #endregion
+
+    #region INotifyObservableCollectionItemsChanged<IItemTree> Members
+    public event CollectionItemsChangedEventHandler<IItemTree> CollectionReset;
+    public event CollectionItemsChangedEventHandler<IItemTree> ItemsAdded;
+    public event CollectionItemsChangedEventHandler<IItemTree> ItemsRemoved;
     #endregion
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs	(revision 5675)
@@ -111,4 +111,5 @@
       this.childHiveJobs = new ItemList<HiveJob>();
       syncJobsWithOptimizers = true;
+      RegisterChildHiveJobEvents();
     }
 
@@ -136,4 +137,5 @@
       this.childHiveJobs = new ItemList<HiveJob>();
       this.syncJobsWithOptimizers = true;
+      RegisterChildHiveJobEvents();
     }
 
@@ -209,4 +211,15 @@
     }
 
+    private void RegisterChildHiveJobEvents() {
+      this.childHiveJobs.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsAdded);
+      this.childHiveJobs.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsRemoved);
+      this.childHiveJobs.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnCollectionReset);
+    }
+    private void DeregisterChildHiveJobEvents() {
+      this.childHiveJobs.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsAdded);
+      this.childHiveJobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsRemoved);
+      this.childHiveJobs.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnCollectionReset);
+    }
+
     private void batchRun_OptimizerChanged(object sender, EventArgs e) {
       if (syncJobsWithOptimizers) {
@@ -566,7 +579,32 @@
     }
 
-    public IEnumerable<IItemTree> GetChildNodes() {
-      return this.ChildHiveJobs;
-    }
+    public IEnumerable<IItemTree> GetChildItems() {
+      return this.childHiveJobs;
+    }
+
+    #region INotifyObservableCollectionItemsChanged<IItemTree> Members
+
+    public event CollectionItemsChangedEventHandler<IItemTree> CollectionReset;
+    private void OnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = CollectionReset;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    public event CollectionItemsChangedEventHandler<IItemTree> ItemsAdded;
+    private void OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = ItemsAdded;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    public event CollectionItemsChangedEventHandler<IItemTree> ItemsRemoved;
+    private void OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = ItemsRemoved;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    private static CollectionItemsChangedEventArgs<IItemTree> ToCollectionItemsChangedEventArgs(CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      return new CollectionItemsChangedEventArgs<IItemTree>(e.Items.Select(x => x.Value), e.OldItems == null ? null : e.OldItems.Select(x => x.Value));
+    }
+    #endregion
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/IItemTree.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/IItemTree.cs	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/IItemTree.cs	(revision 5675)
@@ -1,8 +1,9 @@
 ﻿using System.Collections.Generic;
+using HeuristicLab.Collections;
 using HeuristicLab.Core;
 
 namespace HeuristicLab.Clients.Hive {
-  public interface IItemTree : INamedItem {
-    IEnumerable<IItemTree> GetChildNodes();
+  public interface IItemTree : INamedItem, INotifyObservableCollectionItemsChanged<IItemTree> {
+    IEnumerable<IItemTree> GetChildItems();
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 5674)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 5675)
@@ -76,4 +76,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.LifecycleClient", "HeuristicLab.Clients.Hive.LifecycleClient\HeuristicLab.Clients.Hive.LifecycleClient.csproj", "{54491B6A-1EDD-4C76-90A7-338BA9C1FBF8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsFormsTestProject", "WindowsFormsTestProject\WindowsFormsTestProject.csproj", "{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}"
 EndProject
 Global
@@ -341,4 +343,17 @@
 		{54491B6A-1EDD-4C76-90A7-338BA9C1FBF8}.Release|x86.ActiveCfg = Release|x86
 		{54491B6A-1EDD-4C76-90A7-338BA9C1FBF8}.Release|x86.Build.0 = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|x64.ActiveCfg = Debug|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|x86.ActiveCfg = Debug|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Debug|x86.Build.0 = Debug|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|Any CPU.ActiveCfg = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|Mixed Platforms.Build.0 = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|x64.ActiveCfg = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|x86.ActiveCfg = Release|x86
+		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
