Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Properties/AssemblyInfo.frame
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Properties/AssemblyInfo.frame	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Properties/AssemblyInfo.frame	(revision 6381)
@@ -0,0 +1,57 @@
+﻿#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive.Administration")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2011 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7c14407e-6980-465b-ba3a-4a916d48989b")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj	(revision 6381)
@@ -151,9 +151,9 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Views\HiveExperimentListView.cs">
+    <Compile Include="Views\RefreshableHiveExperimentListView.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="Views\HiveExperimentListView.Designer.cs">
-      <DependentUpon>HiveExperimentListView.cs</DependentUpon>
+    <Compile Include="Views\RefreshableHiveExperimentListView.Designer.cs">
+      <DependentUpon>RefreshableHiveExperimentListView.cs</DependentUpon>
     </Compile>
     <Compile Include="Views\HiveExperimentManagerView.cs">
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.Designer.cs	(revision 6373)
+++ 	(revision )
@@ -1,32 +1,0 @@
-﻿namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
-  partial class HiveExperimentListView {
-    /// <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() {
-      components = new System.ComponentModel.Container();
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-    }
-
-    #endregion
-  }
-}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.cs	(revision 6373)
+++ 	(revision )
@@ -1,48 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
-  [View("HiveExperimentList View")]
-  [Content(typeof(ItemCollection<RefreshableHiveExperiment>), false)]
-  public partial class HiveExperimentListView : ItemCollectionView<RefreshableHiveExperiment> {
-
-    public HiveExperimentListView() {
-      InitializeComponent();
-    }
-
-    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.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs	(revision 6381)
@@ -46,5 +46,5 @@
     private void InitializeComponent() {
       System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveExperimentManagerView));
-      this.hiveExperimentListView = new HiveExperimentListView();
+      this.hiveExperimentListView = new RefreshableHiveExperimentListView();
       this.refreshButton = new System.Windows.Forms.Button();
       this.SuspendLayout();
@@ -86,5 +86,5 @@
     #endregion
 
-    private HiveExperimentListView hiveExperimentListView;
+    private RefreshableHiveExperimentListView hiveExperimentListView;
     private System.Windows.Forms.Button refreshButton;
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.Designer.cs	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.Designer.cs	(revision 6381)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  partial class RefreshableHiveExperimentListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentListView.cs	(revision 6381)
@@ -0,0 +1,48 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  [View("HiveExperimentList View")]
+  [Content(typeof(ItemCollection<RefreshableHiveExperiment>), false)]
+  public partial class RefreshableHiveExperimentListView : ItemCollectionView<RefreshableHiveExperiment> {
+
+    public RefreshableHiveExperimentListView() {
+      InitializeComponent();
+    }
+
+    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.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6381)
@@ -50,4 +50,5 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ExperimentManager.HiveJobItemTreeView();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
@@ -73,5 +74,5 @@
       this.calculatingLabel = new System.Windows.Forms.Label();
       this.jobsLabel = new System.Windows.Forms.Label();
-      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ExperimentManager.HiveJobItemTreeView();
+      this.isPrivilegedCheckBox = new System.Windows.Forms.CheckBox();
       this.tabControl.SuspendLayout();
       this.jobsTabPage.SuspendLayout();
@@ -90,5 +91,5 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(821, 520);
+      this.tabControl.Size = new System.Drawing.Size(717, 452);
       this.tabControl.TabIndex = 4;
       // 
@@ -98,8 +99,25 @@
       this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
       this.jobsTabPage.Name = "jobsTabPage";
-      this.jobsTabPage.Size = new System.Drawing.Size(813, 494);
+      this.jobsTabPage.Size = new System.Drawing.Size(709, 426);
       this.jobsTabPage.TabIndex = 5;
       this.jobsTabPage.Text = "Jobs";
       this.jobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // 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(704, 420);
+      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);
       // 
       // logTabPage
@@ -128,5 +146,5 @@
       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.Location = new System.Drawing.Point(0, 536);
       this.startButton.Name = "startButton";
       this.startButton.Size = new System.Drawing.Size(24, 24);
@@ -140,5 +158,5 @@
       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.Location = new System.Drawing.Point(60, 536);
       this.stopButton.Name = "stopButton";
       this.stopButton.Size = new System.Drawing.Size(24, 24);
@@ -153,5 +171,5 @@
       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.Location = new System.Drawing.Point(90, 536);
       this.resetButton.Name = "resetButton";
       this.resetButton.Size = new System.Drawing.Size(24, 24);
@@ -165,5 +183,5 @@
       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.Location = new System.Drawing.Point(491, 543);
       this.executionTimeLabel.Name = "executionTimeLabel";
       this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
@@ -174,5 +192,5 @@
       // 
       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.Location = new System.Drawing.Point(580, 540);
       this.executionTimeTextBox.Name = "executionTimeTextBox";
       this.executionTimeTextBox.ReadOnly = true;
@@ -185,5 +203,5 @@
       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.Location = new System.Drawing.Point(30, 536);
       this.pauseButton.Name = "pauseButton";
       this.pauseButton.Size = new System.Drawing.Size(24, 24);
@@ -208,5 +226,5 @@
       this.resourceNamesTextBox.Location = new System.Drawing.Point(73, 53);
       this.resourceNamesTextBox.Name = "resourceNamesTextBox";
-      this.resourceNamesTextBox.Size = new System.Drawing.Size(494, 20);
+      this.resourceNamesTextBox.Size = new System.Drawing.Size(304, 20);
       this.resourceNamesTextBox.TabIndex = 14;
       this.resourceNamesTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
@@ -216,5 +234,5 @@
       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.Location = new System.Drawing.Point(469, 56);
       this.useLocalPluginsCheckBox.Name = "useLocalPluginsCheckBox";
       this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(105, 17);
@@ -239,5 +257,5 @@
       this.nameTextBox.Location = new System.Drawing.Point(73, 27);
       this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(605, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(501, 20);
       this.nameTextBox.TabIndex = 21;
       this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
@@ -274,5 +292,5 @@
       this.infoGroupBox.Controls.Add(this.calculatingLabel);
       this.infoGroupBox.Controls.Add(this.jobsLabel);
-      this.infoGroupBox.Location = new System.Drawing.Point(684, 5);
+      this.infoGroupBox.Location = new System.Drawing.Point(580, 5);
       this.infoGroupBox.Name = "infoGroupBox";
       this.infoGroupBox.Size = new System.Drawing.Size(133, 89);
@@ -335,20 +353,16 @@
       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);
+      // isPrivilegedCheckBox
+      // 
+      this.isPrivilegedCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.isPrivilegedCheckBox.AutoSize = true;
+      this.isPrivilegedCheckBox.Location = new System.Drawing.Point(383, 55);
+      this.isPrivilegedCheckBox.Name = "isPrivilegedCheckBox";
+      this.isPrivilegedCheckBox.Size = new System.Drawing.Size(80, 17);
+      this.isPrivilegedCheckBox.TabIndex = 26;
+      this.isPrivilegedCheckBox.Text = "IsPrivileged";
+      this.toolTip.SetToolTip(this.isPrivilegedCheckBox, "If checked, the job will be executed in a privileged sandbox on the slave.");
+      this.isPrivilegedCheckBox.UseVisualStyleBackColor = true;
+      this.isPrivilegedCheckBox.CheckedChanged += new System.EventHandler(this.isPrivilegedCheckBox_CheckedChanged);
       // 
       // RefreshableHiveExperimentView
@@ -356,4 +370,5 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.isPrivilegedCheckBox);
       this.Controls.Add(this.infoGroupBox);
       this.Controls.Add(this.refreshAutomaticallyCheckBox);
@@ -372,5 +387,5 @@
       this.Controls.Add(this.resetButton);
       this.Name = "RefreshableHiveExperimentView";
-      this.Size = new System.Drawing.Size(821, 628);
+      this.Size = new System.Drawing.Size(717, 560);
       this.tabControl.ResumeLayout(false);
       this.jobsTabPage.ResumeLayout(false);
@@ -410,4 +425,5 @@
     private System.Windows.Forms.Label calculatingLabel;
     private System.Windows.Forms.Label jobsLabel;
+    private System.Windows.Forms.CheckBox isPrivilegedCheckBox;
 
   }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6381)
@@ -103,7 +103,7 @@
         resourceNamesTextBox.Text = string.Empty;
         useLocalPluginsCheckBox.Checked = false;
+        isPrivilegedCheckBox.Checked = false;
         logView.Content = null;
-        //includeJobsCheckBox.Checked = false;
-        refreshAutomaticallyCheckBox.Checked = false;
+        refreshAutomaticallyCheckBox.Checked = false;        
         logView.Content = null;
       } else {
@@ -112,5 +112,5 @@
         resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
         useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
-        //includeJobsCheckBox.Checked = Content.IncludeJobs;
+        isPrivilegedCheckBox.Checked = Content.HiveExperiment.IsPrivileged;
         refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
         logView.Content = Content.Log;
@@ -138,8 +138,10 @@
         this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
 
+        this.isPrivilegedCheckBox.Enabled = Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded); // TODO: check if user has the rights to do this
         this.useLocalPluginsCheckBox.Enabled = Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
         this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
         this.refreshButton.Enabled = Content.IsControllable && alreadyUploaded;
         this.Locked = !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+
       }
       SetEnabledStateOfExecutableButtons();
@@ -296,4 +298,8 @@
     private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
       if (Content != null) Content.HiveExperiment.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
+    }
+
+    private void isPrivilegedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) Content.HiveExperiment.IsPrivileged = isPrivilegedCheckBox.Checked;
     }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs	(revision 6381)
@@ -228,5 +228,5 @@
       Guid jobId = (Guid)jobIdObj;
       Job job = null;
-      bool usedCoresIncremented = false;
+      int usedCores = 0;
       try {
         job = wcfService.GetJob(jobId);
@@ -234,5 +234,5 @@
         if (ConfigManager.Instance.GetFreeCores() < job.CoresNeeded) throw new OutOfCoresException();
         if (ConfigManager.GetFreeMemory() < job.MemoryNeeded) throw new OutOfMemoryException();
-        SlaveStatusInfo.IncrementUsedCores(job.CoresNeeded); usedCoresIncremented = true;
+        SlaveStatusInfo.IncrementUsedCores(job.CoresNeeded); usedCores = job.CoresNeeded;
         JobData jobData = wcfService.GetJobData(jobId);
         if (jobData == null) throw new JobDataNotFoundException(jobId);
@@ -242,13 +242,13 @@
       }
       catch (JobNotFoundException) {
-        if (usedCoresIncremented) SlaveStatusInfo.DecrementUsedCores(job.CoresNeeded);
+        SlaveStatusInfo.DecrementUsedCores(usedCores);
         throw;
       }
       catch (JobDataNotFoundException) {
-        SlaveStatusInfo.DecrementUsedCores(job.CoresNeeded);
+        SlaveStatusInfo.DecrementUsedCores(usedCores);
         throw;
       }
       catch (JobAlreadyRunningException) {
-        SlaveStatusInfo.DecrementUsedCores(job.CoresNeeded);
+        SlaveStatusInfo.DecrementUsedCores(usedCores);
         throw;
       }
@@ -261,6 +261,7 @@
         throw;
       }
-      catch (Exception) {
-        if (usedCoresIncremented) SlaveStatusInfo.DecrementUsedCores(job.CoresNeeded);
+      catch (Exception e) {
+        SlaveStatusInfo.DecrementUsedCores(usedCores);
+        wcfService.UpdateJobState(jobId, JobState.Waiting, e.ToString()); // unknown internal error - report and set waiting again
         throw;
       }
@@ -372,5 +373,5 @@
         job.ExecutionTime = slaveJob.ExecutionTime;
         if (jobData != null) {
-          wcfService.UpdateJobData(job, jobData, configManager.GetClientInfo().Id, JobState.Failed);
+          wcfService.UpdateJobData(job, jobData, configManager.GetClientInfo().Id, JobState.Failed, exception.ToString());
         } else {
           wcfService.UpdateJobState(job.Id, JobState.Failed, exception.ToString());
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs	(revision 6381)
@@ -154,4 +154,5 @@
     #region Job Events
     private void Job_JobFailed(object sender, EventArgs e) {
+      IsStopping = true;
       EventArgs<Exception> ex = (EventArgs<Exception>)e;
       currentException = ex.Value;
@@ -161,4 +162,5 @@
 
     private void Job_JobStopped(object sender, EventArgs e) {
+      IsStopping = true;
       if (wasJobAborted)
         pauseStopSem.Release();
@@ -168,4 +170,5 @@
 
     private void Job_JobPaused(object sender, EventArgs e) {
+      IsPausing = true;
       pauseStopSem.Release();
       executorQueue.AddMessage(ExecutorMessageType.JobPaused);
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Manager/JobManager.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Manager/JobManager.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Manager/JobManager.cs	(revision 6381)
@@ -86,6 +86,6 @@
         }
         catch (Exception) {
+          RemoveSlaveJob(job.Id, slaveJob); // clean up and rethrow
           slaveJob.DisposeAppDomain();
-          RemoveSlaveJob(job.Id, slaveJob); // clean up and rethrow
           throw;
         }
@@ -268,5 +268,5 @@
         if (jobData == null) throw new SerializationException();
       }
-      catch { }
+      catch { /* jobData will be null */ }
       SlaveStatusInfo.IncrementJobsFailed();
       OnJobFailed(slaveJob, jobData, e.Value2);
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/WcfService.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/WcfService.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/WcfService.cs	(revision 6381)
@@ -101,10 +101,10 @@
     /// Uploads the jobData and sets a new jobState (while correctly setting Transferring state)
     /// </summary>
-    public void UpdateJobData(Job job, JobData jobData, Guid slaveId, JobState state) {
+    public void UpdateJobData(Job job, JobData jobData, Guid slaveId, JobState state, string exception = "") {
       CallHiveService(service => {
         service.UpdateJob(job);
         job = service.UpdateJobState(job.Id, JobState.Transferring, slaveId, null, null);
         service.UpdateJobData(job, jobData);
-        service.UpdateJobState(job.Id, state, slaveId, null, null);
+        service.UpdateJobState(job.Id, state, slaveId, null, exception);
       });
     }
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 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj	(revision 6381)
@@ -125,9 +125,9 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="HiveJobs\ControllableHiveJobView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="HiveJobs\ControllableHiveJobView.designer.cs">
-      <DependentUpon>ControllableHiveJobView.cs</DependentUpon>
+    <Compile Include="HiveJobs\OptimizerHiveJobView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveJobs\OptimizerHiveJobView.designer.cs">
+      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
     </Compile>
     <Compile Include="HiveItemView.cs">
@@ -220,6 +220,6 @@
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="HiveJobs\ControllableHiveJobView.resx">
-      <DependentUpon>ControllableHiveJobView.cs</DependentUpon>
+    <EmbeddedResource Include="HiveJobs\OptimizerHiveJobView.resx">
+      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="HiveJobs\HiveJobView.resx">
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.cs	(revision 6373)
+++ 	(revision )
@@ -1,76 +1,0 @@
-﻿#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.Windows.Forms;
-using HeuristicLab.Clients.Hive.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Clients.Hive.Views {
-  [View("HiveJob View")]
-  [Content(typeof(HiveJob<>), true)]
-  public partial class ControllableHiveJobView : HiveJobView {
-    public new OptimizerHiveJob Content {
-      get { return (OptimizerHiveJob)base.Content; }
-      set {
-        if (base.Content != value) {
-          base.Content = value;
-        }
-      }
-    }
-
-    public ControllableHiveJobView() {
-      InitializeComponent();
-    }
-
-    protected override void Job_ItemChanged(object sender, EventArgs e) {
-      if (Content != null && Content.Job != null && Content.ItemJob.Item != null) {
-        runCollectionViewHost.Content = Content.ItemJob.Item.Runs;
-      } else {
-        runCollectionViewHost.Content = null;
-      }
-    }
-    #region Content Events
-    #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
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-
-      this.restartButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Paused || Content.Job.State == JobState.Failed || Content.Job.State == JobState.Aborted);
-      this.pauseButton.Enabled = Content != null && !Content.Job.Command.HasValue && Content.Job.State == JobState.Calculating;
-      this.stopButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
-    }
-  }
-}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.designer.cs	(revision 6373)
+++ 	(revision )
@@ -1,164 +1,0 @@
-﻿namespace HeuristicLab.Clients.Hive.Views {
-  partial class ControllableHiveJobView {
-    /// <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(ControllableHiveJobView));
-      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/HiveJobs/ControllableHiveJobView.resx
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.resx	(revision 6373)
+++ 	(revision )
@@ -1,154 +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="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/HiveJobs/OptimizerHiveJobView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.cs	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.cs	(revision 6381)
@@ -0,0 +1,75 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("OptimizerHiveJob 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.ItemJob.Item != null) {
+        runCollectionViewHost.Content = Content.ItemJob.Item.Runs;
+      } else {
+        runCollectionViewHost.Content = null;
+      }
+    }
+    #region Content Events
+    #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
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+
+      this.restartButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Paused || Content.Job.State == JobState.Failed || Content.Job.State == JobState.Aborted);
+      this.pauseButton.Enabled = Content != null && !Content.Job.Command.HasValue && Content.Job.State == JobState.Calculating;
+      this.stopButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
+    }
+  }
+}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.designer.cs	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.designer.cs	(revision 6381)
@@ -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/HiveJobs/OptimizerHiveJobView.resx
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.resx	(revision 6381)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/OptimizerHiveJobView.resx	(revision 6381)
@@ -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/3.4/HiveClient.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs	(revision 6381)
@@ -225,5 +225,5 @@
 
           foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs) {
-            UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.UseLocalPlugins, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log);
+            UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.UseLocalPlugins, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log, refreshableHiveExperiment.HiveExperiment.IsPrivileged);
           }
 
@@ -257,5 +257,5 @@
     /// <param name="parentHiveJob">shall be null if its the root job</param>
     /// <param name="groups"></param>
-    private void UploadJobWithChildren(IProgress progress, IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable<Guid> groups, ref int jobCount, int totalJobCount, Guid configPluginId, bool useLocalPlugins, Guid hiveExperimentId, ILog log) {
+    private void UploadJobWithChildren(IProgress progress, IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable<Guid> groups, ref int jobCount, int totalJobCount, Guid configPluginId, bool useLocalPlugins, Guid hiveExperimentId, ILog log, bool isPrivileged) {
       jobCount++;
       progress.Status = string.Format("Serializing job {0} of {1}", jobCount, totalJobCount);
@@ -263,6 +263,5 @@
       List<IPluginDescription> plugins;
 
-      if (hiveJob.ItemJob.ComputeInParallel &&
-        (hiveJob.ItemJob.Item is Optimization.Experiment || hiveJob.ItemJob.Item is Optimization.BatchRun)) {
+      if (hiveJob.ItemJob.ComputeInParallel && (hiveJob.ItemJob.Item is Optimization.Experiment || hiveJob.ItemJob.Item is Optimization.BatchRun)) {
         hiveJob.Job.IsParentJob = true;
         hiveJob.Job.FinishWhenChildJobsFinished = true;
@@ -279,4 +278,5 @@
       hiveJob.Job.PluginsNeededIds.Add(configPluginId);
       hiveJob.Job.HiveExperimentId = hiveExperimentId;
+      hiveJob.Job.IsPrivileged = isPrivileged;
 
       progress.Status = string.Format("Uploading job {0} of {1} ({2} kb, {3} objects)", jobCount, totalJobCount, jobData.Data.Count() / 1024, hiveJob.ItemJob.GetObjectGraphObjects().Count());
@@ -293,5 +293,5 @@
 
       foreach (HiveJob child in hiveJob.ChildHiveJobs) {
-        UploadJobWithChildren(progress, service, child, hiveJob, groups, ref jobCount, totalJobCount, configPluginId, useLocalPlugins, hiveExperimentId, log);
+        UploadJobWithChildren(progress, service, child, hiveJob, groups, ref jobCount, totalJobCount, configPluginId, useLocalPlugins, hiveExperimentId, log, isPrivileged);
       }
     }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs	(revision 6381)
@@ -56,10 +56,10 @@
 
       // clone operation and remove unnecessary scopes; don't do this earlier to avoid memory problems
-      lock (locker) {
+      //lock (locker) {
         ((IAtomicOperation)ItemJob.InitialOperation).Scope.Parent = parentScopeClone;
         ItemJob.InitialOperation = (IOperation)ItemJob.InitialOperation.Clone();
         ((IAtomicOperation)ItemJob.InitialOperation).Scope.ClearParentScopes();
         jobData.Data = PersistenceUtil.Serialize(ItemJob, out usedTypes);
-      }
+      //}
 
       // add type objects from object graph to work around ticket #1527
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs	(revision 6381)
@@ -25,4 +25,5 @@
 using System.Drawing;
 using System.Linq;
+using System.Threading;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
@@ -37,4 +38,5 @@
   public class HiveJob : NamedItem, IItemTree<HiveJob> {
     protected static object locker = new object();
+    protected ReaderWriterLockSlim childHiveJobsLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
 
     public override Image ItemImage {
@@ -109,5 +111,11 @@
     protected ItemList<HiveJob> childHiveJobs;
     public virtual ReadOnlyItemList<HiveJob> ChildHiveJobs {
-      get { return childHiveJobs.AsReadOnly(); }
+      get {
+        childHiveJobsLock.EnterReadLock();
+        try {
+          return childHiveJobs.AsReadOnly();
+        }
+        finally { childHiveJobsLock.ExitReadLock(); }
+      }
     }
 
@@ -117,8 +125,5 @@
     #region Constructors and Cloning
     public HiveJob() {
-      this.Job = new Job() {
-        CoresNeeded = 1,
-        MemoryNeeded = 0
-      };
+      this.Job = new Job() { CoresNeeded = 1, MemoryNeeded = 0 };
       job.State = JobState.Offline;
       this.childHiveJobs = new ItemList<HiveJob>();
@@ -152,5 +157,9 @@
       this.Job = cloner.Clone(original.job);
       this.ItemJob = cloner.Clone(original.ItemJob);
-      this.childHiveJobs = cloner.Clone(original.childHiveJobs);
+      original.childHiveJobsLock.EnterReadLock();
+      try {
+        this.childHiveJobs = cloner.Clone(original.childHiveJobs);
+      }
+      finally { original.childHiveJobsLock.ExitReadLock(); }
       this.syncJobsWithOptimizers = original.syncJobsWithOptimizers;
       this.isFinishedJobDownloaded = original.isFinishedJobDownloaded;
@@ -198,5 +207,9 @@
 
     public virtual void AddChildHiveJob(HiveJob hiveJob) {
-      this.childHiveJobs.Add(hiveJob);
+      childHiveJobsLock.EnterWriteLock();
+      try {
+        this.childHiveJobs.Add(hiveJob);
+      }
+      finally { childHiveJobsLock.ExitWriteLock(); }
     }
 
@@ -237,12 +250,6 @@
       IEnumerable<Type> usedTypes;
       byte[] jobByteArray = PersistenceUtil.Serialize(this.ItemJob, out usedTypes);
-
-      JobData jobData = new JobData() {
-        JobId = job.Id,
-        Data = jobByteArray
-      };
-
+      JobData jobData = new JobData() { JobId = job.Id, Data = jobByteArray };
       PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
-
       return jobData;
     }
@@ -295,21 +302,29 @@
     /// </summary>
     public IEnumerable<HiveJob> GetAllHiveJobs() {
-      var jobs = new List<HiveJob>();
-      jobs.Add(this);
-      foreach (HiveJob child in this.ChildHiveJobs) {
-        jobs.AddRange(child.GetAllHiveJobs());
-      }
-      return jobs;
+      childHiveJobsLock.EnterReadLock();
+      try {
+        var jobs = new List<HiveJob>();
+        jobs.Add(this);
+        foreach (HiveJob child in this.childHiveJobs) {
+          jobs.AddRange(child.GetAllHiveJobs());
+        }
+        return jobs;
+      }
+      finally { childHiveJobsLock.ExitReadLock(); }
     }
 
     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;
+      childHiveJobsLock.EnterReadLock();
+      try {
+        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;
+      }
+      finally { childHiveJobsLock.ExitWriteLock(); }
     }
 
@@ -321,9 +336,13 @@
         return this;
       } else {
-        foreach (HiveJob child in this.ChildHiveJobs) {
-          HiveJob result = child.GetHiveJobByJobId(jobId);
-          if (result != null)
-            return result;
-        }
+        childHiveJobsLock.EnterReadLock();
+        try {
+          foreach (HiveJob child in this.childHiveJobs) {
+            HiveJob result = child.GetHiveJobByJobId(jobId);
+            if (result != null)
+              return result;
+          }
+        }
+        finally { childHiveJobsLock.ExitReadLock(); }
       }
       return null;
@@ -331,15 +350,19 @@
 
     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);
-      }
+      childHiveJobsLock.EnterWriteLock();
+      try {
+        IEnumerable<HiveJob> jobs = childHiveJobs.Where(j => j.Job.Id == jobId).ToList();
+        foreach (HiveJob j in jobs) {
+          this.childHiveJobs.Remove(j);
+        }
+        foreach (HiveJob child in childHiveJobs) {
+          child.RemoveByJobId(jobId);
+        }
+      }
+      finally { childHiveJobsLock.ExitWriteLock(); }
     }
 
     public IEnumerable<IItemTree<HiveJob>> GetChildItems() {
-      return this.childHiveJobs;
+      return this.ChildHiveJobs;
     }
 
@@ -371,7 +394,11 @@
     public void Pause() {
       if (this.Job.IsParentJob) {
-        foreach (var child in ChildHiveJobs) {
-          ServiceLocator.Instance.CallHiveService(s => s.PauseJob(child.job.Id));
-        }
+        childHiveJobsLock.EnterReadLock();
+        try {
+          foreach (var child in childHiveJobs) {
+            ServiceLocator.Instance.CallHiveService(s => s.PauseJob(child.job.Id));
+          }
+        }
+        finally { childHiveJobsLock.ExitReadLock(); }
       } else {
         ServiceLocator.Instance.CallHiveService(s => s.PauseJob(this.job.Id));
@@ -381,7 +408,11 @@
     public void Stop() {
       if (this.Job.IsParentJob) {
-        foreach (var child in ChildHiveJobs) {
-          ServiceLocator.Instance.CallHiveService(s => s.StopJob(child.job.Id));
-        }
+        childHiveJobsLock.EnterReadLock();
+        try {
+          foreach (var child in childHiveJobs) {
+            ServiceLocator.Instance.CallHiveService(s => s.StopJob(child.job.Id));
+          }
+        }
+        finally { childHiveJobsLock.ExitReadLock(); }
       } else {
         ServiceLocator.Instance.CallHiveService(s => s.StopJob(this.job.Id));
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs	(revision 6381)
@@ -129,35 +129,51 @@
     private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
       if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
-            this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
-          }
-        }
+        childHiveJobsLock.EnterWriteLock();
+        try {
+          foreach (var item in e.Items) {
+            if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+              this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
+            }
+          }
+        }
+        finally { childHiveJobsLock.ExitWriteLock(); }
       }
     }
     private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
       if (syncJobsWithOptimizers && this.ItemJob.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));
-          }
-        }
+        childHiveJobsLock.EnterWriteLock();
+        try {
+          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));
+            }
+          }
+        }
+        finally { childHiveJobsLock.ExitWriteLock(); }
       }
     }
     private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
       if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
+        childHiveJobsLock.EnterWriteLock();
+        try {
+          foreach (var item in e.Items) {
+            this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+          }
+        }
+        finally { childHiveJobsLock.ExitWriteLock(); }
       }
     }
     private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
       if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
-        foreach (var item in e.Items) {
-          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
-        }
+        childHiveJobsLock.EnterWriteLock();
+        try {
+          foreach (var item in e.Items) {
+            this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+          }
+        }
+        finally { childHiveJobsLock.ExitWriteLock(); }
       }
     }
@@ -182,9 +198,13 @@
 
       OptimizerHiveJob child = (OptimizerHiveJob)this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
-      if (!optimizerJob.ComputeInParallel) {
-        child.syncJobsWithOptimizers = false;
-        child.ItemJob = optimizerJob;
-        child.syncJobsWithOptimizers = true;
-      }
+      childHiveJobsLock.EnterReadLock();
+      try {
+        if (!optimizerJob.ComputeInParallel) {
+          child.syncJobsWithOptimizers = false;
+          child.ItemJob = optimizerJob;
+          child.syncJobsWithOptimizers = true;
+        }
+      }
+      finally { childHiveJobsLock.ExitReadLock(); }
       syncJobsWithOptimizers = true;
     }
@@ -243,7 +263,11 @@
         }
       }
-      foreach (OptimizerHiveJob child in childHiveJobs) {
-        child.SetIndexInParentOptimizerList(this);
-      }
+      childHiveJobsLock.EnterReadLock();
+      try {
+        foreach (OptimizerHiveJob child in childHiveJobs) {
+          child.SetIndexInParentOptimizerList(this);
+        }
+      }
+      finally { childHiveJobsLock.ExitReadLock(); }
     }
 
@@ -302,28 +326,31 @@
       }
 
-      JobData jobData = new JobData() {
-        JobId = job.Id,
-        Data = jobByteArray
-      };
-
+      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.ItemJob == optimizerJob)
-          return child;
-      }
-      return null;
+      childHiveJobsLock.EnterReadLock();
+      try {
+        foreach (OptimizerHiveJob child in childHiveJobs) {
+          if (child.ItemJob == optimizerJob)
+            return child;
+        }
+        return null;
+      }
+      finally { childHiveJobsLock.ExitReadLock(); }
     }
 
     public HiveJob<OptimizerJob> GetChildByOptimizer(IOptimizer optimizer) {
-      foreach (OptimizerHiveJob child in ChildHiveJobs) {
-        if (child.ItemJob.Item == optimizer)
-          return child;
-      }
-      return null;
+      childHiveJobsLock.EnterReadLock();
+      try {
+        foreach (OptimizerHiveJob child in childHiveJobs) {
+          if (child.ItemJob.Item == optimizer)
+            return child;
+        }
+        return null;
+      }
+      finally { childHiveJobsLock.ExitReadLock(); }
     }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs	(revision 6381)
@@ -31,5 +31,5 @@
   [Item("Item Job", "Represents a executable hive job which contains a HeuristicLab Item.")]
   [StorableClass]
-  public abstract class ItemJob : DeepCloneable, IJob {
+  public abstract class ItemJob : NamedItem, IJob {
     public virtual bool IsParallelizable {
       get { return true; }
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 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6381)
@@ -86,5 +86,4 @@
 
     #region IJob Members
-
     public override ExecutionState ExecutionState {
       get { return Item.ExecutionState; }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs	(revision 6381)
@@ -395,5 +395,5 @@
 
     public override string ToString() {
-      return HiveExperiment.ToString();
+      return string.Format("{0} {1}", HiveExperiment.DateCreated.ToString("MM.dd.yyyy HH:mm"), HiveExperiment.ToString());
     }
   }
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 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs	(revision 6381)
@@ -33,4 +33,10 @@
       get { return useLocalPlugins; }
       set { useLocalPlugins = value; }
+    }
+
+    private bool isPrivileged;
+    public bool IsPrivileged {
+      get { return isPrivileged; }
+      set { isPrivileged = value; }
     }
 
@@ -89,4 +95,5 @@
       this.ResourceNames = "HEAL";
       this.HiveJobs = new ItemCollection<HiveJob>();
+      this.DateCreated = DateTime.Now;
     }
 
@@ -103,4 +110,5 @@
       this.UseLocalPlugins = original.UseLocalPlugins;
       this.ExecutionTime = original.ExecutionTime;
+      this.IsPrivileged = original.IsPrivileged;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs	(revision 6381)
@@ -21,9 +21,9 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 
 namespace HeuristicLab.Hive {
-  public interface IJob : INamedItem {
-
+  public interface IJob : IDeepCloneable, ICloneable {
     TimeSpan ExecutionTime { get; }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs	(revision 6381)
@@ -33,5 +33,5 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.jobsTabPage = new System.Windows.Forms.TabPage();
-      this.hiveExperimentListView = new HiveExperimentListView();
+      this.hiveExperimentListView = new HeuristicLab.Clients.Hive.ExperimentManager.Views.RefreshableHiveExperimentListView();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
@@ -39,4 +39,5 @@
       this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.useLocalPluginsCheckBox = new System.Windows.Forms.CheckBox();
+      this.isPrivilegedCheckBox = new System.Windows.Forms.CheckBox();
       this.tabControl.SuspendLayout();
       this.jobsTabPage.SuspendLayout();
@@ -60,5 +61,5 @@
       this.resourceIdsTextBox.Location = new System.Drawing.Point(189, 52);
       this.resourceIdsTextBox.Name = "resourceIdsTextBox";
-      this.resourceIdsTextBox.Size = new System.Drawing.Size(405, 20);
+      this.resourceIdsTextBox.Size = new System.Drawing.Size(319, 20);
       this.resourceIdsTextBox.TabIndex = 4;
       this.resourceIdsTextBox.Text = "HEAL";
@@ -184,16 +185,29 @@
       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(600, 55);
+      this.useLocalPluginsCheckBox.Location = new System.Drawing.Point(598, 55);
       this.useLocalPluginsCheckBox.Name = "useLocalPluginsCheckBox";
-      this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(103, 17);
+      this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(105, 17);
       this.useLocalPluginsCheckBox.TabIndex = 12;
-      this.useLocalPluginsCheckBox.Text = "useLocalPlugins";
+      this.useLocalPluginsCheckBox.Text = "UseLocalPlugins";
       this.useLocalPluginsCheckBox.UseVisualStyleBackColor = true;
       this.useLocalPluginsCheckBox.CheckedChanged += new System.EventHandler(this.useLocalPluginsCheckBox_CheckedChanged);
       // 
+      // isPrivilegedCheckBox
+      // 
+      this.isPrivilegedCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.isPrivilegedCheckBox.AutoSize = true;
+      this.isPrivilegedCheckBox.Location = new System.Drawing.Point(514, 55);
+      this.isPrivilegedCheckBox.Name = "isPrivilegedCheckBox";
+      this.isPrivilegedCheckBox.Size = new System.Drawing.Size(80, 17);
+      this.isPrivilegedCheckBox.TabIndex = 13;
+      this.isPrivilegedCheckBox.Text = "IsPrivileged";
+      this.isPrivilegedCheckBox.UseVisualStyleBackColor = true;
+      this.isPrivilegedCheckBox.CheckedChanged += new System.EventHandler(this.isPrivilegedCheckBox_CheckedChanged);
+      // 
       // HiveEngineView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.isPrivilegedCheckBox);
       this.Controls.Add(this.useLocalPluginsCheckBox);
       this.Controls.Add(this.executionTimeTextBox);
@@ -231,5 +245,6 @@
     private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
     private HeuristicLab.Core.Views.LogView logView;
-    private HiveExperimentListView hiveExperimentListView;
+    private RefreshableHiveExperimentListView hiveExperimentListView;
+    private System.Windows.Forms.CheckBox isPrivilegedCheckBox;
   }
 }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.cs	(revision 6381)
@@ -74,4 +74,5 @@
         executionTimeOnHiveTextBox.Text = string.Empty;
         useLocalPluginsCheckBox.Checked = false;
+        isPrivilegedCheckBox.Checked = false;
         hiveExperimentListView.Content = null;
         logView.Content = null;
@@ -81,4 +82,5 @@
         executionTimeOnHiveTextBox.Text = Content.ExecutionTimeOnHive.ToString();
         useLocalPluginsCheckBox.Checked = Content.UseLocalPlugins;
+        isPrivilegedCheckBox.Checked = Content.IsPrivileged;
         hiveExperimentListView.Content = Content.HiveExperiments;
         logView.Content = Content.Log;
@@ -93,8 +95,10 @@
         priorityTextBox.ReadOnly = this.ReadOnly;
         useLocalPluginsCheckBox.Enabled = !this.ReadOnly;
+        isPrivilegedCheckBox.Enabled = !this.ReadOnly; // TODO: check for user rights
       } else {
         resourceIdsTextBox.ReadOnly = false;
         priorityTextBox.ReadOnly = false;
         useLocalPluginsCheckBox.Enabled = false;
+        isPrivilegedCheckBox.Enabled = false;
       }
     }
@@ -112,7 +116,9 @@
       Content.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
     }
+
+    private void isPrivilegedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.IsPrivileged = isPrivilegedCheckBox.Checked;
+    }
     #endregion
-
-
   }
 }
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 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6381)
@@ -74,4 +74,11 @@
     }
 
+    [Storable]
+    private bool isPrivileged;
+    public bool IsPrivileged {
+      get { return isPrivileged; }
+      set { isPrivileged = value; }
+    }
+
     // [Storable] -> HiveExperiment can't be storable, so RefreshableHiveExperiment can't be stored
     private ItemCollection<RefreshableHiveExperiment> hiveExperiments = new ItemCollection<RefreshableHiveExperiment>();
@@ -108,4 +115,5 @@
       this.executionTimeOnHive = original.executionTimeOnHive;
       this.useLocalPlugins = original.useLocalPlugins;
+      this.IsPrivileged = original.IsPrivileged;
       // this.hiveExperiments = cloner.Clone(original.hiveExperiments); do not clone hiveExperiments - otherwise they would be sent with every job
     }
@@ -187,5 +195,5 @@
           //  }
           //} else if (coll.Parallel) {
-          if(coll.Parallel) {
+          if (coll.Parallel) {
             // clone the parent scope here and reuse it for each operation. otherwise for each job the whole scope-tree first needs to be copied and then cleaned, which causes a lot of work for the Garbage Collector
             IScope parentScopeClone = (IScope)((IAtomicOperation)coll.First()).Scope.Parent.Clone();
@@ -272,14 +280,12 @@
       IScope[] scopes = new Scope[jobs.Length];
       object locker = new object();
-      IDictionary<Guid, int> jobIndices = new Dictionary<Guid, int>();
       var hiveExperiment = refreshableHiveExperiment.HiveExperiment;
 
       try {
-        List<Guid> remainingJobIds = new List<Guid>();
-
         // create upload-tasks
-        var uploadTasks = new List<Task<Job>>();
         for (int i = 0; i < jobs.Length; i++) {
-          hiveExperiment.HiveJobs.Add(new EngineHiveJob(jobs[i], parentScopeClone));
+          var engineHiveJob = new EngineHiveJob(jobs[i], parentScopeClone);
+          engineHiveJob.Job.Priority = this.Priority;
+          hiveExperiment.HiveJobs.Add(engineHiveJob);
 
           // shuffle random variable to avoid the same random sequence in each operation; todo: does not yet work (it cannot find the random variable)
@@ -288,22 +294,22 @@
             random.Reset(random.Next());
         }
-        HiveClient.StartExperiment((e) => {
-          LogException(e);
-        }, refreshableHiveExperiment);
+        HiveClient.StartExperiment((e) => { LogException(e); }, refreshableHiveExperiment);
 
         // do polling until experiment is finished and all jobs are downloaded
         while (!refreshableHiveExperiment.AllJobsFinished()) {
-          Thread.Sleep(500);
+          Thread.Sleep(2000);
           this.ExecutionTimeOnHive = TimeSpan.FromMilliseconds(hiveExperiments.Sum(x => x.HiveExperiment.ExecutionTime.TotalMilliseconds));
           cancellationToken.ThrowIfCancellationRequested();
         }
         LogMessage(string.Format("{0} finished (TotalExecutionTime: {1}).", refreshableHiveExperiment.ToString(), refreshableHiveExperiment.HiveExperiment.ExecutionTime));
+
+        var failedJobs = hiveExperiment.HiveJobs.Where(x => x.Job.State == JobState.Failed);
+        if(failedJobs.Count() > 0) {
+          throw new HiveEngineException("Job failed: " + failedJobs.First().Job.StateLog.Last().Exception);
+        }
 
         // get scopes
         int j = 0;
         foreach (var hiveJob in hiveExperiment.HiveJobs) {
-          if (hiveJob.Job.State != JobState.Finished)
-            throw new HiveEngineException("Job failed: " + hiveJob.Job.StateLog.Last().Exception);
-
           var scope = ((IAtomicOperation)((EngineJob)hiveJob.ItemJob).InitialOperation).Scope;
           scopes[j++] = scope;
@@ -313,5 +319,5 @@
       catch (OperationCanceledException e) {
         lock (locker) {
-          if (jobIndices != null) DeleteHiveExperiment(hiveExperiment.Id);
+          DeleteHiveExperiment(hiveExperiment.Id);
         }
         throw e;
@@ -319,5 +325,5 @@
       catch (Exception e) {
         lock (locker) {
-          if (jobIndices != null) DeleteHiveExperiment(hiveExperiment.Id);
+          DeleteHiveExperiment(hiveExperiment.Id);
         }
         LogException(e);
@@ -333,4 +339,5 @@
         hiveExperiment.UseLocalPlugins = this.UseLocalPlugins;
         hiveExperiment.ResourceNames = this.ResourceNames;
+        hiveExperiment.IsPrivileged = this.IsPrivileged;
         var refreshableHiveExperiment = new RefreshableHiveExperiment(hiveExperiment);
         refreshableHiveExperiment.IsControllable = false;
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs	(revision 6373)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs	(revision 6381)
@@ -47,5 +47,5 @@
       GeneticAlgorithm alg = new GeneticAlgorithm();
       alg.Problem = new SingleObjectiveTestFunctionProblem();
-      alg.Engine = new HiveEngine() { ResourceNames = "CHRISTOPH-PC" };
+      alg.Engine = new HiveEngine() { ResourceNames = "HEAL" };
       alg.Elites.Value = 0;
       alg.PopulationSize.Value = 10;
