Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.ConsoleClient-3.4/app_services.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.ConsoleClient-3.4/app_services.config	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.ConsoleClient-3.4/app_services.config	(revision 6033)
@@ -21,5 +21,5 @@
       </service>
     </services>
-
+ 
    <client>
      <endpoint name="SlaveCommunicationServiceEndpoint" address="net.pipe://localhost/HeuristicLabSlaveCom" binding="netNamedPipeBinding" contract="HeuristicLab.Clients.Hive.SlaveCore.ServiceContracts.ISlaveCommunication"/>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Tests/SlaveCommListener.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Tests/SlaveCommListener.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Tests/SlaveCommListener.cs	(revision 6033)
@@ -56,5 +56,5 @@
 
     public void Close() {
-      if (pipeFactory.State != CommunicationState.Closed) {
+      if (pipeFactory.State != CommunicationState.Closed && pipeFactory.State != CommunicationState.Closing) {
         pipeProxy.Unsubscribe();
         pipeFactory.Close();
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj	(revision 6033)
@@ -71,7 +71,4 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
-    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame	(revision 6033)
@@ -29,8 +29,17 @@
   [Plugin("HeuristicLab.Clients.Hive.Slave.Views", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Clients.Hive.Slave.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Hive.SlaveCore", "3.4")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
-  [PluginDependency("HeuristicLab.Clients.Hive.SlaveCore", "3.4")]
   public class HeuristicLabClientsHiveSlaveViewsPlugin : PluginBase {
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame	(revision 6033)
@@ -8,6 +8,10 @@
   [Plugin("HeuristicLab.Clients.Hive.SlaveCore", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Clients.Hive.SlaveCore-3.4.dll", PluginFileType.Assembly)]
+  
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.4")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Hive", "3.4")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabClientsHiveSlavePlugin : PluginBase {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/StatusCommons.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/StatusCommons.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/StatusCommons.cs	(revision 6033)
@@ -48,4 +48,8 @@
     [DataMember]
     public List<JobStatus> Jobs { get; set; }
+
+    public override string ToString() {
+      return string.Format("Status: {0}, Fetched/Done/Aborted: {1},{2},{3}", Status, JobsFetched, JobsDone, JobsAborted);
+    }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs	(revision 6033)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Windows.Forms;
 using HeuristicLab.Core;
@@ -27,6 +28,6 @@
 namespace HeuristicLab.Clients.Hive.Views {
   [View("HiveExperimentList View")]
-  [Content(typeof(ItemCollection<HiveExperiment>), false)]
-  public partial class HiveExperimentListView : ItemCollectionView<HiveExperiment> {
+  [Content(typeof(ItemCollection<RefreshableHiveExperiment>), false)]
+  public partial class HiveExperimentListView : ItemCollectionView<RefreshableHiveExperiment> {
 
     public HiveExperimentListView() {
@@ -34,6 +35,13 @@
     }
 
-    protected override HiveExperiment CreateItem() {
-      return new HiveExperiment();
+    protected override RefreshableHiveExperiment CreateItem() {
+      return new RefreshableHiveExperiment();
+    }
+
+    protected override void removeButton_Click(object sender, EventArgs e) {
+      DialogResult result = MessageBox.Show("This action will permanently delete this experiment (also on the hive server). Continue?", "Delete Experiment", MessageBoxButtons.OKCancel);
+      if (result == DialogResult.OK) {
+        base.removeButton_Click(sender, e);
+      }
     }
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs	(revision 6033)
@@ -21,5 +21,7 @@
 
 using System;
+using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -50,4 +52,6 @@
       Content.Refreshing += new EventHandler(Content_Refreshing);
       Content.Refreshed += new EventHandler(Content_Refreshed);
+      Content.HiveExperimentsChanged += new EventHandler(Content_HiveExperimentsChanged);
+      
     }
 
@@ -55,4 +59,5 @@
       Content.Refreshing -= new EventHandler(Content_Refreshing);
       Content.Refreshed -= new EventHandler(Content_Refreshed);
+      Content.HiveExperimentsChanged -= new EventHandler(Content_HiveExperimentsChanged);
       base.DeregisterContentEvents();
     }
@@ -101,6 +106,6 @@
     protected override void OnClosing(FormClosingEventArgs e) {
       base.OnClosing(e);
-      if (Content != null) {
-        foreach (var exp in Content.HiveExperiments) {
+      if (Content != null && Content.HiveExperiments != null) {
+        foreach (var exp in Content.HiveExperiments.OfType<RefreshableHiveExperiment>()) {
           if (exp.RefreshAutomatically) {
             exp.RefreshAutomatically = false; // stop result polling
@@ -109,4 +114,14 @@
       }
     }
+
+    private void HiveExperiments_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<RefreshableHiveExperiment> e) {
+      foreach (var item in e.Items) {
+        ExperimentManagerClient.Delete(item);
+      }
+    }
+
+    private void Content_HiveExperimentsChanged(object sender, EventArgs e) {
+      Content.HiveExperiments.ItemsRemoved += new CollectionItemsChangedEventHandler<RefreshableHiveExperiment>(HiveExperiments_ItemsRemoved);
+    }
   }
 }
Index: anches/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 6032)
+++ 	(revision )
@@ -1,482 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.Clients.Hive.Views {
-  partial class HiveExperimentView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveExperimentView));
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.experimentTabPage = new System.Windows.Forms.TabPage();
-      this.openExperimentButton = new System.Windows.Forms.Button();
-      this.newExperimentButton = new System.Windows.Forms.Button();
-      this.experimentNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
-      this.viewExperimentButton = new System.Windows.Forms.Button();
-      this.jobsTabPage = new System.Windows.Forms.TabPage();
-      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ItemTreeView<HiveJob>();
-      this.logTabPage = new System.Windows.Forms.TabPage();
-      this.logView = new HeuristicLab.Core.Views.LogView();
-      this.startButton = new System.Windows.Forms.Button();
-      this.stopButton = new System.Windows.Forms.Button();
-      this.resetButton = new System.Windows.Forms.Button();
-      this.executionTimeLabel = new System.Windows.Forms.Label();
-      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
-      this.pauseButton = new System.Windows.Forms.Button();
-      this.resourceIdsLabel = new System.Windows.Forms.Label();
-      this.resourceNamesTextBox = new System.Windows.Forms.TextBox();
-      this.useLocalPluginsCheckBox = new System.Windows.Forms.CheckBox();
-      this.nameLabel = new System.Windows.Forms.Label();
-      this.nameTextBox = new System.Windows.Forms.TextBox();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.refreshAutomaticallyCheckBox = new System.Windows.Forms.CheckBox();
-      this.infoGroupBox = new System.Windows.Forms.GroupBox();
-      this.finishedTextBox = new System.Windows.Forms.TextBox();
-      this.calculatingTextBox = new System.Windows.Forms.TextBox();
-      this.jobsTextBox = new System.Windows.Forms.TextBox();
-      this.finishedLabel = new System.Windows.Forms.Label();
-      this.calculatingLabel = new System.Windows.Forms.Label();
-      this.jobsLabel = new System.Windows.Forms.Label();
-      this.tabControl.SuspendLayout();
-      this.experimentTabPage.SuspendLayout();
-      this.jobsTabPage.SuspendLayout();
-      this.logTabPage.SuspendLayout();
-      this.infoGroupBox.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.experimentTabPage);
-      this.tabControl.Controls.Add(this.jobsTabPage);
-      this.tabControl.Controls.Add(this.logTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 78);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(821, 520);
-      this.tabControl.TabIndex = 4;
-      // 
-      // experimentTabPage
-      // 
-      this.experimentTabPage.Controls.Add(this.openExperimentButton);
-      this.experimentTabPage.Controls.Add(this.newExperimentButton);
-      this.experimentTabPage.Controls.Add(this.experimentNamedItemView);
-      this.experimentTabPage.Controls.Add(this.viewExperimentButton);
-      this.experimentTabPage.Location = new System.Drawing.Point(4, 22);
-      this.experimentTabPage.Name = "experimentTabPage";
-      this.experimentTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.experimentTabPage.Size = new System.Drawing.Size(813, 494);
-      this.experimentTabPage.TabIndex = 1;
-      this.experimentTabPage.Text = "Experiment";
-      this.experimentTabPage.UseVisualStyleBackColor = true;
-      // 
-      // openExperimentButton
-      // 
-      this.openExperimentButton.Image = ((System.Drawing.Image)(resources.GetObject("openExperimentButton.Image")));
-      this.openExperimentButton.Location = new System.Drawing.Point(36, 6);
-      this.openExperimentButton.Name = "openExperimentButton";
-      this.openExperimentButton.Size = new System.Drawing.Size(24, 24);
-      this.openExperimentButton.TabIndex = 5;
-      this.toolTip.SetToolTip(this.openExperimentButton, "Open Experiment");
-      this.openExperimentButton.UseVisualStyleBackColor = true;
-      this.openExperimentButton.Click += new System.EventHandler(this.openExperimentButton_Click);
-      // 
-      // newExperimentButton
-      // 
-      this.newExperimentButton.Image = ((System.Drawing.Image)(resources.GetObject("newExperimentButton.Image")));
-      this.newExperimentButton.Location = new System.Drawing.Point(6, 6);
-      this.newExperimentButton.Name = "newExperimentButton";
-      this.newExperimentButton.Size = new System.Drawing.Size(24, 24);
-      this.newExperimentButton.TabIndex = 4;
-      this.toolTip.SetToolTip(this.newExperimentButton, "New Experiment");
-      this.newExperimentButton.UseVisualStyleBackColor = true;
-      this.newExperimentButton.Click += new System.EventHandler(this.newExperimentButton_Click);
-      // 
-      // experimentNamedItemView
-      // 
-      this.experimentNamedItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.experimentNamedItemView.Caption = "NamedItem View";
-      this.experimentNamedItemView.Content = null;
-      this.experimentNamedItemView.Location = new System.Drawing.Point(2, 36);
-      this.experimentNamedItemView.Name = "experimentNamedItemView";
-      this.experimentNamedItemView.ReadOnly = false;
-      this.experimentNamedItemView.Size = new System.Drawing.Size(808, 26);
-      this.experimentNamedItemView.TabIndex = 3;
-      // 
-      // viewExperimentButton
-      // 
-      this.viewExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.viewExperimentButton.Location = new System.Drawing.Point(3, 64);
-      this.viewExperimentButton.Name = "viewExperimentButton";
-      this.viewExperimentButton.Size = new System.Drawing.Size(804, 23);
-      this.viewExperimentButton.TabIndex = 1;
-      this.viewExperimentButton.Text = "&Show Experiment";
-      this.viewExperimentButton.UseVisualStyleBackColor = true;
-      this.viewExperimentButton.Click += new System.EventHandler(this.viewExperimentButton_Click);
-      // 
-      // 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(813, 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(808, 488);
-      this.jobsTreeView.TabIndex = 0;
-      // 
-      // logTabPage
-      // 
-      this.logTabPage.Controls.Add(this.logView);
-      this.logTabPage.Location = new System.Drawing.Point(4, 22);
-      this.logTabPage.Name = "logTabPage";
-      this.logTabPage.Size = new System.Drawing.Size(813, 494);
-      this.logTabPage.TabIndex = 3;
-      this.logTabPage.Text = "Log";
-      this.logTabPage.UseVisualStyleBackColor = true;
-      // 
-      // logView
-      // 
-      this.logView.Caption = "Log View";
-      this.logView.Content = null;
-      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(801, 494);
-      this.logView.TabIndex = 0;
-      // 
-      // startButton
-      // 
-      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.startButton.Image = ((System.Drawing.Image)(resources.GetObject("startButton.Image")));
-      this.startButton.Location = new System.Drawing.Point(0, 604);
-      this.startButton.Name = "startButton";
-      this.startButton.Size = new System.Drawing.Size(24, 24);
-      this.startButton.TabIndex = 5;
-      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
-      this.startButton.UseVisualStyleBackColor = true;
-      this.startButton.Click += new System.EventHandler(this.startButton_Click);
-      // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
-      this.stopButton.Location = new System.Drawing.Point(60, 604);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 7;
-      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
-      // resetButton
-      // 
-      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Enabled = false;
-      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
-      this.resetButton.Location = new System.Drawing.Point(90, 604);
-      this.resetButton.Name = "resetButton";
-      this.resetButton.Size = new System.Drawing.Size(24, 24);
-      this.resetButton.TabIndex = 8;
-      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
-      this.resetButton.UseVisualStyleBackColor = true;
-      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
-      // 
-      // executionTimeLabel
-      // 
-      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(595, 611);
-      this.executionTimeLabel.Name = "executionTimeLabel";
-      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
-      this.executionTimeLabel.TabIndex = 9;
-      this.executionTimeLabel.Text = "&Execution Time:";
-      // 
-      // executionTimeTextBox
-      // 
-      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(684, 608);
-      this.executionTimeTextBox.Name = "executionTimeTextBox";
-      this.executionTimeTextBox.ReadOnly = true;
-      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
-      this.executionTimeTextBox.TabIndex = 10;
-      // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Enabled = false;
-      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
-      this.pauseButton.Location = new System.Drawing.Point(30, 604);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 6;
-      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
-      // 
-      // resourceIdsLabel
-      // 
-      this.resourceIdsLabel.AutoSize = true;
-      this.resourceIdsLabel.Location = new System.Drawing.Point(4, 56);
-      this.resourceIdsLabel.Name = "resourceIdsLabel";
-      this.resourceIdsLabel.Size = new System.Drawing.Size(70, 13);
-      this.resourceIdsLabel.TabIndex = 12;
-      this.resourceIdsLabel.Text = "ResourceIds:";
-      // 
-      // resourceNamesTextBox
-      // 
-      this.resourceNamesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.resourceNamesTextBox.Location = new System.Drawing.Point(73, 53);
-      this.resourceNamesTextBox.Name = "resourceNamesTextBox";
-      this.resourceNamesTextBox.Size = new System.Drawing.Size(494, 20);
-      this.resourceNamesTextBox.TabIndex = 14;
-      this.resourceNamesTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
-      // 
-      // useLocalPluginsCheckBox
-      // 
-      this.useLocalPluginsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.useLocalPluginsCheckBox.AutoSize = true;
-      this.useLocalPluginsCheckBox.Location = new System.Drawing.Point(573, 56);
-      this.useLocalPluginsCheckBox.Name = "useLocalPluginsCheckBox";
-      this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(105, 17);
-      this.useLocalPluginsCheckBox.TabIndex = 19;
-      this.useLocalPluginsCheckBox.Text = "UseLocalPlugins";
-      this.useLocalPluginsCheckBox.UseVisualStyleBackColor = true;
-      this.useLocalPluginsCheckBox.CheckedChanged += new System.EventHandler(this.useLocalPluginsCheckBox_CheckedChanged);
-      // 
-      // nameLabel
-      // 
-      this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(1, 27);
-      this.nameLabel.Name = "nameLabel";
-      this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 20;
-      this.nameLabel.Text = "Name:";
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(73, 27);
-      this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(605, 20);
-      this.nameTextBox.TabIndex = 21;
-      this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
-      this.refreshButton.Location = new System.Drawing.Point(3, 0);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(24, 24);
-      this.refreshButton.TabIndex = 22;
-      this.toolTip.SetToolTip(this.refreshButton, "Refresh Data");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
-      // refreshAutomaticallyCheckBox
-      // 
-      this.refreshAutomaticallyCheckBox.AutoSize = true;
-      this.refreshAutomaticallyCheckBox.Location = new System.Drawing.Point(30, 5);
-      this.refreshAutomaticallyCheckBox.Name = "refreshAutomaticallyCheckBox";
-      this.refreshAutomaticallyCheckBox.Size = new System.Drawing.Size(128, 17);
-      this.refreshAutomaticallyCheckBox.TabIndex = 24;
-      this.refreshAutomaticallyCheckBox.Text = "&Refresh Automatically";
-      this.refreshAutomaticallyCheckBox.UseVisualStyleBackColor = true;
-      this.refreshAutomaticallyCheckBox.CheckedChanged += new System.EventHandler(this.refreshAutomaticallyCheckBox_CheckedChanged);
-      // 
-      // infoGroupBox
-      // 
-      this.infoGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.infoGroupBox.Controls.Add(this.finishedTextBox);
-      this.infoGroupBox.Controls.Add(this.calculatingTextBox);
-      this.infoGroupBox.Controls.Add(this.jobsTextBox);
-      this.infoGroupBox.Controls.Add(this.finishedLabel);
-      this.infoGroupBox.Controls.Add(this.calculatingLabel);
-      this.infoGroupBox.Controls.Add(this.jobsLabel);
-      this.infoGroupBox.Location = new System.Drawing.Point(684, 5);
-      this.infoGroupBox.Name = "infoGroupBox";
-      this.infoGroupBox.Size = new System.Drawing.Size(133, 89);
-      this.infoGroupBox.TabIndex = 25;
-      this.infoGroupBox.TabStop = false;
-      this.infoGroupBox.Text = "Info";
-      // 
-      // finishedTextBox
-      // 
-      this.finishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.finishedTextBox.Location = new System.Drawing.Point(74, 64);
-      this.finishedTextBox.Name = "finishedTextBox";
-      this.finishedTextBox.Size = new System.Drawing.Size(53, 20);
-      this.finishedTextBox.TabIndex = 5;
-      // 
-      // calculatingTextBox
-      // 
-      this.calculatingTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.calculatingTextBox.Location = new System.Drawing.Point(74, 40);
-      this.calculatingTextBox.Name = "calculatingTextBox";
-      this.calculatingTextBox.Size = new System.Drawing.Size(53, 20);
-      this.calculatingTextBox.TabIndex = 4;
-      // 
-      // jobsTextBox
-      // 
-      this.jobsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.jobsTextBox.Location = new System.Drawing.Point(74, 16);
-      this.jobsTextBox.Name = "jobsTextBox";
-      this.jobsTextBox.Size = new System.Drawing.Size(53, 20);
-      this.jobsTextBox.TabIndex = 3;
-      // 
-      // finishedLabel
-      // 
-      this.finishedLabel.AutoSize = true;
-      this.finishedLabel.Location = new System.Drawing.Point(6, 67);
-      this.finishedLabel.Name = "finishedLabel";
-      this.finishedLabel.Size = new System.Drawing.Size(49, 13);
-      this.finishedLabel.TabIndex = 2;
-      this.finishedLabel.Text = "Finished:";
-      // 
-      // calculatingLabel
-      // 
-      this.calculatingLabel.AutoSize = true;
-      this.calculatingLabel.Location = new System.Drawing.Point(6, 43);
-      this.calculatingLabel.Name = "calculatingLabel";
-      this.calculatingLabel.Size = new System.Drawing.Size(62, 13);
-      this.calculatingLabel.TabIndex = 1;
-      this.calculatingLabel.Text = "Calculating:";
-      // 
-      // jobsLabel
-      // 
-      this.jobsLabel.AutoSize = true;
-      this.jobsLabel.Location = new System.Drawing.Point(6, 19);
-      this.jobsLabel.Name = "jobsLabel";
-      this.jobsLabel.Size = new System.Drawing.Size(32, 13);
-      this.jobsLabel.TabIndex = 0;
-      this.jobsLabel.Text = "Jobs:";
-      // 
-      // HiveExperimentView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.infoGroupBox);
-      this.Controls.Add(this.refreshAutomaticallyCheckBox);
-      this.Controls.Add(this.refreshButton);
-      this.Controls.Add(this.nameTextBox);
-      this.Controls.Add(this.nameLabel);
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.startButton);
-      this.Controls.Add(this.executionTimeTextBox);
-      this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.resourceNamesTextBox);
-      this.Controls.Add(this.pauseButton);
-      this.Controls.Add(this.resourceIdsLabel);
-      this.Controls.Add(this.stopButton);
-      this.Controls.Add(this.useLocalPluginsCheckBox);
-      this.Controls.Add(this.resetButton);
-      this.Name = "HiveExperimentView";
-      this.Size = new System.Drawing.Size(821, 628);
-      this.tabControl.ResumeLayout(false);
-      this.experimentTabPage.ResumeLayout(false);
-      this.jobsTabPage.ResumeLayout(false);
-      this.logTabPage.ResumeLayout(false);
-      this.infoGroupBox.ResumeLayout(false);
-      this.infoGroupBox.PerformLayout();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-    #endregion
-
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage experimentTabPage;
-    private System.Windows.Forms.Button startButton;
-    private System.Windows.Forms.Button stopButton;
-    private System.Windows.Forms.Button resetButton;
-    private System.Windows.Forms.Label executionTimeLabel;
-    private System.Windows.Forms.TextBox executionTimeTextBox;
-    private System.Windows.Forms.Button pauseButton;
-    private System.Windows.Forms.Label resourceIdsLabel;
-    private System.Windows.Forms.TextBox resourceNamesTextBox;
-    private System.Windows.Forms.Button viewExperimentButton;
-    private Core.Views.NamedItemView experimentNamedItemView;
-    private System.Windows.Forms.TabPage logTabPage;
-    private Core.Views.LogView logView;
-    private System.Windows.Forms.Button openExperimentButton;
-    private System.Windows.Forms.Button newExperimentButton;
-    private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
-    private System.Windows.Forms.TabPage jobsTabPage;
-    private ItemTreeView<HiveJob> jobsTreeView;
-    private System.Windows.Forms.Label nameLabel;
-    private System.Windows.Forms.TextBox nameTextBox;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.Button refreshButton;
-    private System.Windows.Forms.CheckBox refreshAutomaticallyCheckBox;
-    private System.Windows.Forms.GroupBox infoGroupBox;
-    private System.Windows.Forms.TextBox finishedTextBox;
-    private System.Windows.Forms.TextBox calculatingTextBox;
-    private System.Windows.Forms.TextBox jobsTextBox;
-    private System.Windows.Forms.Label finishedLabel;
-    private System.Windows.Forms.Label calculatingLabel;
-    private System.Windows.Forms.Label jobsLabel;
-
-  }
-}
Index: anches/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 6032)
+++ 	(revision )
@@ -1,356 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.ComponentModel;
-using System.Linq;
-using System.Threading;
-using System.Windows.Forms;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.Hive.Views {
-  /// <summary>
-  /// The base class for visual representations of items.
-  /// </summary>
-  [View("Hive Experiment View")]
-  [Content(typeof(HiveExperiment), true)]
-  public sealed partial class HiveExperimentView : ItemView {
-    private ProgressView progressView;
-
-    public new HiveExperiment Content {
-      get { return (HiveExperiment)base.Content; }
-      set { base.Content = value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemBaseView"/>.
-    /// </summary>
-    public HiveExperimentView() {
-      InitializeComponent();
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
-      Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
-      Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
-      base.DeregisterContentEvents();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
-      Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
-      Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        nameTextBox.Text = string.Empty;
-        executionTimeTextBox.Text = string.Empty;
-        resourceNamesTextBox.Text = string.Empty;
-        useLocalPluginsCheckBox.Checked = false;
-        logView.Content = null;
-        //includeJobsCheckBox.Checked = false;
-        refreshAutomaticallyCheckBox.Checked = false;
-        jobsTextBox.Text = "0";
-        calculatingTextBox.Text = "0";
-        finishedTextBox.Text = "0";
-      } else {
-        nameTextBox.Text = Content.Name;
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
-        resourceNamesTextBox.Text = Content.ResourceNames;
-        useLocalPluginsCheckBox.Checked = Content.UseLocalPlugins;
-        //includeJobsCheckBox.Checked = Content.IncludeJobs;
-        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
-        jobsTextBox.Text = Content.JobCount.ToString();
-        calculatingTextBox.Text = Content.CalculatingCount.ToString();
-        finishedTextBox.Text = Content.FinishedCount.ToString();
-      }
-      Content_HiveJobChanged(this, EventArgs.Empty);
-      Content_IsProgressingChanged(this, EventArgs.Empty);
-      SetEnabledStateOfControls();
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      executionTimeTextBox.Enabled = Content != null;
-      experimentNamedItemView.ReadOnly = true;
-      jobsTextBox.ReadOnly = true;
-      calculatingTextBox.ReadOnly = true;
-      finishedTextBox.ReadOnly = true;
-
-      if (Content != null) {
-        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;
-        this.resourceNamesTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
-        this.jobsTreeView.ReadOnly = Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
-        this.useLocalPluginsCheckBox.Enabled = !(Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
-        this.refreshAutomaticallyCheckBox.Enabled = alreadyUploaded && jobsLoaded && Content.ExecutionState == ExecutionState.Started;
-        this.viewExperimentButton.Enabled = Content.GetExperiment(0) != null;
-        this.openExperimentButton.Enabled = !alreadyUploaded && Content.ExecutionState == ExecutionState.Prepared;
-        this.newExperimentButton.Enabled = !alreadyUploaded && Content.ExecutionState == ExecutionState.Prepared;
-        this.refreshButton.Enabled = alreadyUploaded;
-
-        this.Locked = Content.ExecutionState == ExecutionState.Started;
-      }
-      SetEnabledStateOfExecutableButtons();
-    }
-
-    protected override void OnClosed(FormClosedEventArgs e) {
-      if (Content != null) {
-        if (Content.RefreshAutomatically)
-          Content.StopResultPolling();
-      }
-      base.OnClosed(e);
-    }
-
-    #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)
-        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
-      else
-        SetEnabledStateOfControls();
-    }
-    private void Content_Prepared(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Prepared), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        Locked = false;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Started(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Started), sender, e);
-      else {
-        nameTextBox.Enabled = false;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Paused(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Paused), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Stopped(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Stopped), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        Locked = false;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
-      else
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
-    }
-    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
-      else {
-        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_HiveJobChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
-      else {
-        if (Content != null && Content.HiveJobs != null) {
-          jobsTreeView.Content = Content.HiveJobs;
-          experimentNamedItemView.Content = Content.GetExperiment(0);
-          RegisterHiveJobEvents();
-        } else {
-          jobsTreeView.Content = null;
-          experimentNamedItemView.Content = null;
-        }
-        SetEnabledStateOfControls();
-      }
-    }
-
-    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)
-        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
-      else {
-        jobsTextBox.Text = Content.JobCount.ToString();
-        calculatingTextBox.Text = Content.CalculatingCount.ToString();
-        finishedTextBox.Text = Content.FinishedCount.ToString();
-      }
-    }
-    #endregion
-
-    #region Control events
-    private void startButton_Click(object sender, EventArgs e) {
-      ExperimentManagerClient.StartExperiment(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex)), Content);
-    }
-    private void pauseButton_Click(object sender, EventArgs e) {
-      ExperimentManagerClient.PauseExperiment(Content);
-    }
-    private void stopButton_Click(object sender, EventArgs e) {
-      ExperimentManagerClient.StopExperiment(Content);
-    }
-    private void resetButton_Click(object sender, EventArgs e) { }
-
-    private void nameTextBox_Validated(object sender, EventArgs e) {
-      if (Content.Name != nameTextBox.Text)
-        Content.Name = nameTextBox.Text;
-    }
-
-    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
-      if (Content.ResourceNames != resourceNamesTextBox.Text)
-        Content.ResourceNames = resourceNamesTextBox.Text;
-    }
-
-    private void newExperimentButton_Click(object sender, EventArgs e) {
-      Content.SetExperiment(new HeuristicLab.Optimization.Experiment());
-    }
-
-    private void openExperimentButton_Click(object sender, EventArgs e) {
-      OpenFileDialog openFileDialog = new OpenFileDialog();
-      openFileDialog.Title = "Open Experimenter";
-      openFileDialog.FileName = "Item";
-      openFileDialog.Multiselect = false;
-      openFileDialog.DefaultExt = "hl";
-      openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
-
-      if (openFileDialog.ShowDialog() == DialogResult.OK) {
-        Content.SetExperiment((HeuristicLab.Optimization.Experiment)ContentManager.Load(openFileDialog.FileName));
-      }
-    }
-
-    private void showExperimentButton_Click(object sender, EventArgs e) {
-      MainFormManager.MainForm.ShowContent(Content.GetExperiment(0));
-    }
-
-    private void viewExperimentButton_Click(object sender, EventArgs e) {
-      MainFormManager.MainForm.ShowContent(Content.GetExperiment(0));
-    }
-
-    private void includeJobsCheckBox_CheckedChanged(object sender, EventArgs e) {
-      //if (Content != null) Content.IncludeJobs = includeJobsCheckBox.Checked;
-    }
-
-    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
-      if (Content != null) {
-        Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
-      }
-    }
-
-    private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
-      if (Content != null) Content.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
-    }
-
-    private void refreshButton_Click(object sender, EventArgs e) {
-      var invoker = new Action<HiveExperiment>(ExperimentManagerClient.LoadExperiment);
-      invoker.BeginInvoke(Content, (ar) => {
-        try {
-          invoker.EndInvoke(ar);
-        }
-        catch (Exception ex) {
-          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
-        }
-      }, null);
-    }
-    #endregion
-
-    #region Helpers
-    private void SetEnabledStateOfExecutableButtons() {
-      if (Content == null) {
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-      } else {
-        startButton.Enabled = Content.GetExperiment(0) != null && Content.ExecutionState == ExecutionState.Prepared;
-        pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
-        stopButton.Enabled = Content.ExecutionState == ExecutionState.Started;
-        resetButton.Enabled = false;
-      }
-    }
-    #endregion
-
-    #region Progress reporting
-    private void Content_IsProgressingChanged(object sender, EventArgs e) {
-      if (this.InvokeRequired) {
-        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
-      } else {
-        if (Content != null && Content.IsProgressing) {
-          SetProgressView();
-        } else {
-          FinishProgressView();
-        }
-      }
-    }
-
-    private void SetProgressView() {
-      if (progressView == null) {
-        progressView = new ProgressView(this, Content.Progress);
-      }
-      progressView.Progress = Content.Progress;
-    }
-
-    private void FinishProgressView() {
-      if (progressView != null) {
-        progressView.Finish();
-        progressView = null;
-        SetEnabledStateOfControls();
-      }
-    }
-    #endregion
-
-  }
-}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.resx	(revision 6032)
+++ 	(revision )
@@ -1,266 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="openExperimentButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDAAA
-        CwwBP0AiyAAAAnpJREFUOE+lk1lIlFEYhv+LLrqySI1CMLJELBADQ6qLEKVFTSm3QkkTyq0FQzHXZlxH
-        nRnXKRVzRp1GHa0sxbBCKBSJ0HKhxNQsKCrF1FDJ7emfkSzLQPDiuTmc9znv+ThHAIT1sKZwWqHWWZqn
-        41pmORkqPfFyTcKvQ9ckCIpS4RWmCDCELsWWmSeLsuhUtU9gVCFCnTbHT4S/aaqRKf53tfD4ohPeEQo8
-        w3KNAvq7NcyM1xr5MaZjbkSNvlxBvTY1eTWJV7gSz9A83EMKEGorlEyPVa0IL3wuYq43kqqyTCqL01EX
-        JlOSm8RNeRwFshjR+XvwQrUmm+mvmuWTF8Uw/XHQG7Iq/whul8r4/qnEWNsQbq7LNvJQn0WDTsa9ynT0
-        6hR0JVLKVde5lZdAsTIOVXassY1QWZLO5Pt8DLWHWiXUVylZGJLCcOpK3olrg/HQFwWvI+iq8eVKsEeF
-        oFalMDGQCR/k3K9W0P5IvrTpzyu8CoQOb+bb3Jh57MTbCjsunj06IQr2CqV5Er69kTLclki9Ts7ioAR6
-        QpcEXcFi8DTz7R7MtBxhsukQo3X7kIZZc8bFLNcwTKFImchodyx3tNl0PhOb9EWKgvPQGcDi85PMPj3O
-        VPNhxuod+FJtS0faZvzdrHCwMbExClRZcfS0JHFXmwUDSfBSrPvCh9lWd6aeODHe4MiI3o6Pmt30yk2R
-        hOzCfo9F4/JTzs+IobY8k94H4XTkCMu0yzfQIttIY/ImahLMUcdYcOPqDvxddy462lu6LgtyUqPJkVwg
-        IzaI+Mt+hslyzteFU8cO4HzQjv121thaWWC53YytW0zYZmqy8iGt5ysbsj8BvQ/ROxW7aPkAAAAASUVO
-        RK5CYII=
-</value>
-  </data>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <data name="newExperimentButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDAAA
-        CwwBP0AiyAAAAaJJREFUOE+Nkk1LAkEYx5egU9Sla9AX6NKhLlH3IujSoXtBn0EI+gB5qVBIKyIMtEDo
-        BUIhK6qDSUj4gqYloilmvqa5rrr/Zlx3dkU0B/48z87O/zfzPDMcAE7SOg8sB2AkqYdIXIoAK4LyX17X
-        HiVzYPhC0NBUB1yR6Jfy5lx59rQXRAKEhl6Y4YhMnXOSmUDywRlYHV5YbG6YLp1UW2pgEyBoSdARbdNP
-        OszSSQxEZnkO2D+7w/TCWhtEOoGfqyE5KmKnVf/HIHBLcn4SiI21oGQPkw32J68M0VKvBKgvulgJdEey
-        O+sJNhlg9/i6aZalAEpz98xwQADhAaWJ2GOAWr0BCpFBCoCeIjOxgdCIHlYCiI8DGQ1QMjKzKIooVwSk
-        MuUmYGp+lf5rlcDeArhD6wMzqZOqUEe2UEE0WegNMFgcHYB6Q0SxXEUiXcJbNNsboD+xdwAqfA3p3C8i
-        n3l4QuneAFqfetDG5X94xFJFBCIZuHzJ/gHqxoVjObwGv/DojvcPUDfO9/4NpyeBm+dofwD5vrvFrtco
-        3zFd8J/oO/gDpYIVhUFyWDsAAAAASUVORK5CYII=
-</value>
-  </data>
-  <data name="startButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
-        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
-        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
-        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
-        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
-        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
-        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
-        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
-        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
-        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
-</value>
-  </data>
-  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
-        MP3x/9JZj4EWI7yN4oKuDb/+bzr57f/KQ1/+L9jz6f/lBz//965997956RuwIXnTX/zXDV2F2wCQrSsO
-        fvk/b9en/7ee/AIp/N+w5M3/0rkv/+dMff4/qffZf1W/RbgNADl5zo5P/x++/AHWDAIls1/+z5ry/H9C
-        79P/Ya2P/8u5zcJtAMi/Nx99hmtGZhy7/Oa/V+3D/2J2k3AbAPJn87I3/09deQnXG9355H9g0yMw36H0
-        /n9+s27cBoBCuhxoSM605/93HrkL1hTQ8Oi/W9UDMNss7+5/ToNW3AaAoikb6N9EoH/D2x7/n7Puwn/X
-        ivv/bYrvgQ3Qy7j1n1WnEbcBoDiO63n6P7Tl0X+fuof/ncrv/7cuvPffJPsO2AD1JCIMsEza9h+EjWM2
-        /NcKXv5fwWMuOOB4TTr/s+k24XcB0BKSkzbJGtAtodgAAJMl+qgyDSjjAAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
-        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
-        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
-        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
-</value>
-  </data>
-  <data name="refreshButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
-        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp
-        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE
-        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs
-        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4
-        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR
-        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd
-        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF
-        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX
-        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF
-        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55
-        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ
-        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB
-        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC
-        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE
-        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I
-        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9
-        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG
-        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp
-        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ
-        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC
-        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln
-        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v
-        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp
-        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L
-        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA
-        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z
-        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW
-        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s
-        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6
-        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw
-        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR
-        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm
-        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl
-        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2
-        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8
-        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za
-        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v
-        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb
-        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/
-        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h
-        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr
-        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
-        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
-        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
-        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAABl0RVh0U29mdHdhcmUA
-        UGFpbnQuTkVUIHYzLjUuNUmK/OAAAAJiSURBVDhPnZNtSFNRHMbdzAgV/DC0bL4R5rSNEjOjiJkhUfpB
-        Aikog74ERV+iIipymgvXbFZrW1NrFoQhQUr2phQxcK0XGWx+2JhGdrfWNmduM1N3r9vTPcNF0vVLFx4O
-        h3Of33nO+f9PUtLSRwcHkunQEJ8OGzOZGXMq8/NjJqsMZuZ9NhMyrqKnX/HIr/Peu5KE55+RmR3JM419
-        QLtRg/rHR1HVVQvprX243C+HjXKE6LD5iMqoBycg4usR9I++RN3zBsgmFFC4NLjiUKHJ0YYTn86h8k4N
-        rBN2lNzcxg1weMaDxHx14gZq+w4hq2kD1sk34pjxVBzU7LgehxQoxdyAC0+b0WA6ie3qPWgf1GLU5cSY
-        l0JOiyieKqFseSE34IDhMKSd+9FneQFmMSamF2Np/sA0bG7nMoigMZ8bUNFZhfNPZMRcyopHMzFer2UA
-        +QoJchXFIDsTc8ZFITdgi3YnRr7Y4Jv8kUJu2eMN5Li/+1O+eSfXeHyB1eycT7l9a52fKW4AuyOWtJcd
-        kyN0bJfb4+fNR6L8uYUo7xer2blommxYyQ0oM1Ris34Him+XBwvaJGFhqwgd5odYoKMCkoiFVHcM30eJ
-        doUybjVIoXTp4iUrVJXCQtnJccAmyCUprNQYah7VY31jEXeCTbqKPwACEanLYflqZztwHF2mnnhXklIe
-        f3CaG8DGRtG1smU1J6aEkZiFMhHuve3lBuS1ivHM+hpCtnH+NiUaiJgVQxoEQsxuzregf9MN9qLwzmHB
-        pd4W1OoOIv1sFtLPZKFaXQftYDemwkyqZ4rmr/ga/2fhN/0cpIchJAs6AAAAAElFTkSuQmCC
-</value>
-  </data>
-  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>25</value>
-  </metadata>
-</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs	(revision 6033)
@@ -29,4 +29,5 @@
   [View("HiveJob View")]
   [Content(typeof(HiveJob), true)]
+  [Content(typeof(HiveJob<>), false)]
   public partial class HiveJobView : ItemView {
     public new HiveJob Content {
@@ -45,5 +46,5 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.OptimizerJobChanged += new EventHandler(Content_OptimizerJobChanged);
+      Content.JobItemChanged += new EventHandler(Content_JobItemChanged);
       Content.JobChanged += new EventHandler(Content_JobChanged);
       Content.JobStateChanged += new EventHandler(Content_JobStateChanged);
@@ -51,5 +52,5 @@
 
     protected override void DeregisterContentEvents() {
-      Content.OptimizerJobChanged -= new EventHandler(Content_OptimizerJobChanged);
+      Content.JobItemChanged -= new EventHandler(Content_JobItemChanged);
       Content.JobChanged -= new EventHandler(Content_JobChanged);
       Content.JobStateChanged -= new EventHandler(Content_JobStateChanged);
@@ -60,46 +61,29 @@
       base.OnContentChanged();
       if (Content != null && Content.Job != null) {
-        logView.Content = Content.OptimizerJob.Log;
-        computeInParallelCheckBox.Checked = Content.OptimizerJob.ComputeInParallel;
+        computeInParallelCheckBox.Checked = Content.JobItem.ComputeInParallel;
       } else {
-        logView.Content = null;
         computeInParallelCheckBox.Checked = false;
       }
-      Content_OptimizerJobChanged(this, EventArgs.Empty);
+      Content_JobItemChanged(this, EventArgs.Empty);
       Content_JobChanged(this, EventArgs.Empty);
       Content_JobStateChanged(this, EventArgs.Empty);
     }
 
-    protected void Content_OptimizerJobChanged(object sender, EventArgs e) {
-      RegisterJobEvents();
-      Job_OptimizerChanged(this, e);
-    }
-
-    protected void Job_OptimizerChanged(object sender, EventArgs e) {
-      if (Content != null && Content.Job != null && Content.OptimizerJob.Optimizer != null) {
-        optimizerNamedItemView.Content = Content.OptimizerJob.Optimizer;
-        runCollectionViewHost.Content = Content.OptimizerJob.Optimizer.Runs;
-      } else {
-        optimizerNamedItemView.Content = null;
-        runCollectionViewHost.Content = null;
+    protected virtual void RegisterJobEvents() {
+      if (Content != null && Content.Job != null) {
+        Content.JobItem.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
+        Content.JobItem.ItemChanged += new EventHandler(Job_ItemChanged);
       }
     }
 
-    private void RegisterJobEvents() {
+    protected virtual void DeregisterJobEvents() {
       if (Content != null && Content.Job != null) {
-        Content.OptimizerJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        Content.OptimizerJob.OptimizerChanged += new EventHandler(Job_OptimizerChanged);
-      }
-    }
-
-    private void DeregisterJobEvents() {
-      if (Content != null && Content.Job != null) {
-        Content.OptimizerJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        Content.OptimizerJob.OptimizerChanged -= new EventHandler(Job_OptimizerChanged);
+        Content.JobItem.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
+        Content.JobItem.ItemChanged -= new EventHandler(Job_ItemChanged);
       }
     }
 
     #region Content Events
-    private void Content_JobChanged(object sender, EventArgs e) {
+    protected virtual void Content_JobChanged(object sender, EventArgs e) {
       if (InvokeRequired) {
         Invoke(new EventHandler(Content_JobChanged), sender, e);
@@ -121,5 +105,18 @@
     }
 
-    private void Content_JobStateChanged(object sender, EventArgs e) {
+    protected virtual void Content_JobItemChanged(object sender, EventArgs e) {
+      RegisterJobEvents();
+      Job_ItemChanged(this, e);
+    }
+
+    protected virtual void Job_ItemChanged(object sender, EventArgs e) {
+      if (Content != null && Content.Job != null && Content.JobItem.Item != null) {
+        optimizerItemView.Content = Content.JobItem.Item;
+      } else {
+        optimizerItemView.Content = null;
+      }
+    }
+
+    protected virtual void Content_JobStateChanged(object sender, EventArgs e) {
       if (InvokeRequired) {
         Invoke(new EventHandler(Content_JobStateChanged), sender, e);
@@ -131,5 +128,5 @@
           this.exceptionTextBox.Text = Content.Job.CurrentStateLog != null ? Content.Job.CurrentStateLog.Exception : string.Empty;
           this.lastUpdatedTextBox.Text = Content.Job.LastJobDataUpdate.ToString();
-          if (Content.OptimizerJob.ComputeInParallel) {
+          if (Content.JobItem.ComputeInParallel) {
             this.stateLogViewHost.Content = new StateLogListList(
                 this.Content.ChildHiveJobs.Select(child => new StateLogList(child.Job.StateLog)
@@ -165,30 +162,28 @@
       this.coresNeededTextBox.ReadOnly = this.ReadOnly;
       this.memoryNeededTextBox.ReadOnly = this.ReadOnly;
-      this.computeInParallelCheckBox.Enabled = !this.ReadOnly && this.Content != null && this.Content.OptimizerJob != null && this.Content.OptimizerJob.IsParallelizable;
+      this.computeInParallelCheckBox.Enabled = !this.ReadOnly && this.Content != null && this.Content.JobItem != null && this.Content.JobItem.IsParallelizable;
 
-      this.restartButton.Enabled = Content != null && Content.Job.State == JobState.Paused;
-      this.pauseButton.Enabled = Content != null && Content.Job.State == JobState.Calculating;
-      this.stopButton.Enabled = Content != null && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
-      this.showOptimizerButton.Enabled = Content != null && Content.Job.State == JobState.Paused && Content.OptimizerJob != null && Content.OptimizerJob.Optimizer != null;
+      this.modifyItemButton.Enabled = (Content != null && Content.JobItem.Item != null && (Content.Job.State == JobState.Paused || Content.Job.State == JobState.Offline || Content.Job.State == JobState.Finished || Content.Job.State == JobState.Failed || Content.Job.State == JobState.Aborted));
 
-      optimizerNamedItemView.ReadOnly = true;
+      optimizerItemView.ReadOnly = true;
     }
 
-    void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
+    protected virtual void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
       if (InvokeRequired) {
         Invoke(new EventHandler(OptimizerJob_ComputeInParallelChanged), sender, e);
       } else {
-        computeInParallelCheckBox.Checked = Content.OptimizerJob.ComputeInParallel;
+        computeInParallelCheckBox.Checked = Content.JobItem.ComputeInParallel;
       }
     }
     #endregion
 
-    private void computeInParallelCheckBox_CheckedChanged(object sender, EventArgs e) {
-      if (Content != null && Content.OptimizerJob != null) {
-        this.Content.OptimizerJob.ComputeInParallel = this.computeInParallelCheckBox.Checked;
+    #region Child Control Events
+     protected virtual void computeInParallelCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null && Content.JobItem != null) {
+        this.Content.JobItem.ComputeInParallel = this.computeInParallelCheckBox.Checked;
       }
     }
 
-    private void exceptionTextBox_DoubleClick(object sender, EventArgs e) {
+    protected virtual void exceptionTextBox_DoubleClick(object sender, EventArgs e) {
       using (TextDialog dialog = new TextDialog("Exception", exceptionTextBox.Text, ReadOnly || !Content.CanChangeDescription)) {
         if (dialog.ShowDialog(this) == DialogResult.OK)
@@ -197,18 +192,8 @@
     }
 
-    private void restartButton_Click(object sender, EventArgs e) {
-      Content.Restart();
+    protected virtual void modifyItemButton_Click(object sender, EventArgs e) {
+      MainFormManager.MainForm.ShowContent(Content.JobItem.Item);
     }
-
-    private void pauseButton_Click(object sender, EventArgs e) {
-      Content.Pause();
-    }
-
-    private void stopButton_Click(object sender, EventArgs e) {
-      Content.Stop();
-    }
-    private void showOptimizerButton_Click(object sender, EventArgs e) {
-      MainFormManager.MainForm.ShowContent(Content.OptimizerJob.Optimizer);
-    }
+    #endregion
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs	(revision 6033)
@@ -24,20 +24,8 @@
     /// </summary>
     private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveJobView));
-      this.logTabPage = new System.Windows.Forms.TabPage();
-      this.logView = new HeuristicLab.Core.Views.LogView();
       this.stateLogTabPage = new System.Windows.Forms.TabPage();
       this.stateLogViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.runsTabPage = new System.Windows.Forms.TabPage();
-      this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.detailsTabPage = new System.Windows.Forms.TabPage();
-      this.restartButton = new System.Windows.Forms.Button();
-      this.pauseButton = new System.Windows.Forms.Button();
-      this.stopButton = new System.Windows.Forms.Button();
-      this.optimizerGroupBox = new System.Windows.Forms.GroupBox();
-      this.showOptimizerButton = new System.Windows.Forms.Button();
-      this.lastUpdatedTextBox = new System.Windows.Forms.TextBox();
-      this.lastUpdatedLabel = new System.Windows.Forms.Label();
-      this.optimizerNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
       this.configurationGroupBox = new System.Windows.Forms.GroupBox();
       this.priorityTextBox = new System.Windows.Forms.TextBox();
@@ -49,6 +37,4 @@
       this.computeInParallelLabel = new System.Windows.Forms.Label();
       this.computeInParallelCheckBox = new System.Windows.Forms.CheckBox();
-      this.jobIdLabel = new System.Windows.Forms.Label();
-      this.jobIdTextBox = new System.Windows.Forms.TextBox();
       this.jobStatusGroupBox = new System.Windows.Forms.GroupBox();
       this.stateTextBox = new System.Windows.Forms.TextBox();
@@ -64,43 +50,23 @@
       this.dateFinishedLabel = new System.Windows.Forms.Label();
       this.exceptionTextBox = new System.Windows.Forms.TextBox();
+      this.optimizerGroupBox = new System.Windows.Forms.GroupBox();
+      this.modifyItemButton = new System.Windows.Forms.Button();
+      this.lastUpdatedTextBox = new System.Windows.Forms.TextBox();
+      this.lastUpdatedLabel = new System.Windows.Forms.Label();
+      this.optimizerItemView = new HeuristicLab.Core.Views.ItemView();
+      this.jobIdLabel = new System.Windows.Forms.Label();
+      this.jobIdTextBox = new System.Windows.Forms.TextBox();
       this.tabControl = new System.Windows.Forms.TabControl();
-      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-      this.logTabPage.SuspendLayout();
       this.stateLogTabPage.SuspendLayout();
-      this.runsTabPage.SuspendLayout();
       this.detailsTabPage.SuspendLayout();
-      this.optimizerGroupBox.SuspendLayout();
-      this.configurationGroupBox.SuspendLayout();
-      this.jobStatusGroupBox.SuspendLayout();
-      this.tabControl.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
       this.splitContainer1.Panel1.SuspendLayout();
       this.splitContainer1.Panel2.SuspendLayout();
       this.splitContainer1.SuspendLayout();
+      this.configurationGroupBox.SuspendLayout();
+      this.jobStatusGroupBox.SuspendLayout();
+      this.optimizerGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
       this.SuspendLayout();
-      // 
-      // logTabPage
-      // 
-      this.logTabPage.Controls.Add(this.logView);
-      this.logTabPage.Location = new System.Drawing.Point(4, 22);
-      this.logTabPage.Name = "logTabPage";
-      this.logTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.logTabPage.Size = new System.Drawing.Size(611, 492);
-      this.logTabPage.TabIndex = 1;
-      this.logTabPage.Text = "Log";
-      this.logTabPage.UseVisualStyleBackColor = true;
-      // 
-      // 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, 3);
-      this.logView.Name = "logView";
-      this.logView.ReadOnly = false;
-      this.logView.Size = new System.Drawing.Size(613, 486);
-      this.logView.TabIndex = 0;
       // 
       // stateLogTabPage
@@ -109,5 +75,5 @@
       this.stateLogTabPage.Location = new System.Drawing.Point(4, 22);
       this.stateLogTabPage.Name = "stateLogTabPage";
-      this.stateLogTabPage.Size = new System.Drawing.Size(611, 492);
+      this.stateLogTabPage.Size = new System.Drawing.Size(563, 375);
       this.stateLogTabPage.TabIndex = 5;
       this.stateLogTabPage.Text = "State";
@@ -123,41 +89,12 @@
       this.stateLogViewHost.Name = "stateLogViewHost";
       this.stateLogViewHost.ReadOnly = false;
-      this.stateLogViewHost.Size = new System.Drawing.Size(611, 492);
+      this.stateLogViewHost.Size = new System.Drawing.Size(563, 375);
       this.stateLogViewHost.TabIndex = 0;
       this.stateLogViewHost.ViewsLabelVisible = true;
       this.stateLogViewHost.ViewType = null;
       // 
-      // runsTabPage
-      // 
-      this.runsTabPage.Controls.Add(this.runCollectionViewHost);
-      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Size = new System.Drawing.Size(611, 492);
-      this.runsTabPage.TabIndex = 4;
-      this.runsTabPage.Text = "Runs";
-      this.runsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // runCollectionViewHost
-      // 
-      this.runCollectionViewHost.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.runCollectionViewHost.Caption = "View";
-      this.runCollectionViewHost.Content = null;
-      this.runCollectionViewHost.Enabled = false;
-      this.runCollectionViewHost.Location = new System.Drawing.Point(3, 3);
-      this.runCollectionViewHost.Name = "runCollectionViewHost";
-      this.runCollectionViewHost.ReadOnly = false;
-      this.runCollectionViewHost.Size = new System.Drawing.Size(613, 486);
-      this.runCollectionViewHost.TabIndex = 0;
-      this.runCollectionViewHost.ViewsLabelVisible = true;
-      this.runCollectionViewHost.ViewType = null;
-      // 
       // detailsTabPage
       // 
       this.detailsTabPage.Controls.Add(this.splitContainer1);
-      this.detailsTabPage.Controls.Add(this.restartButton);
-      this.detailsTabPage.Controls.Add(this.pauseButton);
-      this.detailsTabPage.Controls.Add(this.stopButton);
       this.detailsTabPage.Controls.Add(this.optimizerGroupBox);
       this.detailsTabPage.Controls.Add(this.jobIdLabel);
@@ -171,94 +108,21 @@
       this.detailsTabPage.UseVisualStyleBackColor = true;
       // 
-      // restartButton
-      // 
-      this.restartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.restartButton.Image = ((System.Drawing.Image)(resources.GetObject("restartButton.Image")));
-      this.restartButton.Location = new System.Drawing.Point(3, 348);
-      this.restartButton.Name = "restartButton";
-      this.restartButton.Size = new System.Drawing.Size(24, 24);
-      this.restartButton.TabIndex = 30;
-      this.restartButton.UseVisualStyleBackColor = true;
-      this.restartButton.Click += new System.EventHandler(this.restartButton_Click);
-      // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Enabled = false;
-      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
-      this.pauseButton.Location = new System.Drawing.Point(33, 348);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 31;
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
-      // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
-      this.stopButton.Location = new System.Drawing.Point(63, 348);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 32;
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
-      // optimizerGroupBox
-      // 
-      this.optimizerGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.optimizerGroupBox.Controls.Add(this.showOptimizerButton);
-      this.optimizerGroupBox.Controls.Add(this.lastUpdatedTextBox);
-      this.optimizerGroupBox.Controls.Add(this.lastUpdatedLabel);
-      this.optimizerGroupBox.Controls.Add(this.optimizerNamedItemView);
-      this.optimizerGroupBox.Location = new System.Drawing.Point(6, 29);
-      this.optimizerGroupBox.Name = "optimizerGroupBox";
-      this.optimizerGroupBox.Size = new System.Drawing.Size(551, 129);
-      this.optimizerGroupBox.TabIndex = 28;
-      this.optimizerGroupBox.TabStop = false;
-      this.optimizerGroupBox.Text = "Optimizer";
-      // 
-      // showOptimizerButton
-      // 
-      this.showOptimizerButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.showOptimizerButton.Location = new System.Drawing.Point(78, 99);
-      this.showOptimizerButton.Name = "showOptimizerButton";
-      this.showOptimizerButton.Size = new System.Drawing.Size(467, 23);
-      this.showOptimizerButton.TabIndex = 3;
-      this.showOptimizerButton.Text = "Show Optimizer";
-      this.showOptimizerButton.UseVisualStyleBackColor = true;
-      this.showOptimizerButton.Click += new System.EventHandler(this.showOptimizerButton_Click);
-      // 
-      // lastUpdatedTextBox
-      // 
-      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.lastUpdatedTextBox.Location = new System.Drawing.Point(78, 73);
-      this.lastUpdatedTextBox.Name = "lastUpdatedTextBox";
-      this.lastUpdatedTextBox.Size = new System.Drawing.Size(467, 20);
-      this.lastUpdatedTextBox.TabIndex = 2;
-      // 
-      // lastUpdatedLabel
-      // 
-      this.lastUpdatedLabel.AutoSize = true;
-      this.lastUpdatedLabel.Location = new System.Drawing.Point(9, 76);
-      this.lastUpdatedLabel.Name = "lastUpdatedLabel";
-      this.lastUpdatedLabel.Size = new System.Drawing.Size(71, 13);
-      this.lastUpdatedLabel.TabIndex = 1;
-      this.lastUpdatedLabel.Text = "LastUpdated:";
-      // 
-      // optimizerNamedItemView
-      // 
-      this.optimizerNamedItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.optimizerNamedItemView.Caption = "NamedItem View";
-      this.optimizerNamedItemView.Content = null;
-      this.optimizerNamedItemView.Location = new System.Drawing.Point(6, 20);
-      this.optimizerNamedItemView.Name = "optimizerNamedItemView";
-      this.optimizerNamedItemView.ReadOnly = false;
-      this.optimizerNamedItemView.Size = new System.Drawing.Size(539, 51);
-      this.optimizerNamedItemView.TabIndex = 0;
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(6, 110);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.configurationGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.jobStatusGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(551, 155);
+      this.splitContainer1.SplitterDistance = 275;
+      this.splitContainer1.TabIndex = 33;
       // 
       // configurationGroupBox
@@ -352,22 +216,4 @@
       this.computeInParallelCheckBox.UseVisualStyleBackColor = true;
       this.computeInParallelCheckBox.CheckedChanged += new System.EventHandler(this.computeInParallelCheckBox_CheckedChanged);
-      // 
-      // jobIdLabel
-      // 
-      this.jobIdLabel.AutoSize = true;
-      this.jobIdLabel.Location = new System.Drawing.Point(3, 6);
-      this.jobIdLabel.Name = "jobIdLabel";
-      this.jobIdLabel.Size = new System.Drawing.Size(36, 13);
-      this.jobIdLabel.TabIndex = 25;
-      this.jobIdLabel.Text = "JobId:";
-      // 
-      // jobIdTextBox
-      // 
-      this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.jobIdTextBox.Location = new System.Drawing.Point(91, 6);
-      this.jobIdTextBox.Name = "jobIdTextBox";
-      this.jobIdTextBox.Size = new System.Drawing.Size(466, 20);
-      this.jobIdTextBox.TabIndex = 26;
       // 
       // jobStatusGroupBox
@@ -502,4 +348,79 @@
       this.exceptionTextBox.DoubleClick += new System.EventHandler(this.exceptionTextBox_DoubleClick);
       // 
+      // optimizerGroupBox
+      // 
+      this.optimizerGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerGroupBox.Controls.Add(this.modifyItemButton);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedTextBox);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedLabel);
+      this.optimizerGroupBox.Controls.Add(this.optimizerItemView);
+      this.optimizerGroupBox.Location = new System.Drawing.Point(6, 29);
+      this.optimizerGroupBox.Name = "optimizerGroupBox";
+      this.optimizerGroupBox.Size = new System.Drawing.Size(551, 75);
+      this.optimizerGroupBox.TabIndex = 28;
+      this.optimizerGroupBox.TabStop = false;
+      this.optimizerGroupBox.Text = "JobItem";
+      // 
+      // modifyItemButton
+      // 
+      this.modifyItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.modifyItemButton.Location = new System.Drawing.Point(78, 45);
+      this.modifyItemButton.Name = "modifyItemButton";
+      this.modifyItemButton.Size = new System.Drawing.Size(467, 23);
+      this.modifyItemButton.TabIndex = 3;
+      this.modifyItemButton.Text = "Modify Item";
+      this.modifyItemButton.UseVisualStyleBackColor = true;
+      this.modifyItemButton.Click += new System.EventHandler(this.modifyItemButton_Click);
+      // 
+      // lastUpdatedTextBox
+      // 
+      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastUpdatedTextBox.Location = new System.Drawing.Point(78, 19);
+      this.lastUpdatedTextBox.Name = "lastUpdatedTextBox";
+      this.lastUpdatedTextBox.Size = new System.Drawing.Size(467, 20);
+      this.lastUpdatedTextBox.TabIndex = 2;
+      // 
+      // lastUpdatedLabel
+      // 
+      this.lastUpdatedLabel.AutoSize = true;
+      this.lastUpdatedLabel.Location = new System.Drawing.Point(3, 22);
+      this.lastUpdatedLabel.Name = "lastUpdatedLabel";
+      this.lastUpdatedLabel.Size = new System.Drawing.Size(71, 13);
+      this.lastUpdatedLabel.TabIndex = 1;
+      this.lastUpdatedLabel.Text = "LastUpdated:";
+      // 
+      // optimizerItemView
+      // 
+      this.optimizerItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerItemView.Caption = "NamedItem View";
+      this.optimizerItemView.Content = null;
+      this.optimizerItemView.Location = new System.Drawing.Point(6, 20);
+      this.optimizerItemView.Name = "optimizerItemView";
+      this.optimizerItemView.ReadOnly = false;
+      this.optimizerItemView.Size = new System.Drawing.Size(539, 51);
+      this.optimizerItemView.TabIndex = 0;
+      // 
+      // jobIdLabel
+      // 
+      this.jobIdLabel.AutoSize = true;
+      this.jobIdLabel.Location = new System.Drawing.Point(3, 6);
+      this.jobIdLabel.Name = "jobIdLabel";
+      this.jobIdLabel.Size = new System.Drawing.Size(36, 13);
+      this.jobIdLabel.TabIndex = 25;
+      this.jobIdLabel.Text = "JobId:";
+      // 
+      // jobIdTextBox
+      // 
+      this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobIdTextBox.Location = new System.Drawing.Point(91, 6);
+      this.jobIdTextBox.Name = "jobIdTextBox";
+      this.jobIdTextBox.Size = new System.Drawing.Size(466, 20);
+      this.jobIdTextBox.TabIndex = 26;
+      // 
       // tabControl
       // 
@@ -509,6 +430,4 @@
       this.tabControl.Controls.Add(this.detailsTabPage);
       this.tabControl.Controls.Add(this.stateLogTabPage);
-      this.tabControl.Controls.Add(this.runsTabPage);
-      this.tabControl.Controls.Add(this.logTabPage);
       this.tabControl.Location = new System.Drawing.Point(3, 3);
       this.tabControl.Name = "tabControl";
@@ -517,22 +436,4 @@
       this.tabControl.TabIndex = 25;
       // 
-      // splitContainer1
-      // 
-      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.splitContainer1.Location = new System.Drawing.Point(6, 164);
-      this.splitContainer1.Name = "splitContainer1";
-      // 
-      // splitContainer1.Panel1
-      // 
-      this.splitContainer1.Panel1.Controls.Add(this.configurationGroupBox);
-      // 
-      // splitContainer1.Panel2
-      // 
-      this.splitContainer1.Panel2.Controls.Add(this.jobStatusGroupBox);
-      this.splitContainer1.Size = new System.Drawing.Size(551, 155);
-      this.splitContainer1.SplitterDistance = 275;
-      this.splitContainer1.TabIndex = 33;
-      // 
       // HiveJobView
       // 
@@ -542,20 +443,18 @@
       this.Name = "HiveJobView";
       this.Size = new System.Drawing.Size(577, 407);
-      this.logTabPage.ResumeLayout(false);
       this.stateLogTabPage.ResumeLayout(false);
-      this.runsTabPage.ResumeLayout(false);
       this.detailsTabPage.ResumeLayout(false);
       this.detailsTabPage.PerformLayout();
-      this.optimizerGroupBox.ResumeLayout(false);
-      this.optimizerGroupBox.PerformLayout();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
       this.configurationGroupBox.ResumeLayout(false);
       this.configurationGroupBox.PerformLayout();
       this.jobStatusGroupBox.ResumeLayout(false);
       this.jobStatusGroupBox.PerformLayout();
+      this.optimizerGroupBox.ResumeLayout(false);
+      this.optimizerGroupBox.PerformLayout();
       this.tabControl.ResumeLayout(false);
-      this.splitContainer1.Panel1.ResumeLayout(false);
-      this.splitContainer1.Panel2.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
-      this.splitContainer1.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -564,45 +463,38 @@
     #endregion
 
-    private System.Windows.Forms.TabPage logTabPage;
-    private Core.Views.LogView logView;
-    private System.Windows.Forms.TabPage stateLogTabPage;
-    private MainForm.WindowsForms.ViewHost stateLogViewHost;
-    private System.Windows.Forms.TabPage runsTabPage;
-    private MainForm.WindowsForms.ViewHost runCollectionViewHost;
-    private System.Windows.Forms.TabPage detailsTabPage;
-    private System.Windows.Forms.GroupBox optimizerGroupBox;
-    private Core.Views.NamedItemView optimizerNamedItemView;
-    private System.Windows.Forms.GroupBox configurationGroupBox;
-    private System.Windows.Forms.TextBox priorityTextBox;
-    private System.Windows.Forms.Label priorityLabel;
-    private System.Windows.Forms.TextBox coresNeededTextBox;
-    private System.Windows.Forms.TextBox memoryNeededTextBox;
-    private System.Windows.Forms.Label memoryNeededLabel;
-    private System.Windows.Forms.Label coresNeededLabel;
-    private System.Windows.Forms.Label computeInParallelLabel;
-    private System.Windows.Forms.CheckBox computeInParallelCheckBox;
-    private System.Windows.Forms.Label jobIdLabel;
-    private System.Windows.Forms.TextBox jobIdTextBox;
-    private System.Windows.Forms.GroupBox jobStatusGroupBox;
-    private System.Windows.Forms.TextBox stateTextBox;
-    private System.Windows.Forms.Label stateLabel;
-    private System.Windows.Forms.TextBox dateFinishedTextBox;
-    private System.Windows.Forms.TextBox executionTimeTextBox;
-    private System.Windows.Forms.Label executionTimeLabel;
-    private System.Windows.Forms.Label exceptionLabel;
-    private System.Windows.Forms.Label dateFinishedLabel;
-    private System.Windows.Forms.TextBox exceptionTextBox;
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.Button restartButton;
-    private System.Windows.Forms.Button pauseButton;
-    private System.Windows.Forms.Button stopButton;
-    private System.Windows.Forms.Button showOptimizerButton;
-    private System.Windows.Forms.TextBox lastUpdatedTextBox;
-    private System.Windows.Forms.Label lastUpdatedLabel;
-    private System.Windows.Forms.Label dateCalculatedLabel;
-    private System.Windows.Forms.TextBox dateCalculatedText;
-    private System.Windows.Forms.TextBox dateCreatedTextBox;
-    private System.Windows.Forms.Label dateCreatedLabel;
-    private System.Windows.Forms.SplitContainer splitContainer1;
+    protected System.Windows.Forms.TabPage stateLogTabPage;
+    protected MainForm.WindowsForms.ViewHost stateLogViewHost;
+    protected System.Windows.Forms.TabPage detailsTabPage;
+    protected System.Windows.Forms.GroupBox optimizerGroupBox;
+    protected Core.Views.ItemView optimizerItemView;
+    protected System.Windows.Forms.GroupBox configurationGroupBox;
+    protected System.Windows.Forms.TextBox priorityTextBox;
+    protected System.Windows.Forms.Label priorityLabel;
+    protected System.Windows.Forms.TextBox coresNeededTextBox;
+    protected System.Windows.Forms.TextBox memoryNeededTextBox;
+    protected System.Windows.Forms.Label memoryNeededLabel;
+    protected System.Windows.Forms.Label coresNeededLabel;
+    protected System.Windows.Forms.Label computeInParallelLabel;
+    protected System.Windows.Forms.CheckBox computeInParallelCheckBox;
+    protected System.Windows.Forms.Label jobIdLabel;
+    protected System.Windows.Forms.TextBox jobIdTextBox;
+    protected System.Windows.Forms.GroupBox jobStatusGroupBox;
+    protected System.Windows.Forms.TextBox stateTextBox;
+    protected System.Windows.Forms.Label stateLabel;
+    protected System.Windows.Forms.TextBox dateFinishedTextBox;
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.Label exceptionLabel;
+    protected System.Windows.Forms.Label dateFinishedLabel;
+    protected System.Windows.Forms.TextBox exceptionTextBox;
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.Button modifyItemButton;
+    protected System.Windows.Forms.TextBox lastUpdatedTextBox;
+    protected System.Windows.Forms.Label lastUpdatedLabel;
+    protected System.Windows.Forms.Label dateCalculatedLabel;
+    protected System.Windows.Forms.TextBox dateCalculatedText;
+    protected System.Windows.Forms.TextBox dateCreatedTextBox;
+    protected System.Windows.Forms.Label dateCreatedLabel;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
 
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx	(revision 6033)
@@ -118,37 +118,3 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="restartButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
-        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
-        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
-        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
-        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
-        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
-        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
-</value>
-  </data>
-  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
-        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
-        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
-        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
-        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
-        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
-        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
-        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
-</value>
-  </data>
 </root>
Index: anches/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 6032)
+++ 	(revision )
@@ -1,331 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Windows.Forms;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Clients.Hive.Views {
-  [View("ItemTree View")]
-  [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;
-      }
-    }
-
-    public ItemTreeView() {
-      InitializeComponent();
-    }
-
-    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((T)node.Tag, node);
-      }
-      base.DeregisterContentEvents();
-    }
-
-    private void DeregisterContentEvents(T 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 EventHandler(item_ToStringChanged);
-      item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
-      foreach (TreeNode childNode in node.Nodes) {
-        DeregisterContentEvents((T)childNode.Tag, childNode);
-      }
-    }
-
-    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((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);
-      item.CollectionReset += new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset);
-      item.ToStringChanged += new EventHandler(item_ToStringChanged);
-      item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
-      foreach (TreeNode childNode in node.Nodes) {
-        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 T);
-        if (node != null) {
-          foreach (T item in e.Items) {
-            AddChildNodes(item, node.Nodes, true);
-            node.ExpandAll();
-            UpdateNodeItemImage(node);
-          }
-        }
-      }
-    }
-
-    private void item_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
-      if (InvokeRequired) {
-        Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved), sender, e);
-      } else {
-        TreeNode node = GetNodeByItem(sender as T);
-        if (node != null) {
-          foreach (T item in e.Items) {
-            RemoveChildNodes(item, node.Nodes);
-          }
-          RebuildImageList();
-        }
-      }
-    }
-
-    private void item_CollectionReset(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
-      if (InvokeRequired) {
-        Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset), sender, e);
-      } else {
-        TreeNode node = GetNodeByItem(sender as T);
-        if (node != null) {
-          foreach (T item in e.OldItems) {
-            RemoveChildNodes(item, node.Nodes);
-          }
-          RebuildImageList();
-          foreach (T item in e.Items) {
-            AddChildNodes(item, node.Nodes, true);
-          }
-        }
-      }
-    }
-
-    private void item_ToStringChanged(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(item_ToStringChanged), sender, e);
-      } else {
-        var item = sender as T;
-        TreeNode node = GetNodeByItem(item);
-        if(node != null)
-          node.Text = item.ToString();
-      }
-    }
-
-    private void item_ItemImageChanged(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(item_ItemImageChanged), sender, e);
-      } else {
-        var item = sender as T;
-        TreeNode node = GetNodeByItem(item);
-        if(node != null)
-          UpdateNodeItemImage(node);
-      }
-    }
-
-    private void treeView_DoubleClick(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(treeView_DoubleClick), sender, e);
-      } else {
-        if (treeView.SelectedNode != null) {
-          var item = treeView.SelectedNode.Tag as T;
-          if (item != null) {
-            IContentView view = MainFormManager.MainForm.ShowContent(item);
-            if (view != null) {
-              view.ReadOnly = ReadOnly;
-              view.Locked = Locked;
-            }
-          }
-        }
-      }
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        ClearNodes();
-        detailsViewHost.Content = null;
-      } else {
-        ClearNodes();
-        foreach (T itemTree in Content) {
-          AddChildNodes(itemTree, treeView.Nodes, false);
-        }
-        foreach (TreeNode node in treeView.Nodes) {
-          UpdateNodeItemImage(node);
-        }
-        detailsViewHost.Content = null;
-      }
-    }
-
-    private void ClearNodes() {
-      treeView.Nodes.Clear();
-    }
-
-    private TreeNode AddChildNodes(T item, TreeNodeCollection nodes, bool registerEvents) {
-      TreeNode node = CreateTreeViewNode(item);
-      nodes.Add(node);
-      RebuildImageList(node);
-      RegisterContentEvents(item, node); 
-      var childItems = item.GetChildItems();
-      foreach (T childItem in childItems) {
-        AddChildNodes(childItem, node.Nodes, registerEvents);
-      }
-      node.ExpandAll();
-      return node;
-    }
-
-    private void RemoveChildNodes(T 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 TreeNode GetNodeByItem(T 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, T 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;
-    }
-
-    private TreeNode CreateTreeViewNode(T item) {
-      var node = new TreeNode(item.ToString());
-      node.Tag = item;
-      return node;
-    }
-
-    private void UpdateNodeItemImage(TreeNode node) {
-      if (node == null) throw new ArgumentNullException();
-      var item = node.Tag as T;
-      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);
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      // Enable or disable controls based on whether the content is null or the view is set readonly
-    }
-
-    #region Event Handlers (child controls)
-    // Put event handlers of child controls here.
-    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      detailsViewHost.Content = (IContent)treeView.SelectedNode.Tag;
-    }
-    #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 T;
-      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: anches/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 6032)
+++ 	(revision )
@@ -1,125 +1,0 @@
-﻿namespace HeuristicLab.Clients.Hive.Views {
-  partial class ItemTreeView<T> {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      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.detailsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
-      this.detailsGroupBox.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // splitContainer
-      // 
-      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";
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.treeView);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
-      this.splitContainer.Size = new System.Drawing.Size(624, 463);
-      this.splitContainer.SplitterDistance = 200;
-      this.splitContainer.TabIndex = 0;
-      // 
-      // treeView
-      // 
-      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.treeView.HideSelection = false;
-      this.treeView.ImageIndex = 0;
-      this.treeView.ImageList = this.imageList;
-      this.treeView.Location = new System.Drawing.Point(0, 0);
-      this.treeView.Name = "treeView";
-      this.treeView.SelectedImageIndex = 0;
-      this.treeView.Size = new System.Drawing.Size(200, 463);
-      this.treeView.TabIndex = 0;
-      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
-      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
-      // 
-      // 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.detailsViewHost);
-      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";
-      // 
-      // detailsViewHost
-      // 
-      this.detailsViewHost.Caption = "View";
-      this.detailsViewHost.Content = null;
-      this.detailsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.detailsViewHost.Enabled = false;
-      this.detailsViewHost.Location = new System.Drawing.Point(3, 16);
-      this.detailsViewHost.Name = "detailsViewHost";
-      this.detailsViewHost.ReadOnly = false;
-      this.detailsViewHost.Size = new System.Drawing.Size(414, 444);
-      this.detailsViewHost.TabIndex = 0;
-      this.detailsViewHost.ViewsLabelVisible = true;
-      this.detailsViewHost.ViewType = null;
-      // 
-      // ItemTreeView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.Controls.Add(this.splitContainer);
-      this.Name = "ItemTreeView";
-      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);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.SplitContainer splitContainer;
-    private System.Windows.Forms.TreeView treeView;
-    private MainForm.WindowsForms.ViewHost detailsViewHost;
-    private System.Windows.Forms.ImageList imageList;
-    private System.Windows.Forms.GroupBox detailsGroupBox;
-  }
-}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.resx	(revision 6032)
+++ 	(revision )
@@ -1,123 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.cs	(revision 6033)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("HiveJob View")]
+  [Content(typeof(OptimizerHiveJob), true)]
+  public partial class OptimizerHiveJobView : HiveJobView {
+    public new OptimizerHiveJob Content {
+      get { return (OptimizerHiveJob)base.Content; }
+      set {
+        if (base.Content != value) {
+          base.Content = value;
+        }
+      }
+    }
+
+    public OptimizerHiveJobView() {
+      InitializeComponent();
+    }
+
+    protected override void Job_ItemChanged(object sender, EventArgs e) {
+      if (Content != null && Content.Job != null && Content.JobItem.Item != null) {
+        runCollectionViewHost.Content = Content.JobItem.Item.Runs;
+      } else {
+        runCollectionViewHost.Content = null;
+      }
+    }
+    #region Content Events
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+
+      this.restartButton.Enabled = Content != null && Content.Job.State == JobState.Paused;
+      this.pauseButton.Enabled = Content != null && Content.Job.State == JobState.Calculating;
+      this.stopButton.Enabled = Content != null && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
+    }
+    #endregion
+
+    #region Child Control Events
+    private void restartButton_Click(object sender, EventArgs e) {
+      Content.Restart();
+    }
+
+    private void pauseButton_Click(object sender, EventArgs e) {
+      Content.Pause();
+    }
+
+    private void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.designer.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.designer.cs	(revision 6033)
@@ -0,0 +1,164 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class OptimizerHiveJobView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptimizerHiveJobView));
+      this.restartButton = new System.Windows.Forms.Button();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.stateLogTabPage.SuspendLayout();
+      this.detailsTabPage.SuspendLayout();
+      this.optimizerGroupBox.SuspendLayout();
+      this.configurationGroupBox.SuspendLayout();
+      this.jobStatusGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // detailsTabPage
+      // 
+      this.detailsTabPage.Controls.Add(this.restartButton);
+      this.detailsTabPage.Controls.Add(this.pauseButton);
+      this.detailsTabPage.Controls.Add(this.stopButton);
+      this.detailsTabPage.Controls.SetChildIndex(this.jobIdTextBox, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.jobIdLabel, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.optimizerGroupBox, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.stopButton, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.pauseButton, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.restartButton, 0);
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.runsTabPage);
+      this.tabControl.Controls.SetChildIndex(this.runsTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.stateLogTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.detailsTabPage, 0);
+      // 
+      // showItemButton
+      // 
+      this.modifyItemButton.Text = "Modify Optimizer";
+      // 
+      // splitContainer1
+      // 
+      // 
+      // restartButton
+      // 
+      this.restartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.restartButton.Image = ((System.Drawing.Image)(resources.GetObject("restartButton.Image")));
+      this.restartButton.Location = new System.Drawing.Point(3, 348);
+      this.restartButton.Name = "restartButton";
+      this.restartButton.Size = new System.Drawing.Size(24, 24);
+      this.restartButton.TabIndex = 34;
+      this.restartButton.UseVisualStyleBackColor = true;
+      this.restartButton.Click += new System.EventHandler(this.restartButton_Click);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Enabled = false;
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(33, 348);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 35;
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(63, 348);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 36;
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionViewHost);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Size = new System.Drawing.Size(563, 375);
+      this.runsTabPage.TabIndex = 6;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runCollectionViewHost
+      // 
+      this.runCollectionViewHost.Caption = "View";
+      this.runCollectionViewHost.Content = null;
+      this.runCollectionViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.runCollectionViewHost.Enabled = false;
+      this.runCollectionViewHost.Location = new System.Drawing.Point(0, 0);
+      this.runCollectionViewHost.Name = "runCollectionViewHost";
+      this.runCollectionViewHost.ReadOnly = false;
+      this.runCollectionViewHost.Size = new System.Drawing.Size(563, 375);
+      this.runCollectionViewHost.TabIndex = 1;
+      this.runCollectionViewHost.ViewsLabelVisible = true;
+      this.runCollectionViewHost.ViewType = null;
+      // 
+      // OptimizerHiveJobView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "OptimizerHiveJobView";
+      this.stateLogTabPage.ResumeLayout(false);
+      this.detailsTabPage.ResumeLayout(false);
+      this.detailsTabPage.PerformLayout();
+      this.optimizerGroupBox.ResumeLayout(false);
+      this.optimizerGroupBox.PerformLayout();
+      this.configurationGroupBox.ResumeLayout(false);
+      this.configurationGroupBox.PerformLayout();
+      this.jobStatusGroupBox.ResumeLayout(false);
+      this.jobStatusGroupBox.PerformLayout();
+      this.tabControl.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button restartButton;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.TabPage runsTabPage;
+    private MainForm.WindowsForms.ViewHost runCollectionViewHost;
+
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.resx	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/OptimizerHiveJobView.resx	(revision 6033)
@@ -0,0 +1,154 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
+        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
+        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
+        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
+        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
+        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
+        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
+        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="restartButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
+        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
+        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
+        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
+</value>
+  </data>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.Designer.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.Designer.cs	(revision 6033)
@@ -0,0 +1,413 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
+  partial class RefreshableHiveExperimentView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableHiveExperimentView));
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.logView = new HeuristicLab.Core.Views.LogView();
+      this.startButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.resourceIdsLabel = new System.Windows.Forms.Label();
+      this.resourceNamesTextBox = new System.Windows.Forms.TextBox();
+      this.useLocalPluginsCheckBox = new System.Windows.Forms.CheckBox();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.refreshAutomaticallyCheckBox = new System.Windows.Forms.CheckBox();
+      this.infoGroupBox = new System.Windows.Forms.GroupBox();
+      this.finishedTextBox = new System.Windows.Forms.TextBox();
+      this.calculatingTextBox = new System.Windows.Forms.TextBox();
+      this.jobsTextBox = new System.Windows.Forms.TextBox();
+      this.finishedLabel = new System.Windows.Forms.Label();
+      this.calculatingLabel = new System.Windows.Forms.Label();
+      this.jobsLabel = new System.Windows.Forms.Label();
+      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ExperimentManager.HiveJobItemTreeView();
+      this.tabControl.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
+      this.logTabPage.SuspendLayout();
+      this.infoGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.jobsTabPage);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 78);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(821, 520);
+      this.tabControl.TabIndex = 4;
+      // 
+      // 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(813, 494);
+      this.jobsTabPage.TabIndex = 5;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Controls.Add(this.logView);
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Size = new System.Drawing.Size(813, 494);
+      this.logTabPage.TabIndex = 3;
+      this.logTabPage.Text = "Log";
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logView
+      // 
+      this.logView.Caption = "Log View";
+      this.logView.Content = null;
+      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(813, 494);
+      this.logView.TabIndex = 0;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Image = ((System.Drawing.Image)(resources.GetObject("startButton.Image")));
+      this.startButton.Location = new System.Drawing.Point(0, 604);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(60, 604);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Enabled = false;
+      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
+      this.resetButton.Location = new System.Drawing.Point(90, 604);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(24, 24);
+      this.resetButton.TabIndex = 8;
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(595, 611);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 9;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(684, 608);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+      this.executionTimeTextBox.TabIndex = 10;
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Enabled = false;
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(30, 604);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 6;
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // resourceIdsLabel
+      // 
+      this.resourceIdsLabel.AutoSize = true;
+      this.resourceIdsLabel.Location = new System.Drawing.Point(4, 56);
+      this.resourceIdsLabel.Name = "resourceIdsLabel";
+      this.resourceIdsLabel.Size = new System.Drawing.Size(70, 13);
+      this.resourceIdsLabel.TabIndex = 12;
+      this.resourceIdsLabel.Text = "ResourceIds:";
+      // 
+      // resourceNamesTextBox
+      // 
+      this.resourceNamesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.resourceNamesTextBox.Location = new System.Drawing.Point(73, 53);
+      this.resourceNamesTextBox.Name = "resourceNamesTextBox";
+      this.resourceNamesTextBox.Size = new System.Drawing.Size(494, 20);
+      this.resourceNamesTextBox.TabIndex = 14;
+      this.resourceNamesTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
+      // 
+      // useLocalPluginsCheckBox
+      // 
+      this.useLocalPluginsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.useLocalPluginsCheckBox.AutoSize = true;
+      this.useLocalPluginsCheckBox.Location = new System.Drawing.Point(573, 56);
+      this.useLocalPluginsCheckBox.Name = "useLocalPluginsCheckBox";
+      this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(105, 17);
+      this.useLocalPluginsCheckBox.TabIndex = 19;
+      this.useLocalPluginsCheckBox.Text = "UseLocalPlugins";
+      this.useLocalPluginsCheckBox.UseVisualStyleBackColor = true;
+      this.useLocalPluginsCheckBox.CheckedChanged += new System.EventHandler(this.useLocalPluginsCheckBox_CheckedChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(1, 27);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 20;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(73, 27);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(605, 20);
+      this.nameTextBox.TabIndex = 21;
+      this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Location = new System.Drawing.Point(3, 0);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 22;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh Data");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // refreshAutomaticallyCheckBox
+      // 
+      this.refreshAutomaticallyCheckBox.AutoSize = true;
+      this.refreshAutomaticallyCheckBox.Location = new System.Drawing.Point(30, 5);
+      this.refreshAutomaticallyCheckBox.Name = "refreshAutomaticallyCheckBox";
+      this.refreshAutomaticallyCheckBox.Size = new System.Drawing.Size(128, 17);
+      this.refreshAutomaticallyCheckBox.TabIndex = 24;
+      this.refreshAutomaticallyCheckBox.Text = "&Refresh Automatically";
+      this.refreshAutomaticallyCheckBox.UseVisualStyleBackColor = true;
+      this.refreshAutomaticallyCheckBox.CheckedChanged += new System.EventHandler(this.refreshAutomaticallyCheckBox_CheckedChanged);
+      // 
+      // infoGroupBox
+      // 
+      this.infoGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoGroupBox.Controls.Add(this.finishedTextBox);
+      this.infoGroupBox.Controls.Add(this.calculatingTextBox);
+      this.infoGroupBox.Controls.Add(this.jobsTextBox);
+      this.infoGroupBox.Controls.Add(this.finishedLabel);
+      this.infoGroupBox.Controls.Add(this.calculatingLabel);
+      this.infoGroupBox.Controls.Add(this.jobsLabel);
+      this.infoGroupBox.Location = new System.Drawing.Point(684, 5);
+      this.infoGroupBox.Name = "infoGroupBox";
+      this.infoGroupBox.Size = new System.Drawing.Size(133, 89);
+      this.infoGroupBox.TabIndex = 25;
+      this.infoGroupBox.TabStop = false;
+      this.infoGroupBox.Text = "Info";
+      // 
+      // finishedTextBox
+      // 
+      this.finishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.finishedTextBox.Location = new System.Drawing.Point(74, 64);
+      this.finishedTextBox.Name = "finishedTextBox";
+      this.finishedTextBox.Size = new System.Drawing.Size(53, 20);
+      this.finishedTextBox.TabIndex = 5;
+      // 
+      // calculatingTextBox
+      // 
+      this.calculatingTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.calculatingTextBox.Location = new System.Drawing.Point(74, 40);
+      this.calculatingTextBox.Name = "calculatingTextBox";
+      this.calculatingTextBox.Size = new System.Drawing.Size(53, 20);
+      this.calculatingTextBox.TabIndex = 4;
+      // 
+      // jobsTextBox
+      // 
+      this.jobsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobsTextBox.Location = new System.Drawing.Point(74, 16);
+      this.jobsTextBox.Name = "jobsTextBox";
+      this.jobsTextBox.Size = new System.Drawing.Size(53, 20);
+      this.jobsTextBox.TabIndex = 3;
+      // 
+      // finishedLabel
+      // 
+      this.finishedLabel.AutoSize = true;
+      this.finishedLabel.Location = new System.Drawing.Point(6, 67);
+      this.finishedLabel.Name = "finishedLabel";
+      this.finishedLabel.Size = new System.Drawing.Size(49, 13);
+      this.finishedLabel.TabIndex = 2;
+      this.finishedLabel.Text = "Finished:";
+      // 
+      // calculatingLabel
+      // 
+      this.calculatingLabel.AutoSize = true;
+      this.calculatingLabel.Location = new System.Drawing.Point(6, 43);
+      this.calculatingLabel.Name = "calculatingLabel";
+      this.calculatingLabel.Size = new System.Drawing.Size(62, 13);
+      this.calculatingLabel.TabIndex = 1;
+      this.calculatingLabel.Text = "Calculating:";
+      // 
+      // jobsLabel
+      // 
+      this.jobsLabel.AutoSize = true;
+      this.jobsLabel.Location = new System.Drawing.Point(6, 19);
+      this.jobsLabel.Name = "jobsLabel";
+      this.jobsLabel.Size = new System.Drawing.Size(32, 13);
+      this.jobsLabel.TabIndex = 0;
+      this.jobsLabel.Text = "Jobs:";
+      // 
+      // jobsTreeView
+      // 
+      this.jobsTreeView.AllowDrop = true;
+      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(808, 488);
+      this.jobsTreeView.TabIndex = 0;
+      this.jobsTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragDrop);
+      this.jobsTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragEnter);
+      this.jobsTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragOver);
+      // 
+      // RefreshableHiveExperimentView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.infoGroupBox);
+      this.Controls.Add(this.refreshAutomaticallyCheckBox);
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.resourceNamesTextBox);
+      this.Controls.Add(this.pauseButton);
+      this.Controls.Add(this.resourceIdsLabel);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.useLocalPluginsCheckBox);
+      this.Controls.Add(this.resetButton);
+      this.Name = "RefreshableHiveExperimentView";
+      this.Size = new System.Drawing.Size(821, 628);
+      this.tabControl.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
+      this.logTabPage.ResumeLayout(false);
+      this.infoGroupBox.ResumeLayout(false);
+      this.infoGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button resetButton;
+    private System.Windows.Forms.Label executionTimeLabel;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Label resourceIdsLabel;
+    private System.Windows.Forms.TextBox resourceNamesTextBox;
+    private System.Windows.Forms.TabPage logTabPage;
+    private Core.Views.LogView logView;
+    private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
+    private System.Windows.Forms.TabPage jobsTabPage;
+    private HiveJobItemTreeView jobsTreeView;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.CheckBox refreshAutomaticallyCheckBox;
+    private System.Windows.Forms.GroupBox infoGroupBox;
+    private System.Windows.Forms.TextBox finishedTextBox;
+    private System.Windows.Forms.TextBox calculatingTextBox;
+    private System.Windows.Forms.TextBox jobsTextBox;
+    private System.Windows.Forms.Label finishedLabel;
+    private System.Windows.Forms.Label calculatingLabel;
+    private System.Windows.Forms.Label jobsLabel;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs	(revision 6033)
@@ -0,0 +1,366 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("Hive Experiment View")]
+  [Content(typeof(RefreshableHiveExperiment), true)]
+  public sealed partial class RefreshableHiveExperimentView : ItemView {
+    private ProgressView progressView;
+
+    public new RefreshableHiveExperiment Content {
+      get { return (RefreshableHiveExperiment)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public RefreshableHiveExperimentView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
+      Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.HiveExperimentChanged -= new EventHandler(Content_HiveExperimentChanged);      
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
+      Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.HiveExperimentChanged += new EventHandler(Content_HiveExperimentChanged);
+    }
+
+    private void RegisterHiveExperimentEvents() {
+      Content.HiveExperiment.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.HiveExperiment.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.HiveExperiment.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
+      Content.HiveExperiment.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
+    }
+    private void DeregisterHiveExperimentEvents() {
+      Content.HiveExperiment.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+      Content.HiveExperiment.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      Content.HiveExperiment.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
+      Content.HiveExperiment.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
+    }
+
+    private void RegisterHiveJobEvents() {
+      Content.HiveExperiment.HiveJobs.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.CollectionReset += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+    private void DeregisterHiveJobEvents() {
+      Content.HiveExperiment.HiveJobs.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.CollectionReset -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        nameTextBox.Text = string.Empty;
+        executionTimeTextBox.Text = string.Empty;
+        resourceNamesTextBox.Text = string.Empty;
+        useLocalPluginsCheckBox.Checked = false;
+        logView.Content = null;
+        //includeJobsCheckBox.Checked = false;
+        refreshAutomaticallyCheckBox.Checked = false;
+        jobsTextBox.Text = "0";
+        calculatingTextBox.Text = "0";
+        finishedTextBox.Text = "0";
+      } else {
+        nameTextBox.Text = Content.HiveExperiment.Name;
+        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+        resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
+        useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
+        //includeJobsCheckBox.Checked = Content.IncludeJobs;
+        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
+        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
+        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
+        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
+      }
+      Content_HiveExperimentChanged(this, EventArgs.Empty);
+      Content_HiveJobChanged(this, EventArgs.Empty);
+      Content_IsProgressingChanged(this, EventArgs.Empty);
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      executionTimeTextBox.Enabled = Content != null;
+      jobsTextBox.ReadOnly = true;
+      calculatingTextBox.ReadOnly = true;
+      finishedTextBox.ReadOnly = true;
+
+      if (Content != null) {
+        bool alreadyUploaded = Content.Id != Guid.Empty;
+        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
+
+        this.nameTextBox.ReadOnly = Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.resourceNamesTextBox.ReadOnly = Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.jobsTreeView.ReadOnly = Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.useLocalPluginsCheckBox.Enabled = !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
+        this.refreshAutomaticallyCheckBox.Enabled = alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        this.refreshButton.Enabled = alreadyUploaded;
+
+        this.Locked = Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+      }
+      SetEnabledStateOfExecutableButtons();
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      if (Content != null) {
+        if (Content.RefreshAutomatically)
+          Content.StopResultPolling();
+      }
+      base.OnClosed(e);
+    }
+
+    #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)
+        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+      else
+        SetEnabledStateOfControls();
+    }
+    private void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        Locked = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Started(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Started), sender, e);
+      else {
+        nameTextBox.Enabled = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Paused(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Paused), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Stopped(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Stopped), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        Locked = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      else
+        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+    }
+    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
+      else {
+        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_HiveJobChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
+      else {
+        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
+          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
+          RegisterHiveJobEvents();
+        } else {
+          jobsTreeView.Content = null;
+        }
+        SetEnabledStateOfControls();
+      }
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
+      else {
+        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
+        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
+        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
+      }
+    }
+
+    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
+      if (Content.HiveExperiment != null) {
+        RegisterHiveExperimentEvents();
+        Content_IsProgressingChanged(sender, e);
+      }
+    }
+    #endregion
+
+    #region Control events
+    private void startButton_Click(object sender, EventArgs e) {
+      ExperimentManagerClient.StartExperiment(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex)), Content);
+    }
+    private void pauseButton_Click(object sender, EventArgs e) {
+      ExperimentManagerClient.PauseExperiment(Content.HiveExperiment);
+    }
+    private void stopButton_Click(object sender, EventArgs e) {
+      ExperimentManagerClient.StopExperiment(Content.HiveExperiment);
+    }
+    private void resetButton_Click(object sender, EventArgs e) { }
+
+    private void nameTextBox_Validated(object sender, EventArgs e) {
+      if (Content.HiveExperiment.Name != nameTextBox.Text)
+        Content.HiveExperiment.Name = nameTextBox.Text;
+    }
+
+    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
+      if (Content.HiveExperiment.ResourceNames != resourceNamesTextBox.Text)
+        Content.HiveExperiment.ResourceNames = resourceNamesTextBox.Text;
+    }
+
+    private void includeJobsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      //if (Content != null) Content.IncludeJobs = includeJobsCheckBox.Checked;
+    }
+
+    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
+      }
+    }
+
+    private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) Content.HiveExperiment.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      var invoker = new Action<HiveExperiment>(ExperimentManagerClient.LoadExperiment);
+      invoker.BeginInvoke(Content.HiveExperiment, (ar) => {
+        try {
+          invoker.EndInvoke(ar);
+        }
+        catch (Exception ex) {
+          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+        }
+      }, null);
+    }
+    #endregion
+
+    #region Helpers
+    private void SetEnabledStateOfExecutableButtons() {
+      if (Content == null) {
+        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
+      } else {
+        startButton.Enabled = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.Count > 0 && Content.HiveExperiment.ExecutionState == ExecutionState.Prepared;
+        pauseButton.Enabled = Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        stopButton.Enabled = Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        resetButton.Enabled = false;
+      }
+    }
+    #endregion
+
+    #region Progress reporting
+    private void Content_IsProgressingChanged(object sender, EventArgs e) {
+      if (this.InvokeRequired) {
+        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
+      } else {
+        if (Content != null && Content.HiveExperiment.IsProgressing) {
+          SetProgressView();
+        } else {
+          FinishProgressView();
+        }
+      }
+    }
+
+    private void SetProgressView() {
+      if (progressView == null) {
+        progressView = new ProgressView(this, Content.HiveExperiment.Progress);
+      }
+      progressView.Progress = Content.HiveExperiment.Progress;
+    }
+
+    private void FinishProgressView() {
+      if (progressView != null) {
+        progressView.Finish();
+        progressView = null;
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    #region Drag & Drop
+    private void jobsTreeView_DragOver(object sender, DragEventArgs e) {
+      jobsTreeView_DragEnter(sender, e);
+    }
+
+    private void jobsTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var obj = e.Data.GetData(Constants.DragDropDataFormat);
+      if (obj is IOptimizer) {
+        e.Effect = DragDropEffects.Copy;
+      }
+    }
+
+    private void jobsTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        var obj = e.Data.GetData(Constants.DragDropDataFormat);
+
+        var optimizer = obj as IOptimizer;
+        if (optimizer != null) {
+          Content.HiveExperiment.HiveJobs.Add(new OptimizerHiveJob(optimizer));
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.resx	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.resx	(revision 6033)
@@ -0,0 +1,234 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="startButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
+        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
+        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
+        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
+        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
+        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
+        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
+        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
+        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
+        MP3x/9JZj4EWI7yN4oKuDb/+bzr57f/KQ1/+L9jz6f/lBz//965997956RuwIXnTX/zXDV2F2wCQrSsO
+        fvk/b9en/7ee/AIp/N+w5M3/0rkv/+dMff4/qffZf1W/RbgNADl5zo5P/x++/AHWDAIls1/+z5ry/H9C
+        79P/Ya2P/8u5zcJtAMi/Nx99hmtGZhy7/Oa/V+3D/2J2k3AbAPJn87I3/09deQnXG9355H9g0yMw36H0
+        /n9+s27cBoBCuhxoSM605/93HrkL1hTQ8Oi/W9UDMNss7+5/ToNW3AaAoikb6N9EoH/D2x7/n7Puwn/X
+        ivv/bYrvgQ3Qy7j1n1WnEbcBoDiO63n6P7Tl0X+fuof/ncrv/7cuvPffJPsO2AD1JCIMsEza9h+EjWM2
+        /NcKXv5fwWMuOOB4TTr/s+k24XcB0BKSkzbJGtAtodgAAJMl+qgyDSjjAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
+        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
+        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="refreshButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>25</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/StateLogView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/StateLogView.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/StateLogView.cs	(revision 6033)
@@ -27,5 +27,5 @@
 namespace HeuristicLab.Clients.Hive.Views {
   [View("StateLog View")]
-  [Content(typeof(StateLog), IsDefaultView = false)]
+  [Content(typeof(StateLog), IsDefaultView = true)]
   public sealed partial class StateLogView : ItemView {
     public new StateLog Content {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/DeleteJobTreeNodeAction.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/DeleteJobTreeNodeAction.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/DeleteJobTreeNodeAction.cs	(revision 6033)
@@ -0,0 +1,33 @@
+﻿
+using System.Drawing;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+namespace HeuristicLab.Clients.Hive.Views.ExperimentManager.TreeView {
+  public class DeleteJobTreeNodeAction : IItemTreeNodeAction<HiveJob> {
+    private ItemCollection<HiveJob> hiveJobs;
+    
+    public DeleteJobTreeNodeAction(ItemCollection<HiveJob> hiveJobs) {
+      this.hiveJobs = hiveJobs;
+    }
+
+    public string Name {
+      get { return "Delete Job"; }
+    }
+
+    public Image Image {
+      get { return null; }
+    }
+
+    public void Execute(HiveJob item, HiveJob parentItem) {
+      if (parentItem == null) {
+        hiveJobs.Remove(item);
+      } else {
+        var experiment = parentItem.JobItem.Item as Experiment;
+        if (experiment != null) {
+          experiment.Optimizers.Remove(((OptimizerJob)item.JobItem).Item);
+        }
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.Designer.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.Designer.cs	(revision 6033)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
+  partial class HiveJobItemTreeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/HiveJobItemTreeView.cs	(revision 6033)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Clients.Hive.Views.ExperimentManager.TreeView;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
+  [View("HiveJob ItemTreeView")]
+  //[Content(typeof(ItemCollection<HiveJob>), IsDefaultView = false)]
+  [Content(typeof(ItemCollection<HiveJob>), IsDefaultView = false)]
+  public partial class HiveJobItemTreeView : ItemTreeView<HiveJob> {
+    public new ItemCollection<HiveJob> Content {
+      get { return (ItemCollection<HiveJob>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HiveJobItemTreeView() {
+      InitializeComponent();
+    }
+
+    #region Register Content Events
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers on the Content here
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers on the Content here
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Put code here when content is null
+      } else {
+        // TODO: Put code here when content has been changed and is not null
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Put code here to enable or disable controls based on whether the Content is/not null or the view is ReadOnly
+    }
+
+    #region Event Handlers
+    // TODO: Put event handlers here
+    #endregion
+
+    #region Child Control Events
+    protected override void addButton_Click(object sender, EventArgs e) {
+      IOptimizer optimizer = CreateItem<IOptimizer>();
+      if (optimizer != null) {
+        if (treeView.SelectedNode == null) {
+          Content.Add(new OptimizerHiveJob(optimizer));
+        } else {
+          var experiment = ((HiveJob)treeView.SelectedNode.Tag).JobItem.Item as Experiment;
+          if (experiment != null) {
+            experiment.Optimizers.Add(optimizer);
+          }
+        }
+      }
+    }
+
+    protected override void removeButton_Click(object sender, EventArgs e) {
+      if (treeView.SelectedNode != null) {
+        var selectedItem = (HiveJob)treeView.SelectedNode.Tag;
+        var parentItem = GetParentItem(selectedItem);
+        if (parentItem == null) {
+          Content.Remove((HiveJob)treeView.SelectedNode.Tag);
+        } else {
+          var experiment = parentItem.JobItem.Item as Experiment;
+          if (experiment != null) {
+            experiment.Optimizers.Remove(((OptimizerJob)selectedItem.JobItem).Item);
+          }
+        }        
+      }
+    }
+    #endregion
+
+    protected override ICollection<IItemTreeNodeAction<HiveJob>> GetTreeNodeItemActions(HiveJob selectedItem) {
+      var actions = base.GetTreeNodeItemActions(selectedItem);
+      if (selectedItem != null) {
+        if (selectedItem.JobItem.Item is Experiment) {
+
+        }
+        actions.Add(new DeleteJobTreeNodeAction(Content));
+      }
+      
+      return actions;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.cs	(revision 6033)
@@ -0,0 +1,440 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("ItemTree View")]
+  [Content(typeof(ItemCollection<>), IsDefaultView = false)]
+  public partial class ItemTreeView<T> : ItemView where T : class, IItemTree<T> {
+    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;
+      }
+    }
+
+    public ItemTreeView() {
+      InitializeComponent();
+    }
+
+    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((T)node.Tag, node);
+      }
+      base.DeregisterContentEvents();
+    }
+
+    protected virtual void DeregisterContentEvents(T item, TreeNode node) {
+      item.ItemsAdded -= new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsAdded);
+      item.ItemsRemoved -= new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsRemoved);
+      item.CollectionReset -= new CollectionItemsChangedEventHandler<IItemTree<T>>(item_CollectionReset);
+      item.ToStringChanged -= new EventHandler(item_ToStringChanged);
+      item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
+      foreach (TreeNode childNode in node.Nodes) {
+        DeregisterContentEvents((T)childNode.Tag, childNode);
+      }
+    }
+
+    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((T)node.Tag, node);
+      }
+    }
+
+    protected virtual void RegisterContentEvents(T item, TreeNode node) {
+      item.ItemsAdded += new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsAdded);
+      item.ItemsRemoved += new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsRemoved);
+      item.CollectionReset += new CollectionItemsChangedEventHandler<IItemTree<T>>(item_CollectionReset);
+      item.ToStringChanged += new EventHandler(item_ToStringChanged);
+      item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
+      foreach (TreeNode childNode in node.Nodes) {
+        RegisterContentEvents((T)childNode.Tag, childNode);
+      }
+    }
+
+    #region Event Handlers (Content)
+    protected virtual 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);
+        }
+      }
+    }
+    protected virtual 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();
+      }
+    }
+    protected virtual 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);
+        }
+      }
+    }
+
+    protected virtual void item_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemTree<T>> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsAdded), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as T);
+        if (node != null) {
+          foreach (T item in e.Items) {
+            AddChildNodes(item, node.Nodes, true);
+            node.ExpandAll();
+            UpdateNodeItemImage(node);
+          }
+        }
+      }
+    }
+
+    protected virtual void item_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemTree<T>> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree<T>>(item_ItemsRemoved), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as T);
+        if (node != null) {
+          foreach (T item in e.Items) {
+            RemoveChildNodes(item, node.Nodes);
+          }
+          RebuildImageList();
+        }
+      }
+    }
+
+    protected virtual void item_CollectionReset(object sender, CollectionItemsChangedEventArgs<IItemTree<T>> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree<T>>(item_CollectionReset), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as T);
+        if (node != null) {
+          foreach (T item in e.OldItems) {
+            RemoveChildNodes(item, node.Nodes);
+          }
+          RebuildImageList();
+          foreach (T item in e.Items) {
+            AddChildNodes(item, node.Nodes, true);
+          }
+        }
+      }
+    }
+
+    protected virtual void item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(item_ToStringChanged), sender, e);
+      } else {
+        var item = sender as T;
+        TreeNode node = GetNodeByItem(item);
+        if (node != null)
+          node.Text = item.ToString();
+      }
+    }
+
+    protected virtual void item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(item_ItemImageChanged), sender, e);
+      } else {
+        var item = sender as T;
+        TreeNode node = GetNodeByItem(item);
+        if (node != null)
+          UpdateNodeItemImage(node);
+      }
+    }
+
+    protected virtual void treeView_DoubleClick(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(treeView_DoubleClick), sender, e);
+      } else {
+        if (treeView.SelectedNode != null) {
+          var item = treeView.SelectedNode.Tag as T;
+          if (item != null) {
+            IContentView view = MainFormManager.MainForm.ShowContent(item);
+            if (view != null) {
+              view.ReadOnly = ReadOnly;
+              view.Locked = Locked;
+            }
+          }
+        }
+      }
+    }
+
+    protected virtual void treeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button == System.Windows.Forms.MouseButtons.Left) {
+        // enables deselection of treeNodes
+        if (treeView.SelectedNode == null)
+          return;
+        treeView.SelectedNode = null;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void treeView_MouseClick(object sender, MouseEventArgs e) {
+
+    }
+    private void treeView_Click(object sender, EventArgs e) {
+
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ClearNodes();
+        detailsViewHost.Content = null;
+      } else {
+        ClearNodes();
+        foreach (T itemTree in Content) {
+          AddChildNodes(itemTree, treeView.Nodes, false);
+        }
+        foreach (TreeNode node in treeView.Nodes) {
+          UpdateNodeItemImage(node);
+        }
+        detailsViewHost.Content = null;
+      }
+    }
+
+    protected virtual void ClearNodes() {
+      treeView.Nodes.Clear();
+    }
+
+    protected virtual TreeNode AddChildNodes(T item, TreeNodeCollection nodes, bool registerEvents) {
+      TreeNode node = CreateTreeViewNode(item);
+      nodes.Add(node);
+      RebuildImageList(node);
+      RegisterContentEvents(item, node);
+      var childItems = item.GetChildItems();
+      foreach (T childItem in childItems) {
+        AddChildNodes(childItem, node.Nodes, registerEvents);
+      }
+      node.ExpandAll();
+      return node;
+    }
+
+    protected virtual void RemoveChildNodes(T item, TreeNodeCollection treeNodeCollection) {
+      int idx = -1;
+      for (int i = 0; i < treeNodeCollection.Count; i++) {
+        if (treeNodeCollection[i].Tag == item) {
+          idx = i; break;
+        }
+      }
+      if (idx > 0) {
+        DeregisterContentEvents(item, treeNodeCollection[idx]);
+        treeNodeCollection.RemoveAt(idx);
+      }
+    }
+
+    protected virtual TreeNode GetNodeByItem(T item) {
+      TreeNode found = null;
+      foreach (TreeNode node in treeView.Nodes) {
+        found = GetNodeByItem(node, item);
+        if (found != null)
+          return found;
+      }
+      return null;
+    }
+
+    protected virtual TreeNode GetNodeByItem(TreeNode node, T 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;
+    }
+
+    protected virtual TreeNode CreateTreeViewNode(T item) {
+      var node = new TreeNode(item.ToString());
+      node.Tag = item;
+      return node;
+    }
+
+    protected virtual void UpdateNodeItemImage(TreeNode node) {
+      if (node == null) throw new ArgumentNullException();
+      var item = node.Tag as T;
+      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);
+      }
+    }
+
+    protected virtual T GetParentItem(T selectedItem) {
+      var node = GetNodeByItem(selectedItem);
+      if (node == null || node.Parent == null)
+        return null;
+      else
+        return (T)node.Parent.Tag;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      addButton.Enabled = !this.ReadOnly;
+      removeButton.Enabled = !this.ReadOnly && treeView.SelectedNode != null;
+    }
+
+    #region Event Handlers (child controls)
+    // Put event handlers of child controls here.
+    protected virtual void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      detailsViewHost.Content = (IContent)treeView.SelectedNode.Tag;
+      SetEnabledStateOfControls();
+    }
+
+    protected virtual void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      if (treeView.SelectedNode != null) {
+        T selectedItem = treeView.SelectedNode.Tag as T;
+        T parentItem = GetParentItem(selectedItem);
+        var actions = GetTreeNodeItemActions(selectedItem);
+        contextMenuStrip.Items.Clear();
+        foreach (var action in actions) {
+          contextMenuStrip.Items.Add(new DelegateMenuItem<T>(action.Name, action.Image, new Action<T, T>(action.Execute), selectedItem, parentItem));
+        }
+      }
+    }
+
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      T item = CreateItem<T>();
+      if (item != null)
+        Content.Add(item);
+    }
+
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (treeView.SelectedNode != null) {
+
+      }
+    }
+
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = treeView.SelectedNode != null;
+        detailsViewHost.Content = treeView.SelectedNode != null ? (T)treeView.SelectedNode.Tag : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        detailsViewHost.Content = null;
+      }
+    }
+    #endregion
+
+    protected virtual void RebuildImageList() {
+      treeView.ImageList.Images.Clear();
+      foreach (TreeNode node in treeView.Nodes) {
+        RebuildImageList(node);
+      }
+    }
+
+    protected virtual void RebuildImageList(TreeNode node) {
+      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;
+      node.SelectedImageIndex = node.ImageIndex;
+      foreach (TreeNode childNode in node.Nodes) {
+        RebuildImageList(childNode);
+      }
+    }
+
+    protected virtual ICollection<IItemTreeNodeAction<T>> GetTreeNodeItemActions(T selectedItem) {
+      return selectedItem.Actions;
+    }
+
+    protected virtual X CreateItem<X>() where X : class {
+      var typeSelectorDialog = new TypeSelectorDialog();
+      typeSelectorDialog.Caption = "Select Item";
+      typeSelectorDialog.TypeSelector.Caption = "Available Items";
+      typeSelectorDialog.TypeSelector.Configure(typeof(X), false, true);
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (X)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+
+
+  }
+
+  public class DelegateMenuItem<T> : ToolStripMenuItem {
+    private Action<T, T> actionDelegate;
+    private T node;
+    private T parentNode;
+
+    public DelegateMenuItem(string name, Image image, Action<T, T> actionDelegate, T node, T parentNode) {
+      this.Name = name;
+      this.Text = name;
+      this.actionDelegate = actionDelegate;
+      this.node = node;
+      this.parentNode = parentNode;
+      this.Image = image;
+    }
+
+    protected override void OnClick(EventArgs e) {
+      base.OnClick(e);
+      actionDelegate.Invoke(node, parentNode);
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.designer.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.designer.cs	(revision 6033)
@@ -0,0 +1,205 @@
+﻿using HeuristicLab.Common.Resources;
+namespace HeuristicLab.Clients.Hive.Views {
+  partial class ItemTreeView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ItemTreeView<T>));
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.asfasdfToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.gfgffToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.detailsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      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";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1.Controls.Add(this.treeView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(624, 463);
+      this.splitContainer.SplitterDistance = 200;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(63, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 5;
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(33, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 4;
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 1;
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // treeView
+      // 
+      this.treeView.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.treeView.ContextMenuStrip = this.contextMenuStrip;
+      this.treeView.HideSelection = false;
+      this.treeView.ImageIndex = 0;
+      this.treeView.ImageList = this.imageList;
+      this.treeView.Location = new System.Drawing.Point(0, 33);
+      this.treeView.Name = "treeView";
+      this.treeView.SelectedImageIndex = 0;
+      this.treeView.Size = new System.Drawing.Size(200, 430);
+      this.treeView.TabIndex = 0;
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      this.treeView.Click += new System.EventHandler(this.treeView_Click);
+      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.treeView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseClick);
+      this.treeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.asfasdfToolStripMenuItem,
+            this.gfgffToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(153, 70);
+      this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
+      // 
+      // asfasdfToolStripMenuItem
+      // 
+      this.asfasdfToolStripMenuItem.Name = "asfasdfToolStripMenuItem";
+      this.asfasdfToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.asfasdfToolStripMenuItem.Text = "asfasdf";
+      // 
+      // gfgffToolStripMenuItem
+      // 
+      this.gfgffToolStripMenuItem.Name = "gfgffToolStripMenuItem";
+      this.gfgffToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.gfgffToolStripMenuItem.Text = "gfgff";
+      // 
+      // 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.detailsViewHost);
+      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";
+      // 
+      // detailsViewHost
+      // 
+      this.detailsViewHost.Caption = "View";
+      this.detailsViewHost.Content = null;
+      this.detailsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsViewHost.Enabled = false;
+      this.detailsViewHost.Location = new System.Drawing.Point(3, 16);
+      this.detailsViewHost.Name = "detailsViewHost";
+      this.detailsViewHost.ReadOnly = false;
+      this.detailsViewHost.Size = new System.Drawing.Size(414, 444);
+      this.detailsViewHost.TabIndex = 0;
+      this.detailsViewHost.ViewsLabelVisible = true;
+      this.detailsViewHost.ViewType = null;
+      // 
+      // ItemTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ItemTreeView";
+      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.contextMenuStrip.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.TreeView treeView;
+    private MainForm.WindowsForms.ViewHost detailsViewHost;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem asfasdfToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem gfgffToolStripMenuItem;
+    protected System.Windows.Forms.CheckBox showDetailsCheckBox;
+    protected System.Windows.Forms.Button removeButton;
+    protected System.Windows.Forms.Button addButton;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.resx	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/ItemTreeView.resx	(revision 6033)
@@ -0,0 +1,302 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="showDetailsCheckBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        9ORtbyqWAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="removeButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        w6/9DUORY3pvwx7IAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="addButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        ugHE5lCKcyMAN07j92U5+iMAAAAASUVORK5CYII=
+</value>
+  </data>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>120, 17</value>
+  </metadata>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/NewExperimentTreeNodeAction.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/NewExperimentTreeNodeAction.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/TreeView/NewExperimentTreeNodeAction.cs	(revision 6033)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Clients.Hive {
+  public class NewExperimentTreeNodeAction : IItemTreeNodeAction<HiveJob> {
+    private ItemCollection<HiveJob> hiveJobs;
+
+    public NewExperimentTreeNodeAction(ItemCollection<HiveJob> hiveJobs) {
+      this.hiveJobs = hiveJobs;
+    }
+
+    public string Name { 
+      get { return "New Experiment..."; } 
+    }
+
+    public Image Image {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.NewDocument; }
+    }
+
+    public void Execute(HiveJob item, HiveJob parentItem) {
+      if (item != null) {
+        var experiment = item.JobItem.Item as Experiment;
+        experiment.Optimizers.Add(new Experiment());
+      } else {
+        hiveJobs.Add(new OptimizerHiveJob(new Experiment()));
+      }
+    }
+  }
+}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.cs	(revision 6032)
+++ 	(revision )
@@ -1,104 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Threading;
-using System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.Hive.Views {
-  [View("Updateable Hive Experiment Manager View")]
-  [Content(typeof(HiveExperimentManagerClient), true)]
-  public partial class UpdateableHiveExperimentManagerView : HiveExperimentManagerView {
-    private ProgressView progressView;
-
-    public UpdateableHiveExperimentManagerView() {
-      InitializeComponent();
-      updateExperimentsPanel.Dock = DockStyle.Fill;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      Content_IsProgressingChanged(this, EventArgs.Empty);
-      if (Content != null) UpdateExperimentsAsync();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      this.Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
-    }
-
-    protected override void DeregisterContentEvents() {
-      base.DeregisterContentEvents();
-      this.Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
-    }
-
-    private void updateExperimentsButton_Click(object sender, EventArgs e) {
-      if (Content != null) UpdateExperimentsAsync();
-    }
-
-    private void Content_IsProgressingChanged(object sender, EventArgs e) {
-      if (this.InvokeRequired) {
-        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
-      } else {
-        if (Content != null && Content.IsProgressing) {
-          SetProgressView();
-        } else {
-          FinishProgressView();
-        }
-      }
-    }
-
-    private void SetProgressView() {
-      if (progressView == null) {
-        progressView = new ProgressView(this, Content.Progress);
-      } else {
-        progressView.Progress = Content.Progress;
-      }
-    }
-
-    private void FinishProgressView() {
-      if (progressView != null) {
-        progressView.Finish();
-        progressView = null;
-        SetEnabledStateOfControls();
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      updateExperimentsPanel.Visible = Content != null && Content.HiveExperiments == null;
-    }
-
-    protected void UpdateExperimentsAsync() {
-      MethodInvoker invoker = new MethodInvoker(Content.UpdateExperimentList);
-      invoker.BeginInvoke((ar) => {
-        try {
-          invoker.EndInvoke(ar);
-        }
-        catch (Exception ex) {
-          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
-        }
-      }, null);
-    }
-  }
-}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.designer.cs	(revision 6032)
+++ 	(revision )
@@ -1,71 +1,0 @@
-﻿namespace HeuristicLab.Clients.Hive.Views {
-  partial class UpdateableHiveExperimentManagerView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateableHiveExperimentManagerView));
-      this.updateExperimentsPanel = new System.Windows.Forms.Panel();
-      this.updateExperimentsButton = new System.Windows.Forms.Button();
-      this.updateExperimentsPanel.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // updateExperimentsPanel
-      // 
-      this.updateExperimentsPanel.Controls.Add(this.updateExperimentsButton);
-      this.updateExperimentsPanel.Location = new System.Drawing.Point(265, 3);
-      this.updateExperimentsPanel.Name = "updateExperimentsPanel";
-      this.updateExperimentsPanel.Size = new System.Drawing.Size(360, 103);
-      this.updateExperimentsPanel.TabIndex = 7;
-      // 
-      // updateExperimentsButton
-      // 
-      this.updateExperimentsButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.updateExperimentsButton.Image = ((System.Drawing.Image)(resources.GetObject("updateExperimentsButton.Image")));
-      this.updateExperimentsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.updateExperimentsButton.Location = new System.Drawing.Point(87, 28);
-      this.updateExperimentsButton.Name = "updateExperimentsButton";
-      this.updateExperimentsButton.Size = new System.Drawing.Size(175, 59);
-      this.updateExperimentsButton.TabIndex = 5;
-      this.updateExperimentsButton.Text = "Update Experiment List";
-      this.updateExperimentsButton.UseVisualStyleBackColor = true;
-      this.updateExperimentsButton.Click += new System.EventHandler(this.updateExperimentsButton_Click);
-      // 
-      // HiveExperimentManagerExtendedView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.updateExperimentsPanel);
-      this.Name = "HiveExperimentManagerExtendedView";
-      this.Controls.SetChildIndex(this.updateExperimentsPanel, 0);
-      this.updateExperimentsPanel.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Panel updateExperimentsPanel;
-    private System.Windows.Forms.Button updateExperimentsButton;
-  }
-}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/UpdateableHiveExperimentManagerView.resx	(revision 6032)
+++ 	(revision )
@@ -1,186 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="updateExperimentsButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        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
-</value>
-  </data>
-</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj	(revision 6033)
@@ -74,5 +74,4 @@
       <HintPath>C:\Program Files\HeuristicLab 3.3\Calendar.DayView.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Clients.Hive.Views-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Collections-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
@@ -158,9 +157,15 @@
       <DependentUpon>UpdateControl.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\HiveExperimentView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveExperimentView.Designer.cs">
-      <DependentUpon>HiveExperimentView.cs</DependentUpon>
+    <Compile Include="ExperimentManager\OptimizerHiveJobView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExperimentManager\OptimizerHiveJobView.designer.cs">
+      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExperimentManager\RefreshableHiveExperimentView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExperimentManager\RefreshableHiveExperimentView.Designer.cs">
+      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
     </Compile>
     <Compile Include="ExperimentManager\HiveItemView.cs">
@@ -171,8 +176,16 @@
     </Compile>
     <Compile Include="ExperimentManager\StateLogListList.cs" />
-    <Compile Include="ExperimentManager\ItemTreeView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\ItemTreeView.designer.cs">
+    <Compile Include="ExperimentManager\TreeView\NewExperimentTreeNodeAction.cs" />
+    <Compile Include="ExperimentManager\TreeView\DeleteJobTreeNodeAction.cs" />
+    <Compile Include="ExperimentManager\TreeView\HiveJobItemTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExperimentManager\TreeView\HiveJobItemTreeView.Designer.cs">
+      <DependentUpon>HiveJobItemTreeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExperimentManager\TreeView\ItemTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExperimentManager\TreeView\ItemTreeView.designer.cs">
       <DependentUpon>ItemTreeView.cs</DependentUpon>
     </Compile>
@@ -283,8 +296,11 @@
       <DependentUpon>UpdateControl.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\HiveExperimentView.resx">
-      <DependentUpon>HiveExperimentView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\ItemTreeView.resx">
+    <EmbeddedResource Include="ExperimentManager\OptimizerHiveJobView.resx">
+      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExperimentManager\RefreshableHiveExperimentView.resx">
+      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExperimentManager\TreeView\ItemTreeView.resx">
       <DependentUpon>ItemTreeView.cs</DependentUpon>
     </EmbeddedResource>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame	(revision 6033)
@@ -8,8 +8,20 @@
   [Plugin("HeuristicLab.Clients.Hive.Views", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Clients.Hive.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.4")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.DayView", "1.0")]
+  [PluginDependency("HeuristicLab.Hive", "3.4")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
-  [PluginDependency("HeuristicLab.DayView", "1.0")]
+  [PluginDependency("HeuristicLab.Services.Hive.Common", "3.4")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
   public class HeuristicLabClientsHiveViewsPlugin : PluginBase {
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 6033)
@@ -26,4 +26,5 @@
 using System.Linq;
 using System.Threading;
+using HeuristicLab.Clients.Hive.ExperimentManager;
 using HeuristicLab.Clients.Hive.Jobs;
 using HeuristicLab.Common;
@@ -44,10 +45,15 @@
 
     #region Properties
-    private ItemCollection<HiveExperiment> hiveExperiments;
-    public ItemCollection<HiveExperiment> HiveExperiments {
+    private ItemCollection<RefreshableHiveExperiment> hiveExperiments;
+    public ItemCollection<RefreshableHiveExperiment> HiveExperiments {
       get { return hiveExperiments; }
-      set { hiveExperiments = value; }
-    }
-
+      set {
+        if (value != hiveExperiments) {
+          hiveExperiments = value;
+          OnHiveExperimentsChanged();
+        }
+      }
+    }
+    
     private List<Plugin> onlinePlugins;
     public List<Plugin> OnlinePlugins {
@@ -69,8 +75,12 @@
       OnRefreshing();
 
-      hiveExperiments = new HiveItemCollection<HiveExperiment>();
-
       try {
-        hiveExperiments.AddRange(ServiceLocator.Instance.CallHiveService<List<HiveExperiment>>(s => s.GetHiveExperiments()).OrderBy(x => x.Name));
+        hiveExperiments = new HiveItemCollection<RefreshableHiveExperiment>();
+        var he = ServiceLocator.Instance.CallHiveService<IEnumerable<HiveExperiment>>(s => s.GetHiveExperiments());
+        hiveExperiments.AddRange(he.Select(x => new RefreshableHiveExperiment(x)).OrderBy(x => x.HiveExperiment.Name));
+      }
+      catch {
+        hiveExperiments = null;
+        throw;
       }
       finally {
@@ -98,8 +108,9 @@
     public static void Store(IHiveItem item) {
       if (item.Id == Guid.Empty) {
-        if (item is HiveExperiment) {
-          ExperimentManagerClient.Instance.UploadExperiment((HiveExperiment)item);
+        if (item is RefreshableHiveExperiment) {
+          ExperimentManagerClient.Instance.UploadExperiment((RefreshableHiveExperiment)item);
         }
       } else {
+
         if (item is HiveExperiment)
           ServiceLocator.Instance.CallHiveService(s => s.UpdateHiveExperiment((HiveExperiment)item));
@@ -127,4 +138,6 @@
       if (item is HiveExperiment)
         ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(item.Id));
+      if (item is RefreshableHiveExperiment)
+        ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(item.Id));
       item.Id = Guid.Empty;
     }
@@ -142,13 +155,18 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
-    #endregion
-
-    public static void StartExperiment(Action<Exception> exceptionCallback, HiveExperiment hiveExperiment) {
+    public event EventHandler HiveExperimentsChanged;
+    private void OnHiveExperimentsChanged() {
+      var handler = HiveExperimentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public static void StartExperiment(Action<Exception> exceptionCallback, RefreshableHiveExperiment refreshableHiveExperiment) {
       ExperimentManagerClient.StoreAsync(
         new Action<Exception>((Exception ex) => {
-          hiveExperiment.ExecutionState = ExecutionState.Prepared;
+          refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Prepared;
           exceptionCallback(ex);
-        }), hiveExperiment);
-      hiveExperiment.ExecutionState = ExecutionState.Started;
+        }), refreshableHiveExperiment);
+      refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Started;
     }
 
@@ -174,10 +192,10 @@
 
     #region Upload Experiment
-    private void UploadExperiment(HiveExperiment hiveExperiment) {
+    private void UploadExperiment(RefreshableHiveExperiment optimizerHiveExperiment) {
       try {
-        hiveExperiment.Progress = new Progress("Connecting to server...");
-        hiveExperiment.IsProgressing = true;
+        optimizerHiveExperiment.HiveExperiment.Progress = new Progress("Connecting to server...");
+        optimizerHiveExperiment.HiveExperiment.IsProgressing = true;
         ServiceLocator.Instance.CallHiveService(service => {
-          IEnumerable<string> resourceNames = ToResourceNameList(hiveExperiment.ResourceNames);
+          IEnumerable<string> resourceNames = ToResourceNameList(optimizerHiveExperiment.HiveExperiment.ResourceNames);
           var resourceIds = new List<Guid>();
           foreach (var resourceName in resourceNames) {
@@ -189,17 +207,17 @@
           }
 
-          foreach (HiveJob hiveJob in hiveExperiment.HiveJobs) {
+          foreach (OptimizerHiveJob hiveJob in optimizerHiveExperiment.HiveExperiment.HiveJobs.OfType<OptimizerHiveJob>()) {
             hiveJob.SetIndexInParentOptimizerList(null);
           }
 
           // upload HiveExperiment
-          hiveExperiment.Progress.Status = "Uploading HiveExperiment...";
-          hiveExperiment.Id = service.AddHiveExperiment(hiveExperiment);
-
-          int totalJobCount = hiveExperiment.GetAllHiveJobs().Count();
+          optimizerHiveExperiment.HiveExperiment.Progress.Status = "Uploading HiveExperiment...";
+          optimizerHiveExperiment.HiveExperiment.Id = service.AddHiveExperiment(optimizerHiveExperiment.HiveExperiment);
+
+          int totalJobCount = optimizerHiveExperiment.HiveExperiment.GetAllHiveJobs().Count();
           int jobCount = 0;
 
           // upload plugins
-          hiveExperiment.Progress.Status = "Uploading plugins...";
+          optimizerHiveExperiment.HiveExperiment.Progress.Status = "Uploading plugins...";
           this.OnlinePlugins = service.GetPlugins();
           this.AlreadyUploadedPlugins = new List<Plugin>();
@@ -208,15 +226,15 @@
 
           // upload jobs
-          hiveExperiment.Progress.Status = "Uploading jobs...";
-
-          foreach (HiveJob hiveJob in hiveExperiment.HiveJobs) {
-            UploadJobWithChildren(hiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, hiveExperiment.UseLocalPlugins, hiveExperiment.Id);
+          optimizerHiveExperiment.HiveExperiment.Progress.Status = "Uploading jobs...";
+
+          foreach (HiveJob hiveJob in optimizerHiveExperiment.HiveExperiment.HiveJobs) {
+            UploadJobWithChildren(optimizerHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, optimizerHiveExperiment.HiveExperiment.UseLocalPlugins, optimizerHiveExperiment.HiveExperiment.Id);
           }
 
-          if (hiveExperiment.RefreshAutomatically) hiveExperiment.StartResultPolling();
+          if (optimizerHiveExperiment.RefreshAutomatically) optimizerHiveExperiment.StartResultPolling();
         });
       }
       finally {
-        hiveExperiment.IsProgressing = false;
+        optimizerHiveExperiment.HiveExperiment.IsProgressing = false;
       }
     }
@@ -256,9 +274,9 @@
       List<IPluginDescription> plugins;
 
-      if (hiveJob.OptimizerJob.ComputeInParallel &&
-        (hiveJob.OptimizerJob.Optimizer is Optimization.Experiment || hiveJob.OptimizerJob.Optimizer is Optimization.BatchRun)) {
+      if (hiveJob.JobItem.ComputeInParallel &&
+        (hiveJob.JobItem.Item is Optimization.Experiment || hiveJob.JobItem.Item is Optimization.BatchRun)) {
         hiveJob.Job.IsParentJob = true;
         hiveJob.Job.FinishWhenChildJobsFinished = true;
-        hiveJob.OptimizerJob.CollectChildJobs = false; // don't collect child-jobs on slaves
+        hiveJob.JobItem.CollectChildJobs = false; // don't collect child-jobs on slaves
         jobData = hiveJob.GetAsJobData(true, out plugins);
       } else {
@@ -312,18 +330,10 @@
 
         hiveExperiment.HiveJobs = new ItemCollection<HiveJob>(allHiveJobs.Values.Where(x => !x.Job.ParentJobId.HasValue));
-        //hiveExperiment.HiveJobs = allHiveJobs[hiveExperiment.RootJobId];
 
         if (hiveExperiment.IsFinished()) {
-          //hiveExperiment.ExecutionTime = hiveExperiment.HiveJobs.Max(.Job.DateFinished.Value - hiveExperiment.HiveJobs.Job.DateCreated.Value;
-          //hiveExperiment.lastUpdateTime = hiveExperiment.HiveJob.Job.DateFinished.Value;
           hiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
-          //OnStopped(); // todo: stop timer
         } else {
-          //hiveExperiment.ExecutionTime = hiveExperiment.HiveJobs.Job.DateCreated.HasValue ? DateTime.Now - hiveExperiment.HiveJobs.Job.DateCreated.Value : TimeSpan.Zero;
-          //hiveExperiment.lastUpdateTime = DateTime.Now;
           hiveExperiment.ExecutionState = Core.ExecutionState.Started;
-          //OnStarted(); // todo: start timer
-        }
-        hiveExperiment.UpdateTotalExecutionTime();
+        }
 
         // build child-job tree
@@ -331,9 +341,6 @@
           BuildHiveJobTree(hiveJob, allJobs, allHiveJobs);
         }
-        hiveExperiment.UpdateTotalExecutionTime();
-
-        if (hiveExperiment.ExecutionState != ExecutionState.Stopped) {
-          hiveExperiment.RefreshAutomatically = true;
-        }
+
+        hiveExperiment.OnLoaded();
       }
       finally {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6033)
@@ -24,9 +24,8 @@
 using System.Drawing;
 using System.Linq;
-using HeuristicLab.Clients.Hive.Jobs;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Optimization;
+using HeuristicLab.Hive;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
@@ -36,6 +35,6 @@
   [Item("Hive Job", "Represents a hive job.")]
   [StorableClass]
-  public class HiveJob : NamedItem, IItemTree {
-    private static object locker = new object();
+  public class HiveJob : NamedItem, IItemTree<HiveJob> {
+    protected static object locker = new object();
 
     public override Image ItemImage {
@@ -56,5 +55,5 @@
     }
 
-    private Job job;
+    protected Job job;
     public Job Job {
       get { return job; }
@@ -70,16 +69,16 @@
 
     [Storable]
-    private OptimizerJob optimizerJob;
-    public OptimizerJob OptimizerJob {
-      get { return optimizerJob; }
+    protected ItemJob jobItem;
+    public ItemJob JobItem {
+      get { return jobItem; }
       internal set {
-        if (optimizerJob != null && syncJobsWithOptimizers) {
+        if (jobItem != null && syncJobsWithOptimizers) {
           this.childHiveJobs.Clear();
         }
-        if (optimizerJob != value) {
-          DergisterOptimizerEvents();
-          optimizerJob = value;
-          RegisterOptimizerEvents();
-          OnOptimizerJobChanged();
+        if (jobItem != value) {
+          DergisterJobItemsEvents();
+          jobItem = value;
+          RegisterJobItemEvents();
+          OnJobItemChanged();
         }
       }
@@ -87,12 +86,13 @@
 
     [Storable]
-    private ItemList<HiveJob> childHiveJobs;
-    public ReadOnlyItemList<HiveJob> ChildHiveJobs {
+    protected ItemList<HiveJob> childHiveJobs;
+    public virtual ReadOnlyItemList<HiveJob> ChildHiveJobs {
       get { return childHiveJobs.AsReadOnly(); }
     }
 
     [Storable]
-    private bool syncJobsWithOptimizers = true;
-
+    protected bool syncJobsWithOptimizers = true;
+
+    #region Constructors and Cloning
     public HiveJob() {
       this.Job = new Job() {
@@ -106,14 +106,9 @@
     }
 
-    public HiveJob(OptimizerJob optimizerJob, bool autoCreateChildHiveJobs)
+    public HiveJob(ItemJob jobItem, bool autoCreateChildHiveJobs)
       : this() {
       this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
-      this.OptimizerJob = optimizerJob;
+      this.JobItem = jobItem;
       this.syncJobsWithOptimizers = true;
-    }
-
-    public HiveJob(IOptimizer optimizer)
-      : this() {
-      this.OptimizerJob = new OptimizerJob(optimizer);
     }
 
@@ -122,8 +117,8 @@
       this.Job = job;
       try {
-        this.OptimizerJob = PersistenceUtil.Deserialize<OptimizerJob>(jobData.Data);
+        this.JobItem = PersistenceUtil.Deserialize<ItemJob>(jobData.Data);
       }
       catch {
-        this.OptimizerJob = null;
+        this.JobItem = null;
       }
       this.childHiveJobs = new ItemList<HiveJob>();
@@ -135,82 +130,34 @@
       : base(original, cloner) {
       this.Job = cloner.Clone(original.job);
-      this.OptimizerJob = cloner.Clone(original.OptimizerJob);
+      this.JobItem = cloner.Clone(original.JobItem);
+      this.childHiveJobs = cloner.Clone(original.childHiveJobs);
+      this.syncJobsWithOptimizers = original.syncJobsWithOptimizers;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new HiveJob(this, cloner);
     }
-
-    /// <summary>
-    /// if this.Optimizer is an experiment
-    ///   Uses the child-optimizers of this.HiveJob and creates HiveJob-childs
-    /// if this.Optimizer is a batchrun
-    ///   Creates a number of child-jobs according to repetitions
-    /// </summary>
-    private void UpdateChildHiveJobs() {
-      if (Job != null && syncJobsWithOptimizers) {
-        if (!OptimizerJob.ComputeInParallel) {
-          this.childHiveJobs.Clear();
-        } else {
-          if (OptimizerJob.Optimizer is Optimization.Experiment) {
-            Optimization.Experiment experiment = (Optimization.Experiment)OptimizerJob.Optimizer;
-            foreach (IOptimizer childOpt in experiment.Optimizers) {
-              this.childHiveJobs.Add(new HiveJob(childOpt));
-            }
-          } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-            Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-            if (batchRun.Optimizer != null) {
-              while (this.childHiveJobs.Count < batchRun.Repetitions) {
-                this.childHiveJobs.Add(new HiveJob(batchRun.Optimizer));
-              }
-              while (this.childHiveJobs.Count > batchRun.Repetitions) {
-                this.childHiveJobs.Remove(this.childHiveJobs.Last());
-              }
-            }
-          }
-        }
-      }
-    }
-
-    private void RegisterOptimizerEvents() {
-      if (OptimizerJob != null) {
-        if (OptimizerJob.Optimizer is Optimization.Experiment) {
-          Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
-          experiment.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
-          experiment.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
-          experiment.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
-          experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
-        } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-          Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-          batchRun.RepetitionsChanged += new EventHandler(batchRun_RepetitionsChanged);
-          batchRun.OptimizerChanged += new EventHandler(batchRun_OptimizerChanged);
-        }
-        OptimizerJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        OptimizerJob.ToStringChanged += new EventHandler(OptimizerJob_ToStringChanged);
-      }
-    }
-    private void DergisterOptimizerEvents() {
-      if (OptimizerJob != null) {
-        if (OptimizerJob.Optimizer is Optimization.Experiment) {
-          Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
-          experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
-          experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
-          experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
-          experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
-        } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-          Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-          batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged);
-          batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged);
-        }
-        OptimizerJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        OptimizerJob.ToStringChanged -= new EventHandler(OptimizerJob_ToStringChanged);
-      }
-    }
-
-    private void RegisterChildHiveJobEvents() {
+    #endregion
+
+    protected virtual void UpdateChildHiveJobs() { }
+
+    protected virtual void RegisterJobItemEvents() {
+      if (JobItem != null) {
+        JobItem.ComputeInParallelChanged += new EventHandler(JobItem_ComputeInParallelChanged);
+        JobItem.ToStringChanged += new EventHandler(JobItem_ToStringChanged);
+      }
+    }
+    protected virtual void DergisterJobItemsEvents() {
+      if (JobItem != null) {
+        JobItem.ComputeInParallelChanged -= new EventHandler(JobItem_ComputeInParallelChanged);
+        JobItem.ToStringChanged -= new EventHandler(JobItem_ToStringChanged);
+      }
+    }
+
+    protected virtual 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() {
+    protected virtual void DeregisterChildHiveJobEvents() {
       this.childHiveJobs.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsAdded);
       this.childHiveJobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsRemoved);
@@ -218,214 +165,21 @@
     }
 
-    private void batchRun_OptimizerChanged(object sender, EventArgs e) {
-      if (syncJobsWithOptimizers) {
-        UpdateChildHiveJobs();
-      }
-    }
-
-    private void batchRun_RepetitionsChanged(object sender, EventArgs e) {
-      if (syncJobsWithOptimizers) {
-        UpdateChildHiveJobs();
-      }
-    }
-
-    private void OptimizerJob_ToStringChanged(object sender, EventArgs e) {
+    protected virtual void JobItem_ToStringChanged(object sender, EventArgs e) {
       this.OnToStringChanged();
     }
-
-    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
-            this.childHiveJobs.Add(new HiveJob(item.Value));
-          }
-        }
-      }
-    }
-    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.OldItems) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-        foreach (var item in e.Items) {
-          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
-            this.childHiveJobs.Add(new HiveJob(item.Value));
-          }
-        }
-      }
-    }
-    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-      }
-    }
-    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-      }
-    }
-
-    private void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
-      if (OptimizerJob != null && syncJobsWithOptimizers) {
+    
+    protected virtual void JobItem_ComputeInParallelChanged(object sender, EventArgs e) {
+      if (JobItem != null && syncJobsWithOptimizers) {
         this.UpdateChildHiveJobs();
       }
     }
 
-    public void AddChildHiveJob(HiveJob hiveJob) {
+    public virtual void AddChildHiveJob(HiveJob hiveJob) {
       this.childHiveJobs.Add(hiveJob);
-      syncJobsWithOptimizers = false;
-      if (this.OptimizerJob != null && hiveJob.OptimizerJob != null) {
-        // if job is in state Paused, it has to preserve its ResultCollection, which is cleared when a optimizer is added to an experiment
-        OptimizerJob optimizerJobClone = null;
-        if (hiveJob.Job.State == JobState.Paused) {
-          optimizerJobClone = (OptimizerJob)hiveJob.OptimizerJob.Clone();
-        }
-
-        if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
-          if (!this.OptimizerJob.OptimizerAsExperiment.Optimizers.Contains(hiveJob.OptimizerJob.Optimizer)) {
-            UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, hiveJob.OptimizerJob);
-          }
-        } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, hiveJob.OptimizerJob);
-        }
-
-        if (hiveJob.Job.State == JobState.Paused) {
-          hiveJob.OptimizerJob = optimizerJobClone;
-        }
-      }
-      syncJobsWithOptimizers = true;
-    }
-
-    /// <summary>
-    /// if this.Optimizer is Experiment
-    ///   replace the child-optimizer in the experiment
-    /// if this.Optimizer is BatchRun
-    ///   add the runs from the optimizerJob to the batchrun and replace the Optimizer
-    /// </summary>
-    public void UpdateChildOptimizer(OptimizerJob optimizerJob, Guid childJobId) {
-      syncJobsWithOptimizers = false; // don't sync with optimizers during this method
-      bool childIsFinishedOptimizerDownloaded = false;
-
-      if (this.OptimizerJob != null && this.OptimizerJob.Optimizer != null) {
-        if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
-          UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, optimizerJob);
-          childIsFinishedOptimizerDownloaded = true;
-        } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, optimizerJob);
-          if (this.OptimizerJob.OptimizerAsBatchRun.Repetitions == this.OptimizerJob.Optimizer.Runs.Count) {
-            childIsFinishedOptimizerDownloaded = true;
-          }
-        } else {
-          childIsFinishedOptimizerDownloaded = optimizerJob.Optimizer.ExecutionState == ExecutionState.Stopped;
-        }
-      }
-
-      HiveJob child = this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
-      if (!optimizerJob.ComputeInParallel) {
-        child.syncJobsWithOptimizers = false;
-        child.OptimizerJob = optimizerJob;
-        child.syncJobsWithOptimizers = true;
-      }
-      if (childIsFinishedOptimizerDownloaded) {
-        //child.IsFinishedOptimizerDownloaded = true; // todo: clean up with childIsFinishedOptimizerDownloaded
-      }
-      syncJobsWithOptimizers = true;
-    }
-
-    /// <summary>
-    /// Adds the runs from the optimizerJob to the batchrun and replaces the Optimizer 
-    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
-    /// </summary>
-    private void UpdateOptimizerInBatchRun(BatchRun batchRun, OptimizerJob optimizerJob) {
-      if (batchRun.Optimizer == null) {
-        batchRun.Optimizer = (IOptimizer)optimizerJob.Optimizer; // only set the first optimizer as Optimizer. if every time the Optimizer would be set, the runs would be cleared each time
-      }
-      foreach (IRun run in optimizerJob.Optimizer.Runs) {
-        if (!batchRun.Runs.Contains(run)) {
-          run.Name = GetNewRunName(run, batchRun.Runs);
-          batchRun.Runs.Add(run);
-        }
-      }
-    }
-
-    /// <summary>
-    /// Parses the run numbers out of runs and renames the run to the next number
-    /// </summary>
-    private static string GetNewRunName(IRun run, RunCollection runs) {
-      int idx = run.Name.IndexOf("Run ") + 4;
-
-      if (idx == -1 || runs.Count == 0)
-        return run.Name;
-
-      int maxRunNumber = int.MinValue;
-      foreach (IRun r in runs) {
-        int number = GetRunNumber(r.Name);
-        maxRunNumber = Math.Max(maxRunNumber, number);
-      }
-
-      return run.Name.Substring(0, idx) + (maxRunNumber + 1).ToString();
-    }
-
-    /// <summary>
-    /// Parses the number of a Run out of its name. Example "Genetic Algorithm Run 3" -> 3
-    /// </summary>
-    private static int GetRunNumber(string runName) {
-      int idx = runName.IndexOf("Run ") + 4;
-      if (idx == -1) {
-        return 0;
-      } else {
-        return int.Parse(runName.Substring(idx, runName.Length - idx));
-      }
-    }
-
-    /// <summary>
-    /// replace the child-optimizer in the experiment
-    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
-    /// </summary>
-    private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerJob optimizerJob) {
-      if (optimizerJob.IndexInParentOptimizerList < 0)
-        throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Job is invalid and the optimizer-tree cannot be reassembled.");
-
-      while (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList) {
-        experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerJob at the correct position
-      }
-      if (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList + 1) {
-        experiment.Optimizers.Add(optimizerJob.Optimizer);
-      } else {
-        // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder)
-        // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted
-        if (!optimizerJob.ComputeInParallel || experiment.Optimizers[optimizerJob.IndexInParentOptimizerList].Name == "Placeholder") {
-          experiment.Optimizers[optimizerJob.IndexInParentOptimizerList] = optimizerJob.Optimizer;
-        }
-      }
-    }
-
-    /// <summary>
-    /// Sets the IndexInParentOptimizerList property of the OptimizerJob
-    /// according to the position in the OptimizerList of the parentHiveJob.Job
-    /// Recursively updates all the child-jobs as well
-    /// </summary>
-    internal void SetIndexInParentOptimizerList(HiveJob parentHiveJob) {
-      if (parentHiveJob != null) {
-        if (parentHiveJob.OptimizerJob.Optimizer is Optimization.Experiment) {
-          this.OptimizerJob.IndexInParentOptimizerList = parentHiveJob.OptimizerJob.OptimizerAsExperiment.Optimizers.IndexOf(this.OptimizerJob.Optimizer);
-        } else if (parentHiveJob.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          this.OptimizerJob.IndexInParentOptimizerList = 0;
-        } else {
-          throw new NotSupportedException("Only Experiment and BatchRuns are supported");
-        }
-      }
-      foreach (HiveJob child in childHiveJobs) {
-        child.SetIndexInParentOptimizerList(this);
-      }
     }
 
     public override string ToString() {
-      if (optimizerJob != null) {
-        return optimizerJob.ToString();
+      if (jobItem != null) {
+        return jobItem.ToString();
       } else {
         return base.ToString();
@@ -433,5 +187,5 @@
     }
 
-    public void UpdateFromLightweightJob(LightweightJob lightweightJob) {
+    public virtual void UpdateFromLightweightJob(LightweightJob lightweightJob) {
       if (lightweightJob != null) {
         job.Id = lightweightJob.Id;
@@ -455,41 +209,12 @@
     ///   if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
     /// </param>
-    public JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
-      plugins = new List<IPluginDescription>();
-      if (this.optimizerJob == null || this.optimizerJob.Optimizer == null)
-        return null;
-
-      IEnumerable<Type> usedTypes;
-      byte[] jobByteArray;
-      if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.Experiment) {
-        OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone(); // use a cloned job, so that the childHiveJob don't get confused
-        clonedJob.OptimizerAsExperiment.Optimizers.Clear();
-        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-        OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone();
-        clonedJob.OptimizerAsBatchRun.Optimizer = null;
-        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (this.OptimizerJob.Optimizer is IAlgorithm) {
-        ((IAlgorithm)this.OptimizerJob.Optimizer).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
-        jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob, out usedTypes);
-      } else {
-        jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob, out usedTypes);
-      }
-
-      JobData jobData = new JobData() {
-        JobId = job.Id,
-        Data = jobByteArray
-      };
-
-      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
-
-      return jobData;
-    }
-
+    public virtual JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
+      plugins = null;
+      return null;
+    }
 
     #region Events
     public event EventHandler JobChanged;
     private void OnJobChanged() {
-      LogMessage("JobChanged");
       EventHandler handler = JobChanged;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -498,13 +223,12 @@
     public event EventHandler JobStateChanged;
     private void OnJobStateChanged() {
-      LogMessage("JobStateChanged (State: " + this.Job.State + ", ExecutionTime: " + this.Job.ExecutionTime.ToString() + ")");
       EventHandler handler = JobStateChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
 
-    public event EventHandler OptimizerJobChanged;
-    private void OnOptimizerJobChanged() {
-      OptimizerJob_ComputeInParallelChanged(this, EventArgs.Empty);
-      var handler = OptimizerJobChanged;
+    public event EventHandler JobItemChanged;
+    private void OnJobItemChanged() {
+      JobItem_ComputeInParallelChanged(this, EventArgs.Empty);
+      var handler = JobItemChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -516,18 +240,10 @@
     }
     #endregion
-
-    public void LogMessage(string message) {
-      lock (locker) {
-        if (optimizerJob != null) {
-          optimizerJob.Log.LogMessage(message);
-        }
-      }
-    }
-
+    
     /// <summary>
     /// Returns a list of HiveJobs including this and all its child-jobs recursively
     /// </summary>
     public IEnumerable<HiveJob> GetAllHiveJobs() {
-      List<HiveJob> jobs = new List<HiveJob>();
+      var jobs = new List<HiveJob>();
       jobs.Add(this);
       foreach (HiveJob child in this.ChildHiveJobs) {
@@ -544,22 +260,4 @@
         if (result != null)
           return result;
-      }
-      return null;
-    }
-
-
-    public HiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
-      foreach (var child in ChildHiveJobs) {
-        if (child.OptimizerJob == optimizerJob)
-          return child;
-      }
-      return null;
-    }
-
-
-    public HiveJob GetChildByOptimizer(IOptimizer optimizer) {
-      foreach (var child in ChildHiveJobs) {
-        if (child.OptimizerJob.Optimizer == optimizer)
-          return child;
       }
       return null;
@@ -582,5 +280,4 @@
     }
 
-
     public void RemoveByJobId(Guid jobId) {
       IEnumerable<HiveJob> jobs = ChildHiveJobs.Where(j => j.Job.Id == jobId).ToList(); // if Guid.Empty needs to be removed, there could be more than one with this jobId
@@ -593,5 +290,5 @@
     }
 
-    public IEnumerable<IItemTree> GetChildItems() {
+    public IEnumerable<IItemTree<HiveJob>> GetChildItems() {
       return this.childHiveJobs;
     }
@@ -599,5 +296,5 @@
     #region INotifyObservableCollectionItemsChanged<IItemTree> Members
 
-    public event CollectionItemsChangedEventHandler<IItemTree> CollectionReset;
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> CollectionReset;
     private void OnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
       var handler = CollectionReset;
@@ -605,5 +302,5 @@
     }
 
-    public event CollectionItemsChangedEventHandler<IItemTree> ItemsAdded;
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> ItemsAdded;
     private void OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
       var handler = ItemsAdded;
@@ -611,5 +308,5 @@
     }
 
-    public event CollectionItemsChangedEventHandler<IItemTree> ItemsRemoved;
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> ItemsRemoved;
     private void OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
       var handler = ItemsRemoved;
@@ -617,6 +314,6 @@
     }
 
-    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));
+    private static CollectionItemsChangedEventArgs<IItemTree<HiveJob>> ToCollectionItemsChangedEventArgs(CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      return new CollectionItemsChangedEventArgs<IItemTree<HiveJob>>(e.Items.Select(x => x.Value), e.OldItems == null ? null : e.OldItems.Select(x => x.Value));
     }
     #endregion
@@ -634,5 +331,5 @@
         JobData jobData = new JobData();
         jobData.JobId = this.job.Id;
-        jobData.Data = PersistenceUtil.Serialize(this.optimizerJob);
+        jobData.Data = PersistenceUtil.Serialize(this.jobItem);
         service.UpdateJobData(this.Job, jobData);
         service.RestartJob(this.job.Id);
@@ -641,4 +338,30 @@
       });
     }
+    
+    public ICollection<IItemTreeNodeAction<HiveJob>> Actions {
+      get {
+        return new List<IItemTreeNodeAction<HiveJob>>();
+      }
+    }
+  }
+
+  [Item("Hive Job", "Represents a hive job.")]
+  [StorableClass]
+  public class HiveJob<T> : HiveJob where T : ItemJob {
+
+    public new T JobItem {
+      get { return (T)base.JobItem; }
+      internal set { base.JobItem = value; }
+    }
+
+    #region Constructors and Cloning
+    public HiveJob() : base() { }
+    protected HiveJob(HiveJob original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveJob<T>(this, cloner);
+    }
+    #endregion
   }
 }
Index: anches/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 6032)
+++ 	(revision )
@@ -1,653 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.Linq;
-using HeuristicLab.Clients.Hive.Jobs;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.Hive {
-
-  [Item("Hive Job", "Represents a hive job.")]
-  public class HiveJob : NamedItem, IItemTree {
-    private static object locker = new object();
-
-    public override Image ItemImage {
-      get {
-        if (job.Id == Guid.Empty) { // not yet uploaded
-          return HeuristicLab.Common.Resources.VSImageLibrary.Event;
-        } else {
-          if (job.State == JobState.Waiting) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePrepared;
-          else if (job.State == JobState.Calculating) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
-          else if (job.State == JobState.Transferring) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
-          else if (job.State == JobState.Paused) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePaused;
-          else if (job.State == JobState.Aborted) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
-          else if (job.State == JobState.Failed) return HeuristicLab.Common.Resources.VSImageLibrary.Error;
-          else if (job.State == JobState.Finished) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
-          else return HeuristicLab.Common.Resources.VSImageLibrary.Event;
-        }
-      }
-    }
-
-    private Job job;
-    public Job Job {
-      get { return job; }
-      set {
-        if (job != value) {
-          job = value;
-          OnJobChanged();
-          OnToStringChanged();
-          OnItemImageChanged();
-        }
-      }
-    }
-
-    private OptimizerJob optimizerJob;
-    public OptimizerJob OptimizerJob {
-      get { return optimizerJob; }
-      internal set {
-        if (optimizerJob != null && syncJobsWithOptimizers) {
-          this.childHiveJobs.Clear();
-        }
-        if (optimizerJob != value) {
-          DergisterOptimizerEvents();
-          optimizerJob = value;
-          //if (optimizerJob.ExecutionState == ExecutionState.Stopped) {
-          //  IsFinishedOptimizerDownloaded = true;
-          //}
-          RegisterOptimizerEvents();
-          OnOptimizerJobChanged();
-        }
-      }
-    }
-
-    private ItemList<HiveJob> childHiveJobs;
-    public ReadOnlyItemList<HiveJob> ChildHiveJobs {
-      get { return childHiveJobs.AsReadOnly(); }
-    }
-
-    //private bool isFinishedOptimizerDownloaded;
-    //public bool IsFinishedOptimizerDownloaded {
-    //  get { return isFinishedOptimizerDownloaded; }
-    //  set {
-    //    if (isFinishedOptimizerDownloaded != value) {
-    //      isFinishedOptimizerDownloaded = value;
-    //      OnIsFinishedOptimizerDownloadedChanged();
-    //    }
-    //  }
-    //}
-
-    private bool syncJobsWithOptimizers = true;
-
-    public HiveJob() {
-      this.Job = new Job() {
-        CoresNeeded = 1,
-        MemoryNeeded = 0
-      };
-      job.State = JobState.Offline;
-      this.childHiveJobs = new ItemList<HiveJob>();
-      syncJobsWithOptimizers = true;
-      RegisterChildHiveJobEvents();
-    }
-
-    public HiveJob(OptimizerJob optimizerJob, bool autoCreateChildHiveJobs)
-      : this() {
-      this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
-      this.OptimizerJob = optimizerJob;
-      this.syncJobsWithOptimizers = true;
-    }
-
-    public HiveJob(IOptimizer optimizer)
-      : this() {
-      this.OptimizerJob = new OptimizerJob(optimizer);
-    }
-
-    public HiveJob(Job job, JobData jobData, bool autoCreateChildHiveJobs) {
-      this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
-      this.Job = job;
-      try {
-        this.OptimizerJob = PersistenceUtil.Deserialize<OptimizerJob>(jobData.Data);
-      }
-      catch {
-        this.OptimizerJob = null;
-      }
-      this.childHiveJobs = new ItemList<HiveJob>();
-      this.syncJobsWithOptimizers = true;
-      RegisterChildHiveJobEvents();
-    }
-
-    protected HiveJob(HiveJob original, Cloner cloner)
-      : base(original, cloner) {
-      this.Job = cloner.Clone(original.job);
-      this.OptimizerJob = cloner.Clone(original.OptimizerJob);
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new HiveJob(this, cloner);
-    }
-
-    /// <summary>
-    /// if this.Optimizer is an experiment
-    ///   Uses the child-optimizers of this.HiveJob and creates HiveJob-childs
-    /// if this.Optimizer is a batchrun
-    ///   Creates a number of child-jobs according to repetitions
-    /// </summary>
-    private void UpdateChildHiveJobs() {
-      if (Job != null && syncJobsWithOptimizers) {
-        if (!OptimizerJob.ComputeInParallel) {
-          this.childHiveJobs.Clear();
-        } else {
-          if (OptimizerJob.Optimizer is Optimization.Experiment) {
-            Optimization.Experiment experiment = (Optimization.Experiment)OptimizerJob.Optimizer;
-            foreach (IOptimizer childOpt in experiment.Optimizers) {
-              this.childHiveJobs.Add(new HiveJob(childOpt));
-            }
-          } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-            Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-            if (batchRun.Optimizer != null) {
-              while (this.childHiveJobs.Count < batchRun.Repetitions) {
-                this.childHiveJobs.Add(new HiveJob(batchRun.Optimizer));
-              }
-              while (this.childHiveJobs.Count > batchRun.Repetitions) {
-                this.childHiveJobs.Remove(this.childHiveJobs.Last());
-              }
-            }
-          }
-        }
-      }
-    }
-
-    private void RegisterOptimizerEvents() {
-      if (OptimizerJob != null) {
-        if (OptimizerJob.Optimizer is Optimization.Experiment) {
-          Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
-          experiment.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
-          experiment.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
-          experiment.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
-          experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
-        } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-          Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-          batchRun.RepetitionsChanged += new EventHandler(batchRun_RepetitionsChanged);
-          batchRun.OptimizerChanged += new EventHandler(batchRun_OptimizerChanged);
-        }
-        OptimizerJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        OptimizerJob.ToStringChanged += new EventHandler(OptimizerJob_ToStringChanged);
-      }
-    }
-    private void DergisterOptimizerEvents() {
-      if (OptimizerJob != null) {
-        if (OptimizerJob.Optimizer is Optimization.Experiment) {
-          Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
-          experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
-          experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
-          experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
-          experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
-        } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
-          Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
-          batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged);
-          batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged);
-        }
-        OptimizerJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
-        OptimizerJob.ToStringChanged -= new EventHandler(OptimizerJob_ToStringChanged);
-      }
-    }
-
-    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) {
-        UpdateChildHiveJobs();
-      }
-    }
-
-    private void batchRun_RepetitionsChanged(object sender, EventArgs e) {
-      if (syncJobsWithOptimizers) {
-        UpdateChildHiveJobs();
-      }
-    }
-
-    private void OptimizerJob_ToStringChanged(object sender, EventArgs e) {
-      this.OnToStringChanged();
-    }
-
-    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
-            this.childHiveJobs.Add(new HiveJob(item.Value));
-          }
-        }
-      }
-    }
-    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.OldItems) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-        foreach (var item in e.Items) {
-          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
-            this.childHiveJobs.Add(new HiveJob(item.Value));
-          }
-        }
-      }
-    }
-    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-      }
-    }
-    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
-      if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
-      }
-    }
-
-    private void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
-      if (OptimizerJob != null && syncJobsWithOptimizers) {
-        this.UpdateChildHiveJobs();
-      }
-    }
-
-    public void AddChildHiveJob(HiveJob hiveJob) {
-      this.childHiveJobs.Add(hiveJob);
-      syncJobsWithOptimizers = false;
-      if (this.OptimizerJob != null && hiveJob.OptimizerJob != null) {
-        // if job is in state Paused, it has to preserve its ResultCollection, which is cleared when a optimizer is added to an experiment
-        OptimizerJob optimizerJobClone = null;
-        if (hiveJob.Job.State == JobState.Paused) {
-          optimizerJobClone = (OptimizerJob)hiveJob.OptimizerJob.Clone();
-        }
-
-        if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
-          if (!this.OptimizerJob.OptimizerAsExperiment.Optimizers.Contains(hiveJob.OptimizerJob.Optimizer)) {
-            UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, hiveJob.OptimizerJob);
-          }
-        } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, hiveJob.OptimizerJob);
-        }
-
-        if (hiveJob.Job.State == JobState.Paused) {
-          hiveJob.OptimizerJob = optimizerJobClone;
-        }
-      }
-      syncJobsWithOptimizers = true;
-    }
-
-    /// <summary>
-    /// if this.Optimizer is Experiment
-    ///   replace the child-optimizer in the experiment
-    /// if this.Optimizer is BatchRun
-    ///   add the runs from the optimizerJob to the batchrun and replace the Optimizer
-    /// </summary>
-    public void UpdateChildOptimizer(OptimizerJob optimizerJob, Guid childJobId) {
-      syncJobsWithOptimizers = false; // don't sync with optimizers during this method
-      bool childIsFinishedOptimizerDownloaded = false;
-
-      if (this.OptimizerJob != null && this.OptimizerJob.Optimizer != null) {
-        if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
-          UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, optimizerJob);
-          childIsFinishedOptimizerDownloaded = true;
-        } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, optimizerJob);
-          if (this.OptimizerJob.OptimizerAsBatchRun.Repetitions == this.OptimizerJob.Optimizer.Runs.Count) {
-            childIsFinishedOptimizerDownloaded = true;
-          }
-        } else {
-          childIsFinishedOptimizerDownloaded = optimizerJob.Optimizer.ExecutionState == ExecutionState.Stopped;
-        }
-      }
-
-      HiveJob child = this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
-      if (!optimizerJob.ComputeInParallel) {
-        child.syncJobsWithOptimizers = false;
-        child.OptimizerJob = optimizerJob;
-        child.syncJobsWithOptimizers = true;
-      }
-      if (childIsFinishedOptimizerDownloaded) {
-        //child.IsFinishedOptimizerDownloaded = true; // todo: clean up with childIsFinishedOptimizerDownloaded
-      }
-      syncJobsWithOptimizers = true;
-    }
-
-    /// <summary>
-    /// Adds the runs from the optimizerJob to the batchrun and replaces the Optimizer 
-    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
-    /// </summary>
-    private void UpdateOptimizerInBatchRun(BatchRun batchRun, OptimizerJob optimizerJob) {
-      if (batchRun.Optimizer == null) {
-        batchRun.Optimizer = (IOptimizer)optimizerJob.Optimizer; // only set the first optimizer as Optimizer. if every time the Optimizer would be set, the runs would be cleared each time
-      }
-      foreach (IRun run in optimizerJob.Optimizer.Runs) {
-        if (!batchRun.Runs.Contains(run)) {
-          run.Name = GetNewRunName(run, batchRun.Runs);
-          batchRun.Runs.Add(run);
-        }
-      }
-    }
-
-    /// <summary>
-    /// Parses the run numbers out of runs and renames the run to the next number
-    /// </summary>
-    private static string GetNewRunName(IRun run, RunCollection runs) {
-      int idx = run.Name.IndexOf("Run ") + 4;
-
-      if (idx == -1 || runs.Count == 0)
-        return run.Name;
-
-      int maxRunNumber = int.MinValue;
-      foreach (IRun r in runs) {
-        int number = GetRunNumber(r.Name);
-        maxRunNumber = Math.Max(maxRunNumber, number);
-      }
-
-      return run.Name.Substring(0, idx) + (maxRunNumber + 1).ToString();
-    }
-
-    /// <summary>
-    /// Parses the number of a Run out of its name. Example "Genetic Algorithm Run 3" -> 3
-    /// </summary>
-    private static int GetRunNumber(string runName) {
-      int idx = runName.IndexOf("Run ") + 4;
-      if (idx == -1) {
-        return 0;
-      } else {
-        return int.Parse(runName.Substring(idx, runName.Length - idx));
-      }
-    }
-
-    /// <summary>
-    /// replace the child-optimizer in the experiment
-    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
-    /// </summary>
-    private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerJob optimizerJob) {
-      if (optimizerJob.IndexInParentOptimizerList < 0)
-        throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Job is invalid and the optimizer-tree cannot be reassembled.");
-
-      while (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList) {
-        experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerJob at the correct position
-      }
-      if (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList + 1) {
-        experiment.Optimizers.Add(optimizerJob.Optimizer);
-      } else {
-        // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder)
-        // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted
-        if (!optimizerJob.ComputeInParallel || experiment.Optimizers[optimizerJob.IndexInParentOptimizerList].Name == "Placeholder") {
-          experiment.Optimizers[optimizerJob.IndexInParentOptimizerList] = optimizerJob.Optimizer;
-        }
-      }
-    }
-
-    /// <summary>
-    /// Sets the IndexInParentOptimizerList property of the OptimizerJob
-    /// according to the position in the OptimizerList of the parentHiveJob.Job
-    /// Recursively updates all the child-jobs as well
-    /// </summary>
-    internal void SetIndexInParentOptimizerList(HiveJob parentHiveJob) {
-      if (parentHiveJob != null) {
-        if (parentHiveJob.OptimizerJob.Optimizer is Optimization.Experiment) {
-          this.OptimizerJob.IndexInParentOptimizerList = parentHiveJob.OptimizerJob.OptimizerAsExperiment.Optimizers.IndexOf(this.OptimizerJob.Optimizer);
-        } else if (parentHiveJob.OptimizerJob.Optimizer is Optimization.BatchRun) {
-          this.OptimizerJob.IndexInParentOptimizerList = 0;
-        } else {
-          throw new NotSupportedException("Only Experiment and BatchRuns are supported");
-        }
-      }
-      foreach (HiveJob child in childHiveJobs) {
-        child.SetIndexInParentOptimizerList(this);
-      }
-    }
-
-    public override string ToString() {
-      if (optimizerJob != null) {
-        return optimizerJob.ToString();
-      } else {
-        return base.ToString();
-      }
-    }
-
-    public void UpdateFromLightweightJob(LightweightJob lightweightJob) {
-      if (lightweightJob != null) {
-        job.Id = lightweightJob.Id;
-        job.ParentJobId = lightweightJob.ParentJobId;
-        job.ExecutionTime = lightweightJob.ExecutionTime;
-        job.State = lightweightJob.State;
-        job.StateLog = new List<StateLog>(lightweightJob.StateLog);
-        job.Command = lightweightJob.Command;
-        job.LastJobDataUpdate = lightweightJob.LastJobDataUpdate;
-        
-        OnJobStateChanged();
-        OnToStringChanged();
-        OnItemImageChanged();
-      }
-    }
-
-    /// <summary>
-    /// Creates a JobData object containing the Job and the IJob-Object as byte[]
-    /// </summary>
-    /// <param name="withoutChildOptimizers">
-    ///   if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
-    /// </param>
-    public JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
-      plugins = new List<IPluginDescription>();
-      if (this.optimizerJob == null || this.optimizerJob.Optimizer == null)
-        return null;
-
-      IEnumerable<Type> usedTypes;
-      byte[] jobByteArray;
-      if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.Experiment) {
-        OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone(); // use a cloned job, so that the childHiveJob don't get confused
-        clonedJob.OptimizerAsExperiment.Optimizers.Clear();
-        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.BatchRun) {
-        OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone();
-        clonedJob.OptimizerAsBatchRun.Optimizer = null;
-        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
-      } else if (this.OptimizerJob.Optimizer is IAlgorithm) {
-        ((IAlgorithm)this.OptimizerJob.Optimizer).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
-        jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob, out usedTypes);
-      } else {
-        jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob, out usedTypes);
-      }
-
-      JobData jobData = new JobData() {
-        JobId = job.Id,
-        Data = jobByteArray
-      };
-
-      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
-
-      return jobData;
-    }
-
-
-    #region Events
-    public event EventHandler JobChanged;
-    private void OnJobChanged() {
-      LogMessage("JobChanged");
-      EventHandler handler = JobChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler JobStateChanged;
-    private void OnJobStateChanged() {
-      LogMessage("JobStateChanged (State: " + this.Job.State + ", ExecutionTime: " + this.Job.ExecutionTime.ToString() + ")");
-      EventHandler handler = JobStateChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler OptimizerJobChanged;
-    private void OnOptimizerJobChanged() {
-      OptimizerJob_ComputeInParallelChanged(this, EventArgs.Empty);
-      var handler = OptimizerJobChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler IsFinishedOptimizerDownloadedChanged;
-    private void OnIsFinishedOptimizerDownloadedChanged() {
-      var handler = IsFinishedOptimizerDownloadedChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    #endregion
-
-    public void LogMessage(string message) {
-      lock (locker) {
-        if (optimizerJob != null) {
-          optimizerJob.Log.LogMessage(message);
-        }
-      }
-    }
-
-    /// <summary>
-    /// Returns a list of HiveJobs including this and all its child-jobs recursively
-    /// </summary>
-    public IEnumerable<HiveJob> GetAllHiveJobs() {
-      List<HiveJob> jobs = new List<HiveJob>();
-      jobs.Add(this);
-      foreach (HiveJob child in this.ChildHiveJobs) {
-        jobs.AddRange(child.GetAllHiveJobs());
-      }
-      return jobs;
-    }
-
-    public HiveJob GetParentByJobId(Guid jobId) {
-      if (this.ChildHiveJobs.SingleOrDefault(j => j.job.Id == jobId) != null)
-        return this;
-      foreach (HiveJob child in this.childHiveJobs) {
-        HiveJob result = child.GetParentByJobId(jobId);
-        if (result != null)
-          return result;
-      }
-      return null;
-    }
-
-
-    public HiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
-      foreach (var child in ChildHiveJobs) {
-        if (child.OptimizerJob == optimizerJob)
-          return child;
-      }
-      return null;
-    }
-
-
-    public HiveJob GetChildByOptimizer(IOptimizer optimizer) {
-      foreach (var child in ChildHiveJobs) {
-        if (child.OptimizerJob.Optimizer == optimizer)
-          return child;
-      }
-      return null;
-    }
-
-    /// <summary>
-    /// Searches for an HiveJob object with the correct jobId recursively
-    /// </summary>
-    public HiveJob GetHiveJobByJobId(Guid jobId) {
-      if (this.Job.Id == jobId) {
-        return this;
-      } else {
-        foreach (HiveJob child in this.ChildHiveJobs) {
-          HiveJob result = child.GetHiveJobByJobId(jobId);
-          if (result != null)
-            return result;
-        }
-      }
-      return null;
-    }
-
-
-    public void RemoveByJobId(Guid jobId) {
-      IEnumerable<HiveJob> jobs = ChildHiveJobs.Where(j => j.Job.Id == jobId).ToList(); // if Guid.Empty needs to be removed, there could be more than one with this jobId
-      foreach (HiveJob j in jobs) {
-        this.childHiveJobs.Remove(j);
-      }
-      foreach (HiveJob child in ChildHiveJobs) {
-        child.RemoveByJobId(jobId);
-      }
-    }
-
-    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
-
-    public void Pause() {
-      ServiceLocator.Instance.CallHiveService(s => s.PauseJob(this.job.Id));
-    }
-
-    public void Stop() {
-      ServiceLocator.Instance.CallHiveService(s => s.StopJob(this.job.Id));
-    }
-
-    public void Restart() {
-      ServiceLocator.Instance.CallHiveService(service => {
-        JobData jobData = new JobData();
-        jobData.JobId = this.job.Id;
-        jobData.Data = PersistenceUtil.Serialize(this.optimizerJob);
-        service.UpdateJobData(this.Job, jobData);
-        service.RestartJob(this.job.Id);
-        Job job = service.GetJob(this.job.Id);
-        this.job.LastJobDataUpdate = job.LastJobDataUpdate;
-      });
-    }
-  }
-}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs	(revision 6033)
@@ -4,4 +4,7 @@
 using System.Threading;
 using System.Threading.Tasks;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Hive;
 
 namespace HeuristicLab.Clients.Hive {
@@ -86,5 +89,12 @@
         Job job = ServiceLocator.Instance.CallHiveService(s => s.GetJob(jobData.JobId));
         if (abort || job == null || jobData == null) return null;
-        HiveJob hiveJob = new HiveJob(job, jobData, false);
+
+        HiveJob hiveJob;
+        var itemJob = PersistenceUtil.Deserialize<ItemJob>(jobData.Data);
+        if (itemJob is OptimizerJob) {
+          hiveJob = new OptimizerHiveJob((OptimizerJob)itemJob);
+        } else {
+          hiveJob = new HiveJob(itemJob, true);
+        }
         jobData.Data = null; // reduce memory consumption.
         hiveJob.Job = job;
Index: anches/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 6032)
+++ 	(revision )
@@ -1,9 +1,0 @@
-﻿using System.Collections.Generic;
-using HeuristicLab.Collections;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Clients.Hive {
-  public interface IItemTree : INamedItem, INotifyObservableCollectionItemsChanged<IItemTree> {
-    IEnumerable<IItemTree> GetChildItems();
-  }
-}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs	(revision 6033)
@@ -0,0 +1,361 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager {
+  public class OptimizerHiveJob : HiveJob<OptimizerJob> {
+
+    #region Constructors and Cloning
+    public OptimizerHiveJob() { }
+    public OptimizerHiveJob(IOptimizer optimizer)
+      : this() {
+      this.JobItem = new OptimizerJob(optimizer);
+    }
+    public OptimizerHiveJob(OptimizerJob optimizerJob)
+      : this() {
+      this.JobItem = optimizerJob;
+    }
+    protected OptimizerHiveJob(OptimizerHiveJob original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OptimizerHiveJob(this, cloner);
+    }
+    #endregion
+
+    /// <summary>
+    /// if this.Optimizer is an experiment
+    ///   Uses the child-optimizers of this.HiveJob and creates HiveJob-childs
+    /// if this.Optimizer is a batchrun
+    ///   Creates a number of child-jobs according to repetitions
+    /// </summary>
+    protected override void UpdateChildHiveJobs() {
+      base.UpdateChildHiveJobs();
+      if (Job != null && syncJobsWithOptimizers) {
+        if (!JobItem.ComputeInParallel) {
+          this.childHiveJobs.Clear();
+        } else {
+          if (JobItem.Item is Optimization.Experiment) {
+            Optimization.Experiment experiment = (Optimization.Experiment)JobItem.Item;
+            foreach (IOptimizer childOpt in experiment.Optimizers) {
+              this.childHiveJobs.Add(new OptimizerHiveJob(childOpt));
+            }
+          } else if (JobItem.Item is Optimization.BatchRun) {
+            Optimization.BatchRun batchRun = JobItem.OptimizerAsBatchRun;
+            if (batchRun.Optimizer != null) {
+              while (this.childHiveJobs.Count < batchRun.Repetitions) {
+                this.childHiveJobs.Add(new OptimizerHiveJob(batchRun.Optimizer));
+              }
+              while (this.childHiveJobs.Count > batchRun.Repetitions) {
+                this.childHiveJobs.Remove(this.childHiveJobs.Last());
+              }
+            }
+          }
+        }
+      }
+    }
+
+    protected override void RegisterJobItemEvents() {
+      base.RegisterJobItemEvents();
+      if (JobItem != null) {
+        if (JobItem.Item is Optimization.Experiment) {
+          Optimization.Experiment experiment = JobItem.OptimizerAsExperiment;
+          experiment.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+          experiment.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+          experiment.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+          experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+        } else if (JobItem.Item is Optimization.BatchRun) {
+          Optimization.BatchRun batchRun = JobItem.OptimizerAsBatchRun;
+          batchRun.RepetitionsChanged += new EventHandler(batchRun_RepetitionsChanged);
+          batchRun.OptimizerChanged += new EventHandler(batchRun_OptimizerChanged);
+        }
+      }
+    }
+    protected override void DergisterJobItemsEvents() {
+      base.DergisterJobItemsEvents();
+      if (JobItem != null) {
+        if (JobItem.Item is Optimization.Experiment) {
+          Optimization.Experiment experiment = JobItem.OptimizerAsExperiment;
+          experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+          experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+          experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+          experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+        } else if (JobItem.Item is Optimization.BatchRun) {
+          Optimization.BatchRun batchRun = JobItem.OptimizerAsBatchRun;
+          batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged);
+          batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged);
+        }
+      }
+    }
+
+    private void batchRun_OptimizerChanged(object sender, EventArgs e) {
+      if (syncJobsWithOptimizers) {
+        UpdateChildHiveJobs();
+      }
+    }
+
+    private void batchRun_RepetitionsChanged(object sender, EventArgs e) {
+      if (syncJobsWithOptimizers) {
+        UpdateChildHiveJobs();
+      }
+    }
+
+    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.JobItem.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+            this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
+          }
+        }
+      }
+    }
+    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.JobItem.ComputeInParallel) {
+        foreach (var item in e.OldItems) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+        foreach (var item in e.Items) {
+          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+            this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
+          }
+        }
+      }
+    }
+    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.JobItem.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+      }
+    }
+    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.JobItem.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+      }
+    }
+
+    /// <summary>
+    /// if this.Optimizer is Experiment
+    ///   replace the child-optimizer in the experiment
+    /// if this.Optimizer is BatchRun
+    ///   add the runs from the optimizerJob to the batchrun and replace the Optimizer
+    /// </summary>
+    public void UpdateChildOptimizer(OptimizerJob optimizerJob, Guid childJobId) {
+      syncJobsWithOptimizers = false; // don't sync with optimizers during this method
+
+      if (this.JobItem != null && this.JobItem.Item != null) {
+        if (this.JobItem.Item is Optimization.Experiment) {
+          UpdateOptimizerInExperiment(this.JobItem.OptimizerAsExperiment, optimizerJob);
+        } else if (this.JobItem.Item is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.JobItem.OptimizerAsBatchRun, optimizerJob);
+        }
+      }
+
+      OptimizerHiveJob child = (OptimizerHiveJob)this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
+      if (!optimizerJob.ComputeInParallel) {
+        child.syncJobsWithOptimizers = false;
+        child.JobItem = optimizerJob;
+        child.syncJobsWithOptimizers = true;
+      }
+      syncJobsWithOptimizers = true;
+    }
+
+    /// <summary>
+    /// Adds the runs from the optimizerJob to the batchrun and replaces the Optimizer 
+    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+    /// </summary>
+    private void UpdateOptimizerInBatchRun(BatchRun batchRun, OptimizerJob optimizerJob) {
+      if (batchRun.Optimizer == null) {
+        batchRun.Optimizer = (IOptimizer)optimizerJob.Item; // only set the first optimizer as Optimizer. if every time the Optimizer would be set, the runs would be cleared each time
+      }
+      foreach (IRun run in optimizerJob.Item.Runs) {
+        if (!batchRun.Runs.Contains(run)) {
+          run.Name = GetNewRunName(run, batchRun.Runs);
+          batchRun.Runs.Add(run);
+        }
+      }
+    }
+
+    /// <summary>
+    /// replace the child-optimizer in the experiment
+    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+    /// </summary>
+    private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerJob optimizerJob) {
+      if (optimizerJob.IndexInParentOptimizerList < 0)
+        throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Job is invalid and the optimizer-tree cannot be reassembled.");
+
+      while (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList) {
+        experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerJob at the correct position
+      }
+      if (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList + 1) {
+        experiment.Optimizers.Add(optimizerJob.Item);
+      } else {
+        // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder)
+        // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted
+        if (!optimizerJob.ComputeInParallel || experiment.Optimizers[optimizerJob.IndexInParentOptimizerList].Name == "Placeholder") {
+          experiment.Optimizers[optimizerJob.IndexInParentOptimizerList] = optimizerJob.Item;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Sets the IndexInParentOptimizerList property of the OptimizerJob
+    /// according to the position in the OptimizerList of the parentHiveJob.Job
+    /// Recursively updates all the child-jobs as well
+    /// </summary>
+    internal void SetIndexInParentOptimizerList(OptimizerHiveJob parentHiveJob) {
+      if (parentHiveJob != null) {
+        if (parentHiveJob.JobItem.Item is Optimization.Experiment) {
+          this.JobItem.IndexInParentOptimizerList = parentHiveJob.JobItem.OptimizerAsExperiment.Optimizers.IndexOf(this.JobItem.Item);
+        } else if (parentHiveJob.JobItem.Item is Optimization.BatchRun) {
+          this.JobItem.IndexInParentOptimizerList = 0;
+        } else {
+          throw new NotSupportedException("Only Experiment and BatchRuns are supported");
+        }
+      }
+      foreach (OptimizerHiveJob child in childHiveJobs) {
+        child.SetIndexInParentOptimizerList(this);
+      }
+    }
+
+    public override void AddChildHiveJob(HiveJob hiveJob) {
+      base.AddChildHiveJob(hiveJob);
+      var optimizerHiveJob = (OptimizerHiveJob)hiveJob;
+      syncJobsWithOptimizers = false;
+      if (this.JobItem != null && optimizerHiveJob.JobItem != null) {
+        // if job is in state Paused, it has to preserve its ResultCollection, which is cleared when a optimizer is added to an experiment
+        OptimizerJob optimizerJobClone = null;
+        if (optimizerHiveJob.Job.State == JobState.Paused) {
+          optimizerJobClone = (OptimizerJob)optimizerHiveJob.JobItem.Clone();
+        }
+
+        if (this.JobItem.Item is Optimization.Experiment) {
+          if (!this.JobItem.OptimizerAsExperiment.Optimizers.Contains(optimizerHiveJob.JobItem.Item)) {
+            UpdateOptimizerInExperiment(this.JobItem.OptimizerAsExperiment, optimizerHiveJob.JobItem);
+          }
+        } else if (this.JobItem.Item is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.JobItem.OptimizerAsBatchRun, optimizerHiveJob.JobItem);
+        }
+
+        if (optimizerHiveJob.Job.State == JobState.Paused) {
+          optimizerHiveJob.JobItem = optimizerJobClone;
+        }
+      }
+      syncJobsWithOptimizers = true;
+    }
+
+    /// <summary>
+    /// Creates a JobData object containing the Job and the IJob-Object as byte[]
+    /// </summary>
+    /// <param name="withoutChildOptimizers">
+    ///   if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
+    /// </param>
+    public override JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
+      plugins = new List<IPluginDescription>();
+      if (this.jobItem == null) // || this.jobItem.Optimizer == null
+        return null;
+
+      IEnumerable<Type> usedTypes;
+      byte[] jobByteArray;
+      if (withoutChildOptimizers && this.JobItem.Item is Optimization.Experiment) {
+        OptimizerJob clonedJob = (OptimizerJob)this.JobItem.Clone(); // use a cloned job, so that the childHiveJob don't get confused
+        clonedJob.OptimizerAsExperiment.Optimizers.Clear();
+        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
+      } else if (withoutChildOptimizers && this.JobItem.Item is Optimization.BatchRun) {
+        OptimizerJob clonedJob = (OptimizerJob)this.JobItem.Clone();
+        clonedJob.OptimizerAsBatchRun.Optimizer = null;
+        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
+      } else if (this.JobItem.Item is IAlgorithm) {
+        ((IAlgorithm)this.JobItem.Item).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
+        jobByteArray = PersistenceUtil.Serialize(this.JobItem, out usedTypes);
+      } else {
+        jobByteArray = PersistenceUtil.Serialize(this.JobItem, out usedTypes);
+      }
+
+      JobData jobData = new JobData() {
+        JobId = job.Id,
+        Data = jobByteArray
+      };
+
+      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+
+      return jobData;
+    }
+
+    public OptimizerHiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
+      foreach (OptimizerHiveJob child in ChildHiveJobs) {
+        if (child.JobItem == optimizerJob)
+          return child;
+      }
+      return null;
+    }
+
+    public HiveJob<OptimizerJob> GetChildByOptimizer(IOptimizer optimizer) {
+      foreach (OptimizerHiveJob child in ChildHiveJobs) {
+        if (child.JobItem.Item == optimizer)
+          return child;
+      }
+      return null;
+    }
+
+    #region Helpers
+    /// <summary>
+    /// Parses the run numbers out of runs and renames the run to the next number
+    /// </summary>
+    private static string GetNewRunName(IRun run, RunCollection runs) {
+      int idx = run.Name.IndexOf("Run ") + 4;
+
+      if (idx == -1 || runs.Count == 0)
+        return run.Name;
+
+      int maxRunNumber = int.MinValue;
+      foreach (IRun r in runs) {
+        int number = GetRunNumber(r.Name);
+        maxRunNumber = Math.Max(maxRunNumber, number);
+      }
+
+      return run.Name.Substring(0, idx) + (maxRunNumber + 1).ToString();
+    }
+
+    /// <summary>
+    /// Parses the number of a Run out of its name. Example "Genetic Algorithm Run 3" -> 3
+    /// </summary>
+    private static int GetRunNumber(string runName) {
+      int idx = runName.IndexOf("Run ") + 4;
+      if (idx == -1) {
+        return 0;
+      } else {
+        return int.Parse(runName.Substring(idx, runName.Length - idx));
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6033)
@@ -0,0 +1,346 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Clients.Hive.ExperimentManager;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Clients.Hive {
+  [StorableClass]
+  public class RefreshableHiveExperiment : IHiveItem, IDeepCloneable, IContent, IProgressReporter {
+    private JobResultPoller jobResultPoller;
+
+    [Storable]
+    private HiveExperiment hiveExperiment;
+    public HiveExperiment HiveExperiment {
+      get { return hiveExperiment; }
+      set {
+        if (value != hiveExperiment) {
+          if (value == null)
+            throw new ArgumentNullException();
+
+          if (hiveExperiment != null) DergisterHiveExperimentEvents();
+          hiveExperiment = value;
+          if (hiveExperiment != null) RegisterHiveExperimentEvents();
+          OnHiveExperimentChanged();
+        }
+      }
+    }
+
+    /** include jobs when refreshing **/
+    [Storable]
+    private bool includeJobs;
+    public bool IncludeJobs {
+      get { return includeJobs; }
+      set { includeJobs = value; }
+    }
+
+    [Storable]
+    private bool refreshAutomatically;
+    public bool RefreshAutomatically {
+      get { return refreshAutomatically; }
+      set {
+        if (refreshAutomatically != value) {
+          refreshAutomatically = value;
+          OnRefreshAutomaticallyChanged();
+          if (RefreshAutomatically) {
+            StartResultPolling();
+          } else {
+            StopResultPolling();
+          }
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    public RefreshableHiveExperiment() {
+      this.includeJobs = true;
+      this.refreshAutomatically = true;
+      this.HiveExperiment = new HiveExperiment();
+    }
+    public RefreshableHiveExperiment(HiveExperiment hiveExperiment) {
+      this.includeJobs = true;
+      this.refreshAutomatically = true;
+      this.HiveExperiment = hiveExperiment;
+    }
+    protected RefreshableHiveExperiment(RefreshableHiveExperiment original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      this.HiveExperiment = original.HiveExperiment;
+      this.RefreshAutomatically = original.RefreshAutomatically;
+      this.IncludeJobs = original.IncludeJobs;
+    }
+    public IDeepCloneable Clone(Cloner cloner) {
+      return new RefreshableHiveExperiment(this, cloner);
+    }
+    public object Clone() {
+      return this.Clone(new Cloner());
+    }
+    #endregion
+
+    //public Experiment GetExperiment(int idx) {
+    //  if (hiveExperiment.HiveJobs != null) {
+    //    var hj = hiveExperiment.HiveJobs.ElementAtOrDefault(idx);
+    //    if (hj != null)
+    //      return ((OptimizerHiveJob)hj).JobItem.OptimizerAsExperiment;
+    //  }
+    //  return null;
+    //}
+
+    //public void AddExperiment(Experiment experiment) {
+    //  if (hiveExperiment.HiveJobs == null)
+    //    hiveExperiment.HiveJobs = new ItemCollection<HiveJob>();
+    //  hiveExperiment.HiveJobs.Add(new OptimizerHiveJob(experiment));
+    //}
+
+    //public void SetExperiment(Experiment experiment) {
+    //  if (hiveExperiment.HiveJobs == null)
+    //    hiveExperiment.HiveJobs = new ItemCollection<HiveJob>();
+    //  else
+    //    hiveExperiment.HiveJobs.Clear();
+    //  hiveExperiment.HiveJobs.Add(new OptimizerHiveJob(experiment));
+    //}
+
+    private void hiveExperiment_HiveJobsChanged(object sender, EventArgs e) {
+      if (jobResultPoller != null && jobResultPoller.IsPolling) {
+        jobResultPoller.Stop();
+        DeregisterResultPollingEvents();
+      }
+      if (hiveExperiment.HiveJobs != null && hiveExperiment.HiveJobs.Count > 0 && hiveExperiment.GetAllHiveJobs().All(x => x.Job.Id != Guid.Empty)) {
+        if (this.RefreshAutomatically)
+          StartResultPolling();
+      }
+    }
+
+    #region JobResultPoller Events
+
+    public void StartResultPolling() {
+      if (jobResultPoller == null) {
+        jobResultPoller = new JobResultPoller(hiveExperiment.HiveJobs, /*ApplicationConstants.ResultPollingInterval*/new TimeSpan(0, 0, 5)); //TODO: find a better place for ApplicationConstants
+        RegisterResultPollingEvents();
+      }
+
+      if (!jobResultPoller.IsPolling) {
+        jobResultPoller.Start();
+      }
+    }
+
+    public void StopResultPolling() {
+      if (jobResultPoller != null && jobResultPoller.IsPolling) {
+        jobResultPoller.Stop();
+      }
+    }
+
+    private void RegisterResultPollingEvents() {
+      jobResultPoller.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
+      jobResultPoller.JobResultsReceived += new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
+      jobResultPoller.IsPollingChanged += new EventHandler(jobResultPoller_IsPollingChanged);
+    }
+    private void DeregisterResultPollingEvents() {
+      jobResultPoller.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
+      jobResultPoller.JobResultsReceived -= new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
+      jobResultPoller.IsPollingChanged -= new EventHandler(jobResultPoller_IsPollingChanged);
+    }
+    private void jobResultPoller_IsPollingChanged(object sender, EventArgs e) {
+      this.refreshAutomatically = jobResultPoller.IsPolling;
+      OnRefreshAutomaticallyChanged();
+    }
+    private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightJob>> e) {
+      foreach (LightweightJob lightweightJob in e.Value) {
+        OptimizerHiveJob hj = GetHiveJobById(lightweightJob.Id);
+        if (hj != null) {
+          DateTime lastJobDataUpdate = hj.Job.LastJobDataUpdate;
+          hj.UpdateFromLightweightJob(lightweightJob);
+
+          // lastJobDataUpdate equals DateTime.MinValue right after it was uploaded. When the first results are polled, this value is updated
+          if (lastJobDataUpdate != DateTime.MinValue && lastJobDataUpdate < hj.Job.LastJobDataUpdate) {
+            OptimizerJob optimizerJob = ExperimentManagerClient.LoadOptimizerJob(hj.Job.Id);
+            if (optimizerJob == null) {
+              // something bad happened to this job. bad job, BAAAD job!
+            } else {
+              // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
+              if (hj.Job.State == JobState.Paused) {
+                hj.JobItem = optimizerJob;
+              } else {
+                if (lightweightJob.ParentJobId.HasValue) {
+                  OptimizerHiveJob parentHiveJob = GetHiveJobById(lightweightJob.ParentJobId.Value);
+                  parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.Job.Id);
+                }
+              }
+            }
+          }
+        }
+      }
+      GC.Collect(); // force GC, because .NET is too lazy here (deserialization takes a lot of memory)
+      if (AllJobsFinished()) {
+        hiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
+        StopResultPolling();
+      }
+      UpdateTotalExecutionTime();
+      UpdateStats();
+    }
+
+    public OptimizerHiveJob GetHiveJobById(Guid jobId) {
+      foreach (OptimizerHiveJob job in hiveExperiment.HiveJobs) {
+        var hj = job.GetHiveJobByJobId(jobId) as OptimizerHiveJob;
+        if (hj != null)
+          return hj;
+      }
+      return null;
+    }
+
+    private void UpdateStats() {
+      var jobs = hiveExperiment.GetAllHiveJobs();
+      hiveExperiment.JobCount = jobs.Count();
+      hiveExperiment.CalculatingCount = jobs.Count(j => j.Job.State == JobState.Calculating);
+      hiveExperiment.FinishedCount = jobs.Count(j => j.Job.State == JobState.Finished);
+    }
+
+    public bool AllJobsFinished() {
+      return hiveExperiment.GetAllHiveJobs().All(j => j.Job.State == JobState.Finished
+                                            || j.Job.State == JobState.Aborted
+                                            || j.Job.State == JobState.Failed);
+    }
+
+    private void jobResultPoller_ExceptionOccured(object sender, EventArgs<Exception> e) {
+      //OnExceptionOccured(e.Value);
+    }
+
+    public void UpdateTotalExecutionTime() {
+      hiveExperiment.ExecutionTime = TimeSpan.FromMilliseconds(hiveExperiment.GetAllHiveJobs().Sum(x => x.Job.ExecutionTime.HasValue ? x.Job.ExecutionTime.Value.TotalMilliseconds : 0));
+    }
+
+    public void OnLoaded() {
+      this.UpdateTotalExecutionTime();
+
+      if (hiveExperiment.ExecutionState != ExecutionState.Stopped) {
+        this.RefreshAutomatically = true;
+      }
+    }
+    #endregion
+
+    private void RegisterHiveExperimentEvents() {
+      hiveExperiment.HiveJobsChanged += new EventHandler(hiveExperiment_HiveJobsChanged);
+      hiveExperiment.ToStringChanged += new EventHandler(hiveExperiment_ToStringChanged);
+      hiveExperiment.PropertyChanged += new PropertyChangedEventHandler(hiveExperiment_PropertyChanged);
+      hiveExperiment.ItemImageChanged += new EventHandler(hiveExperiment_ItemImageChanged);
+      hiveExperiment.ModifiedChanged += new EventHandler(hiveExperiment_ModifiedChanged);
+      hiveExperiment.IsProgressingChanged += new EventHandler(hiveExperiment_IsProgressingChanged);
+    }
+
+    private void DergisterHiveExperimentEvents() {
+      hiveExperiment.HiveJobsChanged -= new EventHandler(hiveExperiment_HiveJobsChanged);
+      hiveExperiment.ToStringChanged -= new EventHandler(hiveExperiment_ToStringChanged);
+      hiveExperiment.PropertyChanged -= new PropertyChangedEventHandler(hiveExperiment_PropertyChanged);
+      hiveExperiment.ItemImageChanged -= new EventHandler(hiveExperiment_ItemImageChanged);
+      hiveExperiment.ModifiedChanged -= new EventHandler(hiveExperiment_ModifiedChanged);
+      hiveExperiment.IsProgressingChanged -= new EventHandler(hiveExperiment_IsProgressingChanged);
+    }
+    
+    #region Events
+    public event EventHandler RefreshAutomaticallyChanged;
+    private void OnRefreshAutomaticallyChanged() {
+      var handler = RefreshAutomaticallyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler HiveExperimentChanged;
+    private void OnHiveExperimentChanged() {
+      var handler = HiveExperimentChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ModifiedChanged;
+    private void hiveExperiment_ModifiedChanged(object sender, EventArgs e) {
+      var handler = ModifiedChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public event EventHandler ItemImageChanged;
+    private void hiveExperiment_ItemImageChanged(object sender, EventArgs e) {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(this, e);
+    }
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    private void hiveExperiment_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public event EventHandler ToStringChanged;
+    private void hiveExperiment_ToStringChanged(object sender, EventArgs e) {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, e);
+    }
+
+    public event EventHandler IsProgressingChanged;
+    private void hiveExperiment_IsProgressingChanged(object sender, EventArgs e) {
+      var handler = IsProgressingChanged;
+      if (handler != null) handler(sender, e);
+    }
+    #endregion
+
+    public Guid Id {
+      get { return hiveExperiment.Id; }
+      set { hiveExperiment.Id = value; }
+    }
+    public bool Modified {
+      get { return hiveExperiment.Modified; }
+    }
+    public void Store() {
+      hiveExperiment.Store() ;
+    }
+    public string ItemDescription {
+      get { return hiveExperiment.ItemDescription; }
+    }
+    public Image ItemImage {
+      get { return hiveExperiment.ItemImage; }
+    }
+    public string ItemName {
+      get { return hiveExperiment.ItemName; }
+    }
+    public Version ItemVersion {
+      get { return hiveExperiment.ItemVersion; }
+    }
+
+
+    #region IProgressReporter Members
+    public IProgress Progress {
+      get { return HiveExperiment.Progress; }
+    }
+
+    public bool IsProgressing {
+      get { return HiveExperiment.IsProgressing; }
+    }
+    #endregion
+
+    public override string ToString() {
+      return HiveExperiment.ToString();
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTree.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTree.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTree.cs	(revision 6033)
@@ -0,0 +1,10 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Hive {
+  public interface IItemTree<T> : INamedItem, INotifyObservableCollectionItemsChanged<IItemTree<T>> where T : IItemTree<T> {
+    IEnumerable<IItemTree<T>> GetChildItems();
+    ICollection<IItemTreeNodeAction<T>> Actions { get; }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTreeAction.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTreeAction.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/TreeView/IItemTreeAction.cs	(revision 6033)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+
+namespace HeuristicLab.Clients.Hive {
+  public interface IItemTreeNodeAction<T> where T : IItemTree<T> {
+    string Name { get; }
+    Image Image { get; }
+    void Execute(T item, T parentItem);
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6033)
@@ -122,5 +122,9 @@
     <Compile Include="ExperimentManager\ExperimentManagerClient.cs" />
     <Compile Include="ExperimentManager\HiveJobDownloader.cs" />
-    <Compile Include="ExperimentManager\IItemTree.cs" />
+    <Compile Include="ExperimentManager\TreeView\IItemTree.cs" />
+    <Compile Include="ExperimentManager\TreeView\IItemTreeAction.cs" />
+    <Compile Include="ExperimentManager\OptimizerHiveJob.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="ExperimentManager\PluginClient.cs" />
     <Compile Include="Exceptions\ResourceNotFoundException.cs" />
@@ -146,4 +150,6 @@
     <Compile Include="ServiceClients\HiveItem.cs" />
     <Compile Include="ServiceClients\JobData.cs" />
+    <Compile Include="ServiceClients\OperationJob.cs" />
+    <Compile Include="ExperimentManager\RefreshableHiveExperiment.cs" />
     <Compile Include="ServiceClients\Plugin.cs" />
     <Compile Include="ServiceClients\PluginData.cs" />
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame	(revision 6033)
@@ -8,6 +8,12 @@
   [Plugin("HeuristicLab.Clients.Hive", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Clients.Hive-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Hive", "3.4")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabClientsHivePlugin : PluginBase {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6033)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -32,21 +31,12 @@
   [Item("Optimizer Job", "Represents Job which executes a IOptimizer object.")]
   [StorableClass]
-  public class OptimizerJob : AbstractJob {
+  public class OptimizerJob : ItemJob {
     public override bool IsParallelizable {
-      get { return this.Optimizer is Optimization.Experiment || this.Optimizer is BatchRun; }
+      get { return this.Item is Experiment || this.Item is BatchRun; }
     }
 
-    [Storable]
-    protected IOptimizer optimizer;
-    public IOptimizer Optimizer {
-      get { return optimizer; }
-      set {
-        if (value != optimizer) {
-          if (optimizer != null) DeregisterOptimizerEvents();
-          optimizer = value;
-          if (optimizer != null) RegisterOptimizerEvents();
-          OnOptimizerChanged();
-        }
-      }
+    public new IOptimizer Item {
+      get { return (IOptimizer)base.Item; }
+      set { base.Item = value; }
     }
 
@@ -58,14 +48,12 @@
     }
 
-    public OptimizerJob() : base() {
-      
-    }
+    public OptimizerJob() : base() { }
     public OptimizerJob(IOptimizer optimizer)
       : this() {
-      this.Optimizer = optimizer;
+        this.Item = optimizer;
 
-      if (optimizer is Optimization.Experiment) {
+      if (optimizer is Experiment) {
         this.ComputeInParallel = true;
-      } else if (optimizer is Optimization.BatchRun) {
+      } else if (optimizer is BatchRun) {
         this.ComputeInParallel = false;
       } else {
@@ -77,8 +65,6 @@
     protected OptimizerJob(OptimizerJob original, Cloner cloner)
       : base(original, cloner) {
-      this.Optimizer = cloner.Clone(original.Optimizer);
       this.IndexInParentOptimizerList = original.IndexInParentOptimizerList;
       this.CollectChildJobs = original.CollectChildJobs;
-      this.RegisterOptimizerEvents();
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -86,14 +72,9 @@
     }
 
-    [StorableHook(HookType.AfterDeserialization)]
-    protected virtual void AfterDeserialization() {
-      RegisterOptimizerEvents();
-    }
-
     /// <summary>
     /// Casts the Optimizer to an Experiment. Returns null if cast was not successfull.
     /// </summary>
-    public Optimization.Experiment OptimizerAsExperiment {
-      get { return Optimizer as Optimization.Experiment; }
+    public Experiment OptimizerAsExperiment {
+      get { return Item as Experiment; }
     }
 
@@ -101,6 +82,6 @@
     /// Casts the Optimizer to an BatchRun. Returns null if cast was not successfull.
     /// </summary>
-    public Optimization.BatchRun OptimizerAsBatchRun {
-      get { return Optimizer as Optimization.BatchRun; }
+    public BatchRun OptimizerAsBatchRun {
+      get { return Item as BatchRun; }
     }
 
@@ -108,30 +89,30 @@
 
     public override ExecutionState ExecutionState {
-      get { return optimizer.ExecutionState; }
+      get { return Item.ExecutionState; }
     }
 
     public override TimeSpan ExecutionTime {
-      get { return optimizer.ExecutionTime; }
+      get { return Item.ExecutionTime; }
     }
 
     public override void Prepare() {
-      optimizer.Prepare();
+      Item.Prepare();
     }
 
     public override void Start() {
-      if ((optimizer is Optimization.Experiment && OptimizerAsExperiment.Optimizers.Count == 0) || // experiment would not fire OnStopped if it has 0 optimizers
-          (optimizer is Optimization.BatchRun && OptimizerAsBatchRun.Optimizer == null)) { // batchrun would not fire OnStopped if algorithm == null
+      if ((Item is Experiment && OptimizerAsExperiment.Optimizers.Count == 0) || // experiment would not fire OnStopped if it has 0 optimizers
+          (Item is BatchRun && OptimizerAsBatchRun.Optimizer == null)) { // batchrun would not fire OnStopped if algorithm == null
         OnJobStopped();
       } else {
-        optimizer.Start();
+        Item.Start();
       }
     }
 
     public override void Pause() {
-      optimizer.Pause();
+      Item.Pause();
     }
 
     public override void Stop() {
-      optimizer.Stop();
+      Item.Stop();
     }
 
@@ -142,28 +123,22 @@
 
     #region Optimizer Events
-    protected virtual void RegisterOptimizerEvents() {
-      optimizer.Stopped += new EventHandler(optimizer_Stopped);
-      optimizer.Paused += new EventHandler(optimizer_Paused);
-      optimizer.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
-      optimizer.DescriptionChanged += new EventHandler(optimizer_DescriptionChanged);
-      optimizer.ItemImageChanged += new EventHandler(optimizer_ItemImageChanged);
-      optimizer.NameChanged += new EventHandler(optimizer_NameChanged);
-      optimizer.NameChanging += new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
-      optimizer.ToStringChanged += new EventHandler(optimizer_ToStringChanged);
+    protected override void RegisterItemEvents() {
+      base.RegisterItemEvents();
+      Item.Stopped += new EventHandler(optimizer_Stopped);
+      Item.Paused += new EventHandler(optimizer_Paused);
+      Item.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      Item.DescriptionChanged += new EventHandler(optimizer_DescriptionChanged);
+      Item.NameChanged += new EventHandler(optimizer_NameChanged);
+      Item.NameChanging += new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
     }
 
     protected virtual void DeregisterOptimizerEvents() {
-      optimizer.Stopped -= new EventHandler(optimizer_Stopped);
-      optimizer.Paused -= new EventHandler(optimizer_Paused);
-      optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
-      optimizer.DescriptionChanged -= new EventHandler(optimizer_DescriptionChanged);
-      optimizer.ItemImageChanged -= new EventHandler(optimizer_ItemImageChanged);
-      optimizer.NameChanged -= new EventHandler(optimizer_NameChanged);
-      optimizer.NameChanging -= new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
-      optimizer.ToStringChanged -= new EventHandler(optimizer_ToStringChanged);
-    }
-
-    protected void optimizer_ToStringChanged(object sender, EventArgs e) {
-      this.OnToStringChanged();
+      Item.Stopped -= new EventHandler(optimizer_Stopped);
+      Item.Paused -= new EventHandler(optimizer_Paused);
+      Item.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      Item.DescriptionChanged -= new EventHandler(optimizer_DescriptionChanged);
+      Item.NameChanged -= new EventHandler(optimizer_NameChanged);
+      Item.NameChanging -= new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
+      base.DeregisterItemEvents();
     }
 
@@ -174,8 +149,4 @@
     protected void optimizer_NameChanged(object sender, EventArgs e) {
       this.OnNameChanged();
-    }
-
-    protected void optimizer_ItemImageChanged(object sender, EventArgs e) {
-      this.OnItemImageChanged();
     }
 
@@ -198,40 +169,20 @@
 
     #region INamedItem Members
-
     public override bool CanChangeDescription {
-      get { return optimizer.CanChangeDescription; }
+      get { return Item.CanChangeDescription; }
     }
 
     public override bool CanChangeName {
-      get { return optimizer.CanChangeName; }
+      get { return Item.CanChangeName; }
     }
 
     public override string Description {
-      get { return optimizer.Description; }
-      set { optimizer.Description = value; }
+      get { return Item.Description; }
+      set { Item.Description = value; }
     }
 
     public override string Name {
-      get { return optimizer.Name; }
-      set { optimizer.Name = value; }
-    }
-    #endregion
-    
-    #region IItem Members
-
-    public override string ItemDescription {
-      get { return optimizer.ItemDescription; }
-    }
-
-    public override Image ItemImage {
-      get { return optimizer.ItemImage; }
-    }
-
-    public override string ItemName {
-      get { return optimizer.ItemName; }
-    }
-
-    public override Version ItemVersion {
-      get { return optimizer.ItemVersion; }
+      get { return Item.Name; }
+      set { Item.Name = value; }
     }
     #endregion
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs	(revision 6033)
@@ -24,8 +24,6 @@
 using System.ComponentModel;
 using System.Linq;
-using HeuristicLab.Clients.Hive.Jobs;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -33,6 +31,4 @@
   [StorableClass]
   public partial class HiveExperiment : IDeepCloneable, IContent, IProgressReporter {
-    private JobResultPoller jobResultPoller;
-
     [Storable]
     private bool useLocalPlugins;
@@ -71,8 +67,6 @@
       get { return hiveJobs; }
       set {
-        DeregisterHiveJobsEvents();
         if (hiveJobs != value) {
           hiveJobs = value;
-          RegisterHiveJobsEvents();
           OnHiveJobsChanged();
         }
@@ -92,29 +86,4 @@
     }
 
-    /** include jobs when refreshing **/
-    [Storable]
-    private bool includeJobs;
-    public bool IncludeJobs {
-      get { return includeJobs; }
-      set { includeJobs = value; }
-    }
-
-    [Storable]
-    private bool refreshAutomatically;
-    public bool RefreshAutomatically {
-      get { return refreshAutomatically; }
-      set {
-        if (refreshAutomatically != value) {
-          refreshAutomatically = value;
-          OnRefreshAutomaticallyChanged();
-          if (RefreshAutomatically) {
-            StartResultPolling();
-          } else {
-            StopResultPolling();
-          }
-        }
-      }
-    }
-
     [Storable]
     private IProgress progress;
@@ -127,6 +96,5 @@
     public HiveExperiment() {
       this.ResourceNames = "HEAL";
-      this.includeJobs = true;
-      this.refreshAutomatically = true;
+      this.HiveJobs = new ItemCollection<HiveJob>();
     }
 
@@ -140,5 +108,5 @@
       this.Description = original.Description;
       this.Id = original.Id;
-
+      this.HiveJobs = cloner.Clone(original.HiveJobs);
       this.UseLocalPlugins = original.UseLocalPlugins;
       this.ExecutionTime = original.ExecutionTime;
@@ -148,8 +116,4 @@
     }
     #endregion
-
-    public override string ToString() {
-      return Name;
-    }
 
     #region Events
@@ -167,13 +131,5 @@
 
     public event EventHandler HiveJobsChanged;
-    private void OnHiveJobsChanged() {
-      if (jobResultPoller != null && jobResultPoller.IsPolling) {
-        jobResultPoller.Stop();
-        DeregisterResultPollingEvents();
-      }
-      if (HiveJobs != null && HiveJobs.Count > 0 && GetAllHiveJobs().All(x => x.Job.Id != Guid.Empty)) {
-        if (this.RefreshAutomatically)
-          StartResultPolling();
-      }
+    protected virtual void OnHiveJobsChanged() {
       EventHandler handler = HiveJobsChanged;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -185,53 +141,6 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
-
-    public event EventHandler RefreshAutomaticallyChanged;
-    private void OnRefreshAutomaticallyChanged() {
-      EventHandler handler = RefreshAutomaticallyChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
     #endregion
-
-    private void RegisterHiveJobsEvents() {
-      //if (HiveJobs != null) {
-      //  HiveJobs.JobStateChanged += new EventHandler(HiveJob_JobStateChanged);
-      //}
-    }
-
-    private void DeregisterHiveJobsEvents() {
-      //if (HiveJobs != null) {
-      //  HiveJobs.JobStateChanged -= new EventHandler(HiveJob_JobStateChanged);
-      //}
-    }
-
-    private void HiveJob_JobStateChanged(object sender, EventArgs e) {
-      //if (this.HiveJobs != null) {
-      //  this.RootJobId = HiveJobs.Job.Id;
-      //}
-    }
-
-    public Experiment GetExperiment(int idx) {
-      if (this.HiveJobs != null) {
-        var hj = HiveJobs.ElementAtOrDefault(idx);
-        if (hj != null)
-          return hj.OptimizerJob.OptimizerAsExperiment;
-      }
-      return null;
-    }
-
-    public void AddExperiment(Experiment experiment) {
-      if (this.HiveJobs == null) 
-        this.HiveJobs = new ItemCollection<HiveJob>();
-      this.HiveJobs.Add(new HiveJob(experiment));
-    }
-
-    public void SetExperiment(Experiment experiment) {
-      if (this.HiveJobs == null)
-        this.HiveJobs = new ItemCollection<HiveJob>();
-      else
-        this.HiveJobs.Clear();
-      this.HiveJobs.Add(new HiveJob(experiment));
-    }
-
+    
     protected override void OnPropertyChanged(PropertyChangedEventArgs e) {
       base.OnPropertyChanged(e);
@@ -240,113 +149,5 @@
       }
     }
-
-    #region JobResultPoller Events
-
-    public void StartResultPolling() {
-      if (jobResultPoller == null) {
-        jobResultPoller = new JobResultPoller(HiveJobs, /*ApplicationConstants.ResultPollingInterval*/new TimeSpan(0, 0, 5)); //TODO: find a better place for ApplicationConstants
-        RegisterResultPollingEvents();
-      }
-
-      if (!jobResultPoller.IsPolling) {
-        jobResultPoller.Start();
-      }
-    }
-
-    public void StopResultPolling() {
-      if (jobResultPoller != null && jobResultPoller.IsPolling) {
-        jobResultPoller.Stop();
-      }
-    }
-
-    private void RegisterResultPollingEvents() {
-      jobResultPoller.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
-      jobResultPoller.JobResultsReceived += new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
-      jobResultPoller.IsPollingChanged += new EventHandler(jobResultPoller_IsPollingChanged);
-    }
-    private void DeregisterResultPollingEvents() {
-      jobResultPoller.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
-      jobResultPoller.JobResultsReceived -= new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
-      jobResultPoller.IsPollingChanged -= new EventHandler(jobResultPoller_IsPollingChanged);
-    }
-    private void jobResultPoller_IsPollingChanged(object sender, EventArgs e) {
-      this.refreshAutomatically = jobResultPoller.IsPolling;
-      OnRefreshAutomaticallyChanged();
-    }
-    private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightJob>> e) {
-      foreach (LightweightJob lightweightJob in e.Value) {
-        HiveJob hj = GetHiveJobById(lightweightJob.Id);
-        if (hj != null) {
-          DateTime lastJobDataUpdate = hj.Job.LastJobDataUpdate;
-          hj.UpdateFromLightweightJob(lightweightJob);
-
-          // lastJobDataUpdate equals DateTime.MinValue right after it was uploaded. When the first results are polled, this value is updated
-          if (lastJobDataUpdate != DateTime.MinValue && lastJobDataUpdate < hj.Job.LastJobDataUpdate) {
-            OptimizerJob optimizerJob = ExperimentManagerClient.LoadOptimizerJob(hj.Job.Id);
-            if (optimizerJob == null) {
-              // something bad happened to this job. bad job, BAAAD job!
-            } else {
-              // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
-              if (hj.Job.State == JobState.Paused) {
-                hj.OptimizerJob = optimizerJob;
-              } else {
-                if (lightweightJob.ParentJobId.HasValue) {
-                  HiveJob parentHiveJob = GetHiveJobById(lightweightJob.ParentJobId.Value);
-                  parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.Job.Id);
-                }
-              }
-            }
-          }
-        }
-      }
-      GC.Collect(); // force GC, because .NET is too lazy here (deserialization takes a lot of memory)
-      if (AllJobsFinished()) {
-        this.ExecutionState = Core.ExecutionState.Stopped;
-        StopResultPolling();
-        //OnStopped();
-      }
-      UpdateTotalExecutionTime();
-      UpdateStats();
-    }
-
-    public HiveJob GetHiveJobById(Guid jobId) {
-      foreach (HiveJob job in HiveJobs) {
-        HiveJob hj = job.GetHiveJobByJobId(jobId);
-        if (hj != null)
-          return hj;
-      }
-      return null;
-    }
-
-    private void UpdateStats() {
-      var jobs = GetAllHiveJobs();
-      this.JobCount = jobs.Count();
-      this.CalculatingCount = jobs.Count(j => j.Job.State == JobState.Calculating);
-      this.FinishedCount = jobs.Count(j => j.Job.State == JobState.Finished);
-    }
-
-    public IEnumerable<HiveJob> GetAllHiveJobs() {
-      var jobs = new List<HiveJob>();
-      foreach (HiveJob job in HiveJobs) {
-        jobs.AddRange(job.GetAllHiveJobs());
-      }
-      return jobs;
-    }
-
-    public bool AllJobsFinished() {
-      return GetAllHiveJobs().All(j => j.Job.State == JobState.Finished
-                                            || j.Job.State == JobState.Aborted
-                                            || j.Job.State == JobState.Failed);
-    }
-
-    private void jobResultPoller_ExceptionOccured(object sender, EventArgs<Exception> e) {
-      //OnExceptionOccured(e.Value);
-    }
-
-    public void UpdateTotalExecutionTime() {
-      this.ExecutionTime = TimeSpan.FromMilliseconds(GetAllHiveJobs().Sum(x => x.Job.ExecutionTime.HasValue ? x.Job.ExecutionTime.Value.TotalMilliseconds : 0));
-    }
-    #endregion
-
+    
     protected override void RaisePropertyChanged(string propertyName) {
       if (!(propertyName == "ExecutionTime")
@@ -362,4 +163,18 @@
         && HiveJobs.All(x => x.Job.DateFinished.HasValue && x.Job.DateCreated.HasValue);
     }
+
+    public IEnumerable<HiveJob> GetAllHiveJobs() {
+      var jobs = new List<HiveJob>();
+      foreach (HiveJob job in HiveJobs) {
+        jobs.AddRange(job.GetAllHiveJobs());
+      }
+      return jobs;
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+
+    public virtual void OnLoaded() { }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/OperationJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/OperationJob.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/OperationJob.cs	(revision 6033)
@@ -0,0 +1,9 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Clients.Hive.ServiceClients {
+  class OperationJob {
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj	(revision 6033)
@@ -96,5 +96,5 @@
     <Compile Include="HeuristicLabHivePlugin.cs" />
     <Compile Include="IJob.cs" />
-    <Compile Include="AbstractJob.cs" />
+    <Compile Include="ItemJob.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/ItemJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/ItemJob.cs	(revision 6033)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/ItemJob.cs	(revision 6033)
@@ -0,0 +1,243 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Hive {
+  [Item("Abstract Job", "Represents a executable hive job.")]
+  [StorableClass]
+  public abstract class ItemJob : DeepCloneable, IJob {
+    public virtual bool IsParallelizable {
+      get { return true; }
+    }
+
+    [Storable]
+    protected IItem item;
+    public IItem Item {
+      get { return item; }
+      set {
+        if (value != item) {
+          if (item != null) DeregisterItemEvents();
+          item = value;
+          if (item != null) RegisterItemEvents();
+          OnItemChanged();
+        }
+      }
+    } 
+
+    [Storable]
+    protected bool computeInParallel;
+    public bool ComputeInParallel {
+      get { return computeInParallel; }
+      set {
+        if (computeInParallel != value) {
+          computeInParallel = value;
+          OnComputeInParallelChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private bool collectChildJobs;
+    public bool CollectChildJobs {
+      get { return collectChildJobs; }
+      set { collectChildJobs = value; }
+    }
+
+    #region Constructors and Cloning
+    public ItemJob() { }
+
+    [StorableConstructor]
+    protected ItemJob(bool deserializing) { }
+    protected ItemJob(ItemJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.ComputeInParallel = original.ComputeInParallel;
+      this.CollectChildJobs = original.CollectChildJobs;
+      this.Item = cloner.Clone(original.Item);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    protected virtual void AfterDeserialization() {
+      RegisterItemEvents();
+    }
+    #endregion
+
+    #region Optimizer Events
+    protected virtual void RegisterItemEvents() {
+      item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
+      item.ToStringChanged += new EventHandler(item_ToStringChanged);
+    }
+
+    protected virtual void DeregisterItemEvents() {
+      item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
+      item.ToStringChanged -= new EventHandler(item_ToStringChanged);
+    }
+
+    protected void item_ToStringChanged(object sender, EventArgs e) {
+      this.OnToStringChanged();
+    }
+    protected void item_ItemImageChanged(object sender, EventArgs e) {
+      this.OnItemImageChanged();
+    }
+
+    #endregion
+
+    #region IJob Members
+
+    public abstract ExecutionState ExecutionState{ get; }
+
+    public abstract TimeSpan ExecutionTime{ get; }
+
+    public abstract void Prepare();
+
+    public abstract void Start();
+
+    public abstract void Pause();
+
+    public abstract void Stop();
+
+    public abstract void Resume(IEnumerable<IJob> childJobs);
+
+    public event EventHandler JobStopped;
+    protected virtual void OnJobStopped() {
+      EventHandler handler = JobStopped;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobPaused;
+    protected virtual void OnJobPaused() {
+      EventHandler handler = JobPaused;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobFailed;
+    protected virtual void OnJobFailed(EventArgs<Exception> e) {
+      EventHandler handler = JobFailed;
+      if (handler != null) handler(this, e);
+    }
+
+    public event EventHandler<EventArgs<IJob>> NewChildJob;
+    protected virtual void OnNewChildJob(IJob job) {
+      EventHandler<EventArgs<IJob>> handler = NewChildJob;
+      if (handler != null) handler(this, new EventArgs<IJob>(job));
+    }
+
+    public event EventHandler WaitForChildJobs;
+    protected virtual void OnWaitForChildJobs() {
+      EventHandler handler = WaitForChildJobs;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler DeleteChildJobs;
+    protected virtual void OnDeleteChildJobs() {
+      EventHandler handler = DeleteChildJobs;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ComputeInParallelChanged;
+    protected virtual void OnComputeInParallelChanged() {
+      EventHandler handler = ComputeInParallelChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ItemChanged;
+    protected virtual void OnItemChanged() {
+      EventHandler handler = ItemChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+    
+    #region INamedItem Members
+    public abstract bool CanChangeDescription { get; }
+
+    public abstract bool CanChangeName { get; }
+
+    public abstract string Description { get; set; }
+
+    public abstract string Name { get; set; }
+    #endregion
+
+    #region Events
+    public event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged() {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged() {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ToStringChanged;
+    protected virtual void OnToStringChanged() {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler NameChanged;
+    protected virtual void OnNameChanged() {
+      var handler = NameChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler<CancelEventArgs<string>> NameChanging;
+    protected virtual void OnNameChanging(string value, bool cancel) {
+      var handler = NameChanging;
+      if (handler != null) handler(this, new CancelEventArgs<string>(value, cancel));
+    }
+    public event EventHandler ExecutionTimeChanged;
+    protected virtual void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ExecutionStateChanged;
+    protected virtual void OnExecutionStateChanged() {
+      EventHandler handler = ExecutionStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region IItem Members
+    public virtual string ItemDescription {
+      get { return item.ItemDescription; }
+    }
+
+    public virtual Image ItemImage {
+      get { return item.ItemImage; }
+    }
+
+    public virtual string ItemName {
+      get { return item.ItemName; }
+    }
+
+    public virtual Version ItemVersion {
+      get { return item.ItemVersion; }
+    }
+    #endregion
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/HeuristicLab.HiveEngine.Test.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/HeuristicLab.HiveEngine.Test.csproj	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/HeuristicLab.HiveEngine.Test.csproj	(revision 6033)
@@ -124,4 +124,8 @@
       <Name>HeuristicLab.HiveEngine-3.4</Name>
     </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
+      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
+      <Name>HeuristicLab.Hive-3.4</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/Program.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/Program.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/Program.cs	(revision 6033)
@@ -11,4 +11,6 @@
 using HeuristicLab.PluginInfrastructure.Manager;
 using HeuristicLab.Problems.TestFunctions;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.HiveEngine.Test {
@@ -30,4 +32,14 @@
     public override void Run() {
       ContentManager.Initialize(new PersistenceContentManager());
+
+
+      OptimizerJob job = new OptimizerJob(new Experiment());
+      job.IndexInParentOptimizerList = 15;
+
+      byte[] data = PersistenceUtil.Serialize(job);
+
+      var job2 = PersistenceUtil.Deserialize<OptimizerJob>(data);
+
+
 
       #region Credentials
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/app.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/app.config	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Test/app.config	(revision 6033)
@@ -1,3 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
+﻿<?xml version="1.0" encoding="utf-8"?>
 <configuration>
   <configSections>
@@ -73,7 +73,7 @@
         </identity>
       </endpoint>
-      <endpoint address="http://services.heuristiclab.com/Hive-3.4/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding" contract="HeuristicLab.Clients.Hive.IHiveService" name="wsHttpBinding_IHiveService">
+      <endpoint address="http://localhost/Hive-3.4/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding" contract="HeuristicLab.Clients.Hive.IHiveService" name="wsHttpBinding_IHiveService">
         <identity>
-          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+          <certificate encodedValue="AwAAAAEAAAAUAAAAfEKvcVixnJay+q4hCPFuO0JL5TQgAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhCNN5wrUcXMmE/9xwp4TYa9MAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMTAxOTEwNTMxNVoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXwC5TGcAffd/0oAWHtm0s6YXVXEgXgb1AYmBkkkhkKIFJG/e/Z0KSYbJepmSJD44W3oOAVm+x1DAsZxU79HahDYgWCuHLMm1TLpwSmYOQ0kV3pGHWHhiWV7h7oGLds/eqZ2EOpaNGryfEPnrA4VmxY91vV5/2BTeVSWG6F8lRKQIDAQABo0kwRzBFBgNVHQEEPjA8gBAR7kBnMRHO5gzThEqda0wWoRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghCNN5wrUcXMmE/9xwp4TYa9MAkGBSsOAwIdBQADgYEAoPwEG4QTDXhlxERNDfsZmM2IhEpV42ppz1kEah2oYKDa/ElIMVtvqLv6flVtg18ENN/mEJWiHZ3NyP3qr2Pip+sh+/2WBiSbOaukES/CM7OJn9kJCImH7M/xqM8pxqY8IfgM6iBVrVj9uHqj3j2BBck+cYY8fKyh3CFifMIp6ac=" />
         </identity>
       </endpoint>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs	(revision 6033)
@@ -9,8 +9,5 @@
 namespace HeuristicLab.HiveEngine {
   [StorableClass]
-  public class EngineJob : AbstractJob {
-    [Storable]
-    private IEngine engine;
-
+  public class EngineJob : ItemJob {
     [Storable]
     protected IOperation initialOperation;
@@ -20,10 +17,15 @@
     }
 
+    public new IEngine Item {
+      get { return (IEngine)base.Item; }
+      set { base.Item = value; }
+    }
+
     public override TimeSpan ExecutionTime {
-      get { return engine.ExecutionTime; }
+      get { return Item.ExecutionTime; }
     }
 
     public override ExecutionState ExecutionState {
-      get { return engine.ExecutionState; }
+      get { return Item.ExecutionState; }
     }
 
@@ -32,6 +34,5 @@
     public EngineJob(IOperation initialOperation, IEngine engine) {
       this.initialOperation = initialOperation;
-      this.engine = engine;
-      RegisterEngineEvents();
+      this.Item = engine;
     }
 
@@ -40,14 +41,8 @@
     protected EngineJob(EngineJob original, Cloner cloner)
       : base(original, cloner) {
-      this.engine = cloner.Clone(original.engine);
       this.initialOperation = cloner.Clone(original.initialOperation);
-      RegisterEngineEvents();
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new EngineJob(this, cloner);
-    }
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterEngineEvents();
     }
     #endregion
@@ -60,14 +55,14 @@
 
     public override void Start() {
-      engine.Prepare(initialOperation);
-      engine.Start();
+      Item.Prepare(initialOperation);
+      Item.Start();
     }
     
     public override void Pause() {
-      engine.Pause();
+      Item.Pause();
     }
 
     public override void Stop() {
-      engine.Stop();
+      Item.Stop();
     }
     
@@ -76,7 +71,12 @@
     }
 
-    private void RegisterEngineEvents() {
-      engine.Stopped += new EventHandler(engine_Stopped);
-      engine.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
+    protected override void RegisterItemEvents() {
+      Item.Stopped += new EventHandler(engine_Stopped);
+      Item.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
+    }
+
+    protected override void DeregisterItemEvents() {
+      Item.Stopped -= new EventHandler(engine_Stopped);
+      Item.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
     }
 
@@ -103,5 +103,5 @@
 
     public override string Name {
-      get { return engine.ToString(); }
+      get { return Item.ToString(); }
       set { throw new NotSupportedException(); }
     }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame	(revision 6033)
@@ -26,13 +26,17 @@
   [PluginFile("HeuristicLab.HiveEngine-3.4.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.4")]
+  [PluginDependency("HeuristicLab.Clients.Hive.Views", "3.4")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
-  [PluginDependency("HeuristicLab.DataAccess", "3.3")]
-  [PluginDependency("HeuristicLab.Hive.Contracts", "3.3")]
-  [PluginDependency("HeuristicLab.Hive.ExperimentManager", "3.3")]
-  [PluginDependency("HeuristicLab.Hive.JobBase", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Hive", "3.4")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
   [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
   public class HeuristicLabHiveEnginePlugin : PluginBase {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6033)
@@ -54,6 +54,6 @@
 
     [Storable]
-    private ItemCollection<HiveExperiment> hiveExperiments;
-    public ItemCollection<HiveExperiment> HiveExperiments {
+    private ItemCollection<RefreshableHiveExperiment> hiveExperiments;
+    public ItemCollection<RefreshableHiveExperiment> HiveExperiments {
       get { return hiveExperiments; }
       set { hiveExperiments = value; }
@@ -75,5 +75,5 @@
     public HiveEngine() {
       ResourceNames = "HEAL";
-      HiveExperiments = new ItemCollection<HiveExperiment>();
+      HiveExperiments = new ItemCollection<RefreshableHiveExperiment>();
       Priority = 0;
     }
@@ -239,7 +239,6 @@
         hiveExperiment.UseLocalPlugins = this.UseLocalPlugins;
         hiveExperiment.ResourceNames = this.ResourceNames;
-        hiveExperiment.RefreshAutomatically = false;
         hiveExperiment.Id = ServiceLocator.Instance.CallHiveService(s => s.AddHiveExperiment(hiveExperiment));
-        hiveExperiments.Add(hiveExperiment);
+        hiveExperiments.Add(new RefreshableHiveExperiment(hiveExperiment));
 
         // create upload-tasks
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs	(revision 6033)
@@ -222,10 +222,10 @@
     private System.Windows.Forms.TextBox priorityTextBox;
     private System.Windows.Forms.Label label1;
-    protected System.Windows.Forms.TextBox executionTimeOnHiveTextBox;
+    private System.Windows.Forms.TextBox executionTimeOnHiveTextBox;
     private System.Windows.Forms.TabControl tabControl;
     private System.Windows.Forms.TabPage jobsTabPage;
     private System.Windows.Forms.TabPage logTabPage;
     private System.Windows.Forms.Label executionTimeLabel;
-    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
     private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
     private HeuristicLab.Core.Views.LogView logView;
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame	(revision 6033)
@@ -8,7 +8,9 @@
   [Plugin("HeuristicLab.Services.Hive.DataAccess", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Services.Hive.DataAccess-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Services.Hive.Common", "3.4")]
   public class HeuristicLabServicesHiveDataAccessPlugin : PluginBase {
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Tools/prepareHiveDatabase.sql
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Tools/prepareHiveDatabase.sql	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Tools/prepareHiveDatabase.sql	(revision 6033)
@@ -55,11 +55,4 @@
 GO
 
---ALTER TABLE [dbo].[Job]  DROP  CONSTRAINT [HiveExperiment_Job]
---ALTER TABLE [dbo].[Job]  WITH CHECK ADD CONSTRAINT [HiveExperiment_Job] FOREIGN KEY([HiveExperimentId])
---REFERENCES [dbo].[HiveExperiment] ([HiveExperimentId])
---ON UPDATE CASCADE
---ON DELETE CASCADE
---GO
-
 ALTER TABLE dbo.Plugin ALTER COLUMN PluginId ADD ROWGUIDCOL;
 ALTER TABLE dbo.Plugin WITH NOCHECK ADD CONSTRAINT [DF_Plugin_PluginId] DEFAULT (newid()) FOR PluginId;
@@ -67,4 +60,11 @@
 ALTER TABLE dbo.PluginData ALTER COLUMN PluginDataId ADD ROWGUIDCOL;
 ALTER TABLE dbo.PluginData WITH NOCHECK ADD CONSTRAINT [DF_PluginData_PluginDataId] DEFAULT (newid()) FOR PluginDataId;
+
+ALTER TABLE [dbo].[PluginData]  DROP  CONSTRAINT [Plugin_PluginData]
+ALTER TABLE [dbo].[PluginData]  WITH CHECK ADD  CONSTRAINT [Plugin_PluginData] FOREIGN KEY([PluginId])
+REFERENCES [dbo].[Plugin] ([PluginId])
+ON UPDATE CASCADE
+ON DELETE CASCADE
+GO
 
 ALTER TABLE dbo.RequiredPlugins ALTER COLUMN RequiredPluginId ADD ROWGUIDCOL;
@@ -108,4 +108,7 @@
 
 /* triggers */
+USE [HeuristicLab.Hive-3.4]
+GO
+/****** Object:  Trigger [dbo].[tr_HiveExperimentDeleteCascade]    Script Date: 04/19/2011 16:31:53 ******/
 SET ANSI_NULLS ON
 GO
@@ -114,18 +117,16 @@
 -- =============================================
 -- Author:		cneumuel
--- Create date: 11.04.2011
+-- Create date: 19.04.2011
 -- Description:	Deletes all associated jobs. This cannot be done with cascading delete, 
 --              because the job table defines a INSTEAD OF DELETE trigger itself, which
 --              is not compatible with cascading deletes.
 -- =============================================
-ALTER TRIGGER [dbo].[tr_HiveExperimentDeleteCascade] ON [dbo].[HiveExperiment] INSTEAD OF DELETE AS 
+CREATE TRIGGER [dbo].[tr_HiveExperimentDeleteCascade] ON [dbo].[HiveExperiment] INSTEAD OF DELETE AS 
 BEGIN
-	DELETE Job FROM Job WHERE Job.HiveExperimentId = HiveExperimentId
+	DELETE Job FROM deleted, Job WHERE deleted.HiveExperimentId = Job.HiveExperimentId
+	DELETE HiveExperiment FROM deleted, HiveExperiment WHERE deleted.HiveExperimentId = HiveExperiment.HiveExperimentId
 END
+GO
 
-SET ANSI_NULLS ON
-GO
-SET QUOTED_IDENTIFIER ON
-GO
 -- =============================================
 -- Author:		cneumuel
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HeuristicLabServicesHivePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HeuristicLabServicesHivePlugin.cs.frame	(revision 6032)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HeuristicLabServicesHivePlugin.cs.frame	(revision 6033)
@@ -8,7 +8,11 @@
   [Plugin("HeuristicLab.Services.Hive", "3.4.0.$WCREV$")]
   [PluginFile("HeuristicLab.Services.Hive-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Services.Hive.Common", "3.4")]
+  [PluginDependency("HeuristicLab.Services.Hive.DataAccess", "3.4")]
   public class HeuristicLabServicesHivePlugin : PluginBase {
   }
