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 6004)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs	(revision 6006)
@@ -54,5 +54,5 @@
       this.viewExperimentButton = new System.Windows.Forms.Button();
       this.jobsTabPage = new System.Windows.Forms.TabPage();
-      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ItemTreeView();
+      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ItemTreeView<HiveJob>();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
@@ -465,5 +465,5 @@
     private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
     private System.Windows.Forms.TabPage jobsTabPage;
-    private ItemTreeView jobsTreeView;
+    private ItemTreeView<HiveJob> jobsTreeView;
     private System.Windows.Forms.Label nameLabel;
     private System.Windows.Forms.TextBox nameTextBox;
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 6004)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs	(revision 6006)
@@ -22,6 +22,8 @@
 using System;
 using System.ComponentModel;
+using System.Linq;
 using System.Threading;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -34,5 +36,5 @@
   /// The base class for visual representations of items.
   /// </summary>
-  [View("Experiment View")]
+  [View("Hive Experiment View")]
   [Content(typeof(HiveExperiment), true)]
   public sealed partial class HiveExperimentView : ItemView {
@@ -52,13 +54,8 @@
 
     protected override void DeregisterContentEvents() {
-      //Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
       Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
       Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      //Content.Prepared -= new EventHandler(Content_Prepared);
-      //Content.Started -= new EventHandler(Content_Started);
-      //Content.Paused -= new EventHandler(Content_Paused);
-      //Content.Stopped -= new EventHandler(Content_Stopped);
       Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.HiveJobChanged -= new EventHandler(Content_HiveJobChanged);
+      Content.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
       Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
       Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
@@ -68,13 +65,8 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      //Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
       Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
       Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      //Content.Prepared += new EventHandler(Content_Prepared);
-      //Content.Started += new EventHandler(Content_Started);
-      //Content.Paused += new EventHandler(Content_Paused);
-      //Content.Stopped += new EventHandler(Content_Stopped);
       Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.HiveJobChanged += new EventHandler(Content_HiveJobChanged);
+      Content.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
       Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
       Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
@@ -119,6 +111,6 @@
 
       if (Content != null) {
-        bool alreadyUploaded = Content.RootJobId != null && Content.Id != Guid.Empty;
-        bool jobsLoaded = Content.HiveJob != null && Content.HiveJob.Job.Id != Guid.Empty;
+        bool alreadyUploaded = Content.Id != Guid.Empty;
+        bool jobsLoaded = Content.HiveJobs != null && Content.HiveJobs.All(x => x.Job.Id != Guid.Empty);
 
         this.nameTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
@@ -127,5 +119,5 @@
         this.useLocalPluginsCheckBox.Enabled = !(Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
         this.refreshAutomaticallyCheckBox.Enabled = alreadyUploaded && jobsLoaded && Content.ExecutionState == ExecutionState.Started;
-        this.viewExperimentButton.Enabled = Content.GetExperiment() != null;
+        this.viewExperimentButton.Enabled = Content.GetExperiment(0) != null;
         this.openExperimentButton.Enabled = !alreadyUploaded && Content.ExecutionState == ExecutionState.Prepared;
         this.newExperimentButton.Enabled = !alreadyUploaded && Content.ExecutionState == ExecutionState.Prepared;
@@ -146,4 +138,11 @@
 
     #region Content Events
+    private void HiveJobs_ItemsAdded_Removed_Reset(object sender, CollectionItemsChangedEventArgs<HiveJob> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset), sender, e);
+      else {
+        SetEnabledStateOfControls();
+      }
+    }
     private void Content_ExecutionStateChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -192,10 +191,4 @@
         executionTimeTextBox.Text = Content.ExecutionTime.ToString();
     }
-    private void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
-      else
-        ErrorHandling.ShowErrorDialog(this, e.Value);
-    }
     private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -210,7 +203,8 @@
         Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
       else {
-        if (Content != null) {
-          jobsTreeView.Content = Content.HiveJob;
-          experimentNamedItemView.Content = Content.GetExperiment();
+        if (Content != null && Content.HiveJobs != null) {
+          jobsTreeView.Content = Content.HiveJobs;
+          experimentNamedItemView.Content = Content.GetExperiment(0);
+          RegisterHiveJobEvents();
         } else {
           jobsTreeView.Content = null;
@@ -220,4 +214,16 @@
       }
     }
+
+    private void RegisterHiveJobEvents() {
+      Content.HiveJobs.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.CollectionReset += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+    private void DeregisterHiveJobEvents() {
+      Content.HiveJobs.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveJobs.CollectionReset -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+
     private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (InvokeRequired)
@@ -241,5 +247,5 @@
       ExperimentManagerClient.StopExperiment(Content);
     }
-    private void resetButton_Click(object sender, EventArgs e) {  }
+    private void resetButton_Click(object sender, EventArgs e) { }
 
     private void nameTextBox_Validated(object sender, EventArgs e) {
@@ -271,9 +277,9 @@
 
     private void showExperimentButton_Click(object sender, EventArgs e) {
-      MainFormManager.MainForm.ShowContent(Content.GetExperiment());
+      MainFormManager.MainForm.ShowContent(Content.GetExperiment(0));
     }
 
     private void viewExperimentButton_Click(object sender, EventArgs e) {
-      MainFormManager.MainForm.ShowContent(Content.GetExperiment());
+      MainFormManager.MainForm.ShowContent(Content.GetExperiment(0));
     }
 
@@ -310,5 +316,5 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.GetExperiment() != null && Content.ExecutionState == ExecutionState.Prepared;
+        startButton.Enabled = Content.GetExperiment(0) != null && Content.ExecutionState == ExecutionState.Prepared;
         pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
         stopButton.Enabled = Content.ExecutionState == ExecutionState.Started;
@@ -346,5 +352,5 @@
     }
     #endregion
- 
+
   }
 }
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 6004)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs	(revision 6006)
@@ -24,4 +24,5 @@
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -30,9 +31,18 @@
 namespace HeuristicLab.Clients.Hive.Views {
   [View("ItemTree View")]
-  [Content(typeof(IItemTree), IsDefaultView = false)]
-  public sealed partial class ItemTreeView : ItemView {
-    public new IItemTree Content {
-      get { return (IItemTree)base.Content; }
+  [Content(typeof(ItemCollection<>), IsDefaultView = false)]
+  [Content(typeof(ItemCollection<IItemTree>), IsDefaultView = true)]
+  public sealed partial class ItemTreeView<T> : ItemView where T : class, IItemTree {
+    public new ItemCollection<T> Content {
+      get { return (ItemCollection<T>)base.Content; }
       set { base.Content = value; }
+    }
+
+    public T SelectedItem {
+      get {
+        if (treeView.SelectedNode != null)
+          return (T)treeView.SelectedNode.Tag;
+        return null;
+      }
     }
 
@@ -42,11 +52,14 @@
 
     protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
       foreach (TreeNode node in treeView.Nodes) {
-        DeregisterContentEvents((IItemTree)node.Tag, node);
+        DeregisterContentEvents((T)node.Tag, node);
       }
       base.DeregisterContentEvents();
     }
 
-    private void DeregisterContentEvents(IItemTree item, TreeNode node) {
+    private void DeregisterContentEvents(T item, TreeNode node) {
       item.ItemsAdded -= new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded);
       item.ItemsRemoved -= new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
@@ -55,5 +68,5 @@
       item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
       foreach (TreeNode childNode in node.Nodes) {
-        DeregisterContentEvents((IItemTree)childNode.Tag, childNode);
+        DeregisterContentEvents((T)childNode.Tag, childNode);
       }
     }
@@ -61,10 +74,13 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
       foreach (TreeNode node in treeView.Nodes) {
-        RegisterContentEvents((IItemTree)node.Tag, node);
-      }
-    }
-
-    private void RegisterContentEvents(IItemTree item, TreeNode node) {
+        RegisterContentEvents((T)node.Tag, node);
+      }
+    }
+
+    private void RegisterContentEvents(T item, TreeNode node) {
       item.ItemsAdded += new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded);
       item.ItemsRemoved += new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
@@ -73,16 +89,50 @@
       item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
       foreach (TreeNode childNode in node.Nodes) {
-        RegisterContentEvents((IItemTree)childNode.Tag, childNode);
+        RegisterContentEvents((T)childNode.Tag, childNode);
       }
     }
 
     #region Event Handlers (Content)
+    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded), sender, e);
+      } else {
+        foreach (T item in e.Items) {
+          var node = AddChildNodes(item, treeView.Nodes, true);
+          UpdateNodeItemImage(node);
+        }
+      }
+    }
+    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved), sender, e);
+      } else {
+        foreach (T item in e.Items) {
+          RemoveChildNodes(item, treeView.Nodes);
+        }
+        RebuildImageList();
+      }
+    }
+    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CollectionReset), sender, e);
+      } else {
+        foreach (T item in e.OldItems) {
+          RemoveChildNodes(item, treeView.Nodes);
+        }
+        RebuildImageList();
+        foreach (T item in e.Items) {
+          AddChildNodes(item, treeView.Nodes, true);
+        }
+      }
+    }
+
     private void item_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
       if (InvokeRequired) {
         Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded), sender, e);
       } else {
-        TreeNode node = GetNodeByItem(sender as IItemTree);
+        TreeNode node = GetNodeByItem(sender as T);
         if (node != null) {
-          foreach (IItemTree item in e.Items) {
+          foreach (T item in e.Items) {
             AddChildNodes(item, node.Nodes, true);
             node.ExpandAll();
@@ -97,7 +147,7 @@
         Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved), sender, e);
       } else {
-        TreeNode node = GetNodeByItem(sender as IItemTree);
+        TreeNode node = GetNodeByItem(sender as T);
         if (node != null) {
-          foreach (IItemTree item in e.Items) {
+          foreach (T item in e.Items) {
             RemoveChildNodes(item, node.Nodes);
           }
@@ -111,11 +161,11 @@
         Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset), sender, e);
       } else {
-        TreeNode node = GetNodeByItem(sender as IItemTree);
+        TreeNode node = GetNodeByItem(sender as T);
         if (node != null) {
-          foreach (IItemTree item in e.OldItems) {
+          foreach (T item in e.OldItems) {
             RemoveChildNodes(item, node.Nodes);
           }
           RebuildImageList();
-          foreach (IItemTree item in e.Items) {
+          foreach (T item in e.Items) {
             AddChildNodes(item, node.Nodes, true);
           }
@@ -128,5 +178,5 @@
         Invoke(new EventHandler(item_ToStringChanged), sender, e);
       } else {
-        var item = sender as IItemTree;
+        var item = sender as T;
         TreeNode node = GetNodeByItem(item);
         if(node != null)
@@ -139,5 +189,5 @@
         Invoke(new EventHandler(item_ItemImageChanged), sender, e);
       } else {
-        var item = sender as IItemTree;
+        var item = sender as T;
         TreeNode node = GetNodeByItem(item);
         if(node != null)
@@ -151,5 +201,5 @@
       } else {
         if (treeView.SelectedNode != null) {
-          var item = treeView.SelectedNode.Tag as IItemTree;
+          var item = treeView.SelectedNode.Tag as T;
           if (item != null) {
             IContentView view = MainFormManager.MainForm.ShowContent(item);
@@ -167,14 +217,15 @@
       base.OnContentChanged();
       if (Content == null) {
-        // Add code when content has been changed and is null
         ClearNodes();
         detailsViewHost.Content = null;
       } else {
-        // Add code when content has been changed and is not null
         ClearNodes();
-        AddChildNodes(Content, treeView.Nodes, false);
+        foreach (T itemTree in Content) {
+          AddChildNodes(itemTree, treeView.Nodes, false);
+        }
         foreach (TreeNode node in treeView.Nodes) {
           UpdateNodeItemImage(node);
         }
+        detailsViewHost.Content = null;
       }
     }
@@ -184,5 +235,5 @@
     }
 
-    private void AddChildNodes(IItemTree item, TreeNodeCollection nodes, bool registerEvents) {
+    private TreeNode AddChildNodes(T item, TreeNodeCollection nodes, bool registerEvents) {
       TreeNode node = CreateTreeViewNode(item);
       nodes.Add(node);
@@ -190,11 +241,12 @@
       RegisterContentEvents(item, node); 
       var childItems = item.GetChildItems();
-      foreach (var childItem in childItems) {
+      foreach (T childItem in childItems) {
         AddChildNodes(childItem, node.Nodes, registerEvents);
       }
       node.ExpandAll();
-    }
-
-    private void RemoveChildNodes(IItemTree item, TreeNodeCollection treeNodeCollection) {
+      return node;
+    }
+
+    private void RemoveChildNodes(T item, TreeNodeCollection treeNodeCollection) {
       int idx = -1;
       for (int i = 0; i < treeNodeCollection.Count; i++) {
@@ -207,5 +259,5 @@
     }
     
-    private TreeNode GetNodeByItem(IItemTree item) {
+    private TreeNode GetNodeByItem(T item) {
       TreeNode found = null;
       foreach (TreeNode node in treeView.Nodes) {
@@ -217,5 +269,5 @@
     }
 
-    private TreeNode GetNodeByItem(TreeNode node, IItemTree item) {
+    private TreeNode GetNodeByItem(TreeNode node, T item) {
       if (node.Tag == item)
         return node;
@@ -229,5 +281,5 @@
     }
 
-    private TreeNode CreateTreeViewNode(IItemTree item) {
+    private TreeNode CreateTreeViewNode(T item) {
       var node = new TreeNode(item.ToString());
       node.Tag = item;
@@ -237,5 +289,5 @@
     private void UpdateNodeItemImage(TreeNode node) {
       if (node == null) throw new ArgumentNullException();
-      var item = node.Tag as IItemTree;
+      var item = node.Tag as T;
       int i = node.ImageIndex;
       this.imageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
@@ -268,5 +320,5 @@
 
     private void RebuildImageList(TreeNode node) {
-      var item = node.Tag as IItemTree;
+      var item = node.Tag as T;
       treeView.ImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
       node.ImageIndex = treeView.ImageList.Images.Count - 1;
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 6004)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs	(revision 6006)
@@ -1,4 +1,4 @@
 ﻿namespace HeuristicLab.Clients.Hive.Views {
-  partial class ItemTreeView {
+  partial class ItemTreeView<T> {
     /// <summary> 
     /// Required designer variable.
