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 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs	(revision 5793)
@@ -159,8 +159,6 @@
         switch (container.Message) {
           case MessageContainer.MessageType.CalculateJob:
-            clientCom.LogMessage("Task.StartNew[0]: jobId: " + container.JobId);
             Task.Factory.StartNew((jobIdObj) => {
               Guid jobId = (Guid)jobIdObj;
-              clientCom.LogMessage("Task.StartNew[1]: jobId: " + jobId);
               Job job = wcfService.GetJob(jobId);
               if (job == null) throw new JobNotFoundException(jobId);
@@ -217,45 +215,51 @@
 
     private void DoPauseJob(Guid jobId) {
-      Job job = Jobs[jobId];
-
-      if (job != null) {
-        engines[job.Id].Pause();
-        JobData sJob = engines[job.Id].GetPausedJob();
-        // job.Exception = engines[job.Id].CurrentException; // can there be an exception if a job is paused
-        job.ExecutionTime = engines[job.Id].ExecutionTime;
-
-        try {
-          clientCom.LogMessage("Sending the paused job with id: " + job.Id);
-          wcfService.UpdateJobData(job, sJob, ConfigManager.Instance.GetClientInfo().Id, JobState.Paused);
-          SlaveStatusInfo.JobsProcessed++;    //TODO: count or not count, thats the question
-        }
-        catch (Exception e) {
-          clientCom.LogMessage("Transmitting to server failed. Storing the paused job with id: " + job.Id + " to hdd (" + e.ToString() + ")");
-        }
-        finally {
-          KillAppDomain(job.Id); // kill app-domain in every case          
-        }
-      }
-    }
-
-    private void DoStopJob(Guid guid) {
-      Job job = Jobs[guid];
-
-      if (job != null) {
-        engines[job.Id].Stop();
-        JobData sJob = engines[job.Id].GetFinishedJob();
-        // job.Exception = engines[job.Id].CurrentException; // can there be an exception if a job is stopped regularly
-        job.ExecutionTime = engines[job.Id].ExecutionTime;
-
-        try {
-          clientCom.LogMessage("Sending the stoppped job with id: " + job.Id);
-          wcfService.UpdateJobData(job, sJob, ConfigManager.Instance.GetClientInfo().Id, JobState.Paused);
-          SlaveStatusInfo.JobsProcessed++;    //TODO: count or not count, thats the question
-        }
-        catch (Exception e) {
-          clientCom.LogMessage("Transmitting to server failed. Storing the paused job with id: " + job.Id + " to hdd (" + e.ToString() + ")");
-        }
-        finally {
-          KillAppDomain(job.Id); // kill app-domain in every case          
+      if (!Jobs.ContainsKey(jobId)) {
+        clientCom.LogMessage("DoPauseJob: Can't find job with id " + jobId);
+      } else {
+        Job job = Jobs[jobId];
+
+        if (job != null) {
+          engines[job.Id].Pause();
+          JobData sJob = engines[job.Id].GetPausedJob();
+          job.ExecutionTime = engines[job.Id].ExecutionTime;
+
+          try {
+            clientCom.LogMessage("Sending the paused job with id: " + job.Id);
+            wcfService.UpdateJobData(job, sJob, ConfigManager.Instance.GetClientInfo().Id, JobState.Paused);
+            SlaveStatusInfo.JobsProcessed++;    //TODO: count or not count, thats the question
+          }
+          catch (Exception e) {
+            clientCom.LogMessage("Transmitting to server failed. Storing the paused job with id: " + job.Id + " to hdd (" + e.ToString() + ")");
+          }
+          finally {
+            KillAppDomain(job.Id); // kill app-domain in every case          
+          }
+        }
+      }
+    }
+
+    private void DoStopJob(Guid jobId) {
+      if (!Jobs.ContainsKey(jobId)) {
+        clientCom.LogMessage("DoStopJob: Can't find job with id " + jobId);
+      } else {
+        Job job = Jobs[jobId];
+
+        if (job != null) {
+          engines[job.Id].Stop();
+          JobData sJob = engines[job.Id].GetFinishedJob();
+          job.ExecutionTime = engines[job.Id].ExecutionTime;
+
+          try {
+            clientCom.LogMessage("Sending the stoppped job with id: " + job.Id);
+            wcfService.UpdateJobData(job, sJob, ConfigManager.Instance.GetClientInfo().Id, JobState.Finished);
+            SlaveStatusInfo.JobsProcessed++;    //TODO: count or not count, thats the question
+          }
+          catch (Exception e) {
+            clientCom.LogMessage("Transmitting to server failed. Storing the paused job with id: " + job.Id + " to hdd (" + e.ToString() + ")");
+          }
+          finally {
+            KillAppDomain(job.Id); // kill app-domain in every case          
+          }
         }
       }
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 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs	(revision 5793)
@@ -76,5 +76,5 @@
           Job.Resume(childjobs.Select(j => PersistenceUtil.Deserialize<IJob>(j.Data)));
         } else {
-          Job.Prepare();
+          // Job.Prepare(); // do NOT prepare here, otherwise paused jobs get restarted
           Job.Start();
         }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs	(revision 5793)
@@ -27,5 +27,5 @@
   public class AdministrationMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
     public override string Name {
-      get { return "& Administration"; }
+      get { return "&Administration (dev)"; }
     }
     public override IEnumerable<string> Structure {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs	(revision 5793)
@@ -71,10 +71,10 @@
     }
 
-    void Content_OptimizerJobChanged(object sender, EventArgs e) {
+    protected void Content_OptimizerJobChanged(object sender, EventArgs e) {
       RegisterJobEvents();
       Job_OptimizerChanged(this, e);
     }
 
-    void Job_OptimizerChanged(object sender, EventArgs e) {
+    protected void Job_OptimizerChanged(object sender, EventArgs e) {
       if (Content != null && Content.Job != null && Content.OptimizerJob.Optimizer != null) {
         optimizerNamedItemView.Content = Content.OptimizerJob.Optimizer;
@@ -130,4 +130,5 @@
           this.dateFinishedTextBox.Text = Content.Job.DateFinished.ToString();
           this.exceptionTextBox.Text = Content.Job.CurrentStateLog != null ? Content.Job.CurrentStateLog.Exception : string.Empty;
+          this.lastUpdatedTextBox.Text = Content.Job.LastJobDataUpdate.ToString();
           if (Content.OptimizerJob.ComputeInParallel) {
             this.stateLogViewHost.Content = new StateLogListList(
@@ -144,4 +145,5 @@
           this.exceptionTextBox.Text = string.Empty;
           this.stateLogViewHost.Content = null;
+          this.lastUpdatedTextBox.Text = string.Empty;
         }
         SetEnabledStateOfControls();
@@ -158,4 +160,5 @@
       this.dateFinishedTextBox.ReadOnly = true;
       this.exceptionTextBox.ReadOnly = true;
+      this.lastUpdatedTextBox.ReadOnly = true;
 
       this.priorityTextBox.ReadOnly = this.ReadOnly;
@@ -167,4 +170,5 @@
       this.pauseButton.Enabled = Content != null && Content.Job.State == JobState.Calculating;
       this.stopButton.Enabled = Content != null && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
+      this.showOptimizerButton.Enabled = Content != null && Content.Job.State == JobState.Paused && Content.OptimizerJob != null && Content.OptimizerJob.Optimizer != null;
 
       optimizerNamedItemView.ReadOnly = true;
@@ -204,4 +208,7 @@
       Content.Stop();
     }
+    private void showOptimizerButton_Click(object sender, EventArgs e) {
+      MainFormManager.MainForm.ShowContent(Content.OptimizerJob.Optimizer);
+    }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs	(revision 5793)
@@ -32,5 +32,11 @@
       this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.detailsTabPage = new System.Windows.Forms.TabPage();
+      this.restartButton = new System.Windows.Forms.Button();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
       this.optimizerGroupBox = new System.Windows.Forms.GroupBox();
+      this.showOptimizerButton = new System.Windows.Forms.Button();
+      this.lastUpdatedTextBox = new System.Windows.Forms.TextBox();
+      this.lastUpdatedLabel = new System.Windows.Forms.Label();
       this.optimizerNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
       this.configurationGroupBox = new System.Windows.Forms.GroupBox();
@@ -59,7 +65,4 @@
       this.exceptionTextBox = new System.Windows.Forms.TextBox();
       this.tabControl = new System.Windows.Forms.TabControl();
-      this.restartButton = new System.Windows.Forms.Button();
-      this.pauseButton = new System.Windows.Forms.Button();
-      this.stopButton = new System.Windows.Forms.Button();
       this.logTabPage.SuspendLayout();
       this.stateLogTabPage.SuspendLayout();
@@ -78,5 +81,5 @@
       this.logTabPage.Name = "logTabPage";
       this.logTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.logTabPage.Size = new System.Drawing.Size(406, 492);
+      this.logTabPage.Size = new System.Drawing.Size(611, 492);
       this.logTabPage.TabIndex = 1;
       this.logTabPage.Text = "Log";
@@ -125,5 +128,5 @@
       this.runsTabPage.Location = new System.Drawing.Point(4, 22);
       this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Size = new System.Drawing.Size(406, 492);
+      this.runsTabPage.Size = new System.Drawing.Size(611, 492);
       this.runsTabPage.TabIndex = 4;
       this.runsTabPage.Text = "Runs";
@@ -164,15 +167,82 @@
       this.detailsTabPage.UseVisualStyleBackColor = true;
       // 
+      // restartButton
+      // 
+      this.restartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.restartButton.Image = ((System.Drawing.Image)(resources.GetObject("restartButton.Image")));
+      this.restartButton.Location = new System.Drawing.Point(3, 465);
+      this.restartButton.Name = "restartButton";
+      this.restartButton.Size = new System.Drawing.Size(24, 24);
+      this.restartButton.TabIndex = 30;
+      this.restartButton.UseVisualStyleBackColor = true;
+      this.restartButton.Click += new System.EventHandler(this.restartButton_Click);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Enabled = false;
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(33, 465);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 31;
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(63, 465);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 32;
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
       // optimizerGroupBox
       // 
       this.optimizerGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerGroupBox.Controls.Add(this.showOptimizerButton);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedTextBox);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedLabel);
       this.optimizerGroupBox.Controls.Add(this.optimizerNamedItemView);
       this.optimizerGroupBox.Location = new System.Drawing.Point(6, 29);
       this.optimizerGroupBox.Name = "optimizerGroupBox";
-      this.optimizerGroupBox.Size = new System.Drawing.Size(599, 74);
+      this.optimizerGroupBox.Size = new System.Drawing.Size(599, 129);
       this.optimizerGroupBox.TabIndex = 28;
       this.optimizerGroupBox.TabStop = false;
       this.optimizerGroupBox.Text = "Optimizer";
+      // 
+      // showOptimizerButton
+      // 
+      this.showOptimizerButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.showOptimizerButton.Location = new System.Drawing.Point(12, 99);
+      this.showOptimizerButton.Name = "showOptimizerButton";
+      this.showOptimizerButton.Size = new System.Drawing.Size(581, 23);
+      this.showOptimizerButton.TabIndex = 3;
+      this.showOptimizerButton.Text = "Show Optimizer";
+      this.showOptimizerButton.UseVisualStyleBackColor = true;
+      this.showOptimizerButton.Click += new System.EventHandler(this.showOptimizerButton_Click);
+      // 
+      // lastUpdatedTextBox
+      // 
+      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastUpdatedTextBox.Location = new System.Drawing.Point(78, 73);
+      this.lastUpdatedTextBox.Name = "lastUpdatedTextBox";
+      this.lastUpdatedTextBox.Size = new System.Drawing.Size(515, 20);
+      this.lastUpdatedTextBox.TabIndex = 2;
+      // 
+      // lastUpdatedLabel
+      // 
+      this.lastUpdatedLabel.AutoSize = true;
+      this.lastUpdatedLabel.Location = new System.Drawing.Point(9, 76);
+      this.lastUpdatedLabel.Name = "lastUpdatedLabel";
+      this.lastUpdatedLabel.Size = new System.Drawing.Size(71, 13);
+      this.lastUpdatedLabel.TabIndex = 1;
+      this.lastUpdatedLabel.Text = "LastUpdated:";
       // 
       // optimizerNamedItemView
@@ -200,5 +270,5 @@
       this.configurationGroupBox.Controls.Add(this.computeInParallelLabel);
       this.configurationGroupBox.Controls.Add(this.computeInParallelCheckBox);
-      this.configurationGroupBox.Location = new System.Drawing.Point(6, 106);
+      this.configurationGroupBox.Location = new System.Drawing.Point(6, 164);
       this.configurationGroupBox.Name = "configurationGroupBox";
       this.configurationGroupBox.Size = new System.Drawing.Size(599, 119);
@@ -314,5 +384,5 @@
       this.jobStatusGroupBox.Controls.Add(this.dateFinishedLabel);
       this.jobStatusGroupBox.Controls.Add(this.exceptionTextBox);
-      this.jobStatusGroupBox.Location = new System.Drawing.Point(6, 226);
+      this.jobStatusGroupBox.Location = new System.Drawing.Point(6, 289);
       this.jobStatusGroupBox.Name = "jobStatusGroupBox";
       this.jobStatusGroupBox.Size = new System.Drawing.Size(599, 162);
@@ -444,38 +514,4 @@
       this.tabControl.Size = new System.Drawing.Size(619, 518);
       this.tabControl.TabIndex = 25;
-      // 
-      // 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, 465);
-      this.restartButton.Name = "restartButton";
-      this.restartButton.Size = new System.Drawing.Size(24, 24);
-      this.restartButton.TabIndex = 30;
-      this.restartButton.UseVisualStyleBackColor = true;
-      this.restartButton.Click += new System.EventHandler(this.restartButton_Click);
-      // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Enabled = false;
-      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
-      this.pauseButton.Location = new System.Drawing.Point(33, 465);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 31;
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
-      // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
-      this.stopButton.Location = new System.Drawing.Point(63, 465);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 32;
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
       // 
       // HiveJobView
@@ -492,4 +528,5 @@
       this.detailsTabPage.PerformLayout();
       this.optimizerGroupBox.ResumeLayout(false);
+      this.optimizerGroupBox.PerformLayout();
       this.configurationGroupBox.ResumeLayout(false);
       this.configurationGroupBox.PerformLayout();
@@ -525,13 +562,9 @@
     private System.Windows.Forms.GroupBox jobStatusGroupBox;
     private System.Windows.Forms.TextBox stateTextBox;
-    private System.Windows.Forms.Label dateCalculatedLabel;
     private System.Windows.Forms.Label stateLabel;
-    private System.Windows.Forms.TextBox dateCalculatedText;
     private System.Windows.Forms.TextBox dateFinishedTextBox;
     private System.Windows.Forms.TextBox executionTimeTextBox;
-    private System.Windows.Forms.TextBox dateCreatedTextBox;
     private System.Windows.Forms.Label executionTimeLabel;
     private System.Windows.Forms.Label exceptionLabel;
-    private System.Windows.Forms.Label dateCreatedLabel;
     private System.Windows.Forms.Label dateFinishedLabel;
     private System.Windows.Forms.TextBox exceptionTextBox;
@@ -540,4 +573,11 @@
     private System.Windows.Forms.Button pauseButton;
     private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button showOptimizerButton;
+    private System.Windows.Forms.TextBox lastUpdatedTextBox;
+    private System.Windows.Forms.Label lastUpdatedLabel;
+    private System.Windows.Forms.Label dateCalculatedLabel;
+    private System.Windows.Forms.TextBox dateCalculatedText;
+    private System.Windows.Forms.TextBox dateCreatedTextBox;
+    private System.Windows.Forms.Label dateCreatedLabel;
 
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.cs	(revision 5793)
@@ -52,5 +52,5 @@
       item.ItemsRemoved -= new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
       item.CollectionReset -= new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset);
-      item.ToStringChanged -= new System.EventHandler(item_ToStringChanged);
+      item.ToStringChanged -= new EventHandler(item_ToStringChanged);
       item.ItemImageChanged -= new EventHandler(item_ItemImageChanged);
       foreach (TreeNode childNode in node.Nodes) {
@@ -70,5 +70,5 @@
       item.ItemsRemoved += new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved);
       item.CollectionReset += new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset);
-      item.ToStringChanged += new System.EventHandler(item_ToStringChanged);
+      item.ToStringChanged += new EventHandler(item_ToStringChanged);
       item.ItemImageChanged += new EventHandler(item_ItemImageChanged);
       foreach (TreeNode childNode in node.Nodes) {
@@ -78,5 +78,80 @@
 
     #region Event Handlers (Content)
-    // Put event handlers of the content here
+    private void item_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsAdded), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as IItemTree);
+        foreach (IItemTree item in e.Items) {
+          AddChildNodes(item, node.Nodes, true);
+          node.ExpandAll();
+          UpdateNodeItemImage(node);
+        }
+      }
+    }
+
+    private void item_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_ItemsRemoved), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as IItemTree);
+        foreach (IItemTree item in e.Items) {
+          RemoveChildNodes(item, node.Nodes);
+        }
+        RebuildImageList();
+      }
+    }
+
+    private void item_CollectionReset(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IItemTree>(item_CollectionReset), sender, e);
+      } else {
+        TreeNode node = GetNodeByItem(sender as IItemTree);
+        foreach (IItemTree item in e.OldItems) {
+          RemoveChildNodes(item, node.Nodes);
+        }
+        RebuildImageList();
+        foreach (IItemTree item in e.Items) {
+          AddChildNodes(item, node.Nodes, true);
+        }
+      }
+    }
+
+    private void item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(item_ToStringChanged), sender, e);
+      } else {
+        var item = sender as IItemTree;
+        TreeNode node = GetNodeByItem(item);
+        node.Text = item.ToString();
+      }
+    }
+
+    private void item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(item_ItemImageChanged), sender, e);
+      } else {
+        var item = sender as IItemTree;
+        TreeNode node = GetNodeByItem(item);
+        UpdateNodeItemImage(node);
+      }
+    }
+
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(treeView_DoubleClick), sender, e);
+      } else {
+        if (treeView.SelectedNode != null) {
+          var item = treeView.SelectedNode.Tag as IItemTree;
+          if (item != null) {
+            IContentView view = MainFormManager.MainForm.ShowContent(item);
+            if (view != null) {
+              view.ReadOnly = ReadOnly;
+              view.Locked = Locked;
+            }
+          }
+        }
+      }
+    }
     #endregion
 
@@ -86,4 +161,5 @@
         // Add code when content has been changed and is null
         ClearNodes();
+        detailsViewHost.Content = null;
       } else {
         // Add code when content has been changed and is not null
@@ -122,45 +198,5 @@
       treeNodeCollection.RemoveAt(idx);
     }
-
-    private void item_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
-      TreeNode node = GetNodeByItem(sender as IItemTree);
-      foreach (IItemTree item in e.Items) {
-        AddChildNodes(item, node.Nodes, true);
-        node.ExpandAll();
-        UpdateNodeItemImage(node);
-      }
-    }
-
-    private void item_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
-      TreeNode node = GetNodeByItem(sender as IItemTree);
-      foreach (IItemTree item in e.Items) {
-        RemoveChildNodes(item, node.Nodes);
-      }
-      RebuildImageList();
-    }
-
-    private void item_CollectionReset(object sender, CollectionItemsChangedEventArgs<IItemTree> e) {
-      TreeNode node = GetNodeByItem(sender as IItemTree);
-      foreach (IItemTree item in e.OldItems) {
-        RemoveChildNodes(item, node.Nodes);
-      }
-      RebuildImageList();
-      foreach (IItemTree item in e.Items) {
-        AddChildNodes(item, node.Nodes, true);
-      }
-    }
-
-    private void item_ToStringChanged(object sender, EventArgs e) {
-      var item = sender as IItemTree;
-      TreeNode node = GetNodeByItem(item);
-      node.Text = item.ToString();
-    }
-
-    private void item_ItemImageChanged(object sender, EventArgs e) {
-      var item = sender as IItemTree;
-      TreeNode node = GetNodeByItem(item);
-      UpdateNodeItemImage(node);
-    }
-
+    
     private TreeNode GetNodeByItem(IItemTree item) {
       TreeNode found = null;
@@ -212,5 +248,5 @@
     // Put event handlers of child controls here.
     private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      viewHost.Content = (IContent)treeView.SelectedNode.Tag;
+      detailsViewHost.Content = (IContent)treeView.SelectedNode.Tag;
     }
     #endregion
@@ -232,17 +268,4 @@
       }
     }
-
-    private void treeView_DoubleClick(object sender, EventArgs e) {
-      if (treeView.SelectedNode != null) {
-        var item = treeView.SelectedNode.Tag as IItemTree;
-        if (item != null) {
-          IContentView view = MainFormManager.MainForm.ShowContent(item);
-          if (view != null) {
-            view.ReadOnly = ReadOnly;
-            view.Locked = Locked;
-          }
-        }
-      }
-    }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ItemTreeView.designer.cs	(revision 5793)
@@ -29,5 +29,5 @@
       this.imageList = new System.Windows.Forms.ImageList(this.components);
       this.detailsGroupBox = new System.Windows.Forms.GroupBox();
-      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.detailsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
@@ -77,5 +77,5 @@
       // detailsGroupBox
       // 
-      this.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Controls.Add(this.detailsViewHost);
       this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
       this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
@@ -86,17 +86,17 @@
       this.detailsGroupBox.Text = "Details";
       // 
-      // viewHost
+      // detailsViewHost
       // 
-      this.viewHost.Caption = "View";
-      this.viewHost.Content = null;
-      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.viewHost.Enabled = false;
-      this.viewHost.Location = new System.Drawing.Point(3, 16);
-      this.viewHost.Name = "viewHost";
-      this.viewHost.ReadOnly = false;
-      this.viewHost.Size = new System.Drawing.Size(414, 444);
-      this.viewHost.TabIndex = 0;
-      this.viewHost.ViewsLabelVisible = true;
-      this.viewHost.ViewType = null;
+      this.detailsViewHost.Caption = "View";
+      this.detailsViewHost.Content = null;
+      this.detailsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsViewHost.Enabled = false;
+      this.detailsViewHost.Location = new System.Drawing.Point(3, 16);
+      this.detailsViewHost.Name = "detailsViewHost";
+      this.detailsViewHost.ReadOnly = false;
+      this.detailsViewHost.Size = new System.Drawing.Size(414, 444);
+      this.detailsViewHost.TabIndex = 0;
+      this.detailsViewHost.ViewsLabelVisible = true;
+      this.detailsViewHost.ViewType = null;
       // 
       // ItemTreeView
@@ -119,5 +119,5 @@
     private System.Windows.Forms.SplitContainer splitContainer;
     private System.Windows.Forms.TreeView treeView;
-    private MainForm.WindowsForms.ViewHost viewHost;
+    private MainForm.WindowsForms.ViewHost detailsViewHost;
     private System.Windows.Forms.ImageList imageList;
     private System.Windows.Forms.GroupBox detailsGroupBox;
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs	(revision 5793)
@@ -27,5 +27,5 @@
   public class ExperimentManagerMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
     public override string Name {
-      get { return "&Experiment Manager 3.4"; }
+      get { return "&Experiment Manager (dev)"; }
     }
     public override IEnumerable<string> Structure {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveExperimentClient.cs	(revision 5793)
@@ -495,6 +495,4 @@
       jobResultPoller.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
       jobResultPoller.JobResultsReceived += new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
-      jobResultPoller.PollingStarted += new EventHandler(jobResultPoller_PollingStarted);
-      jobResultPoller.PollingFinished += new EventHandler(jobResultPoller_PollingFinished);
       jobResultPoller.IsPollingChanged += new EventHandler(jobResultPoller_IsPollingChanged);
     }
@@ -502,16 +500,8 @@
       jobResultPoller.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
       jobResultPoller.JobResultsReceived -= new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
-      jobResultPoller.PollingStarted -= new EventHandler(jobResultPoller_PollingStarted);
-      jobResultPoller.PollingFinished -= new EventHandler(jobResultPoller_PollingFinished);
       jobResultPoller.IsPollingChanged -= new EventHandler(jobResultPoller_IsPollingChanged);
     }
     private void jobResultPoller_IsPollingChanged(object sender, EventArgs e) {
       this.IsPollingResults = jobResultPoller.IsPolling;
-    }
-    private void jobResultPoller_PollingFinished(object sender, EventArgs e) {
-      LogMessage("Polling results finished");
-    }
-    private void jobResultPoller_PollingStarted(object sender, EventArgs e) {
-      LogMessage("Polling results started");
     }
     private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightJob>> e) {
@@ -527,16 +517,13 @@
             OptimizerJob optimizerJob = LoadOptimizerJob(hj.Job.Id);
             if (optimizerJob == null) {
-              // something bad happened to this job. set to finished to allow the rest beeing downloaded
-              //hj.IsFinishedOptimizerDownloaded = true;
+              // something bad happened to this job. bad job, BAAAD job!
             } else {
               // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
               if (hj.Job.State == JobState.Paused) {
-                
+                hj.OptimizerJob = optimizerJob;
               } else {
                 if (lightweightJob.ParentJobId.HasValue) {
                   HiveJob parentHiveJob = HiveJob.GetHiveJobByJobId(lightweightJob.ParentJobId.Value);
                   parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.Job.Id);
-                } else {
-                  //this.HiveJob.IsFinishedOptimizerDownloaded = true;
                 }
               }
@@ -554,5 +541,4 @@
 
     private bool AllJobsFinished() {
-      //return HiveJob.GetAllHiveJobs().All(hj => hj.IsFinishedOptimizerDownloaded);
       return HiveJob.GetAllHiveJobs().All(j => j.Job.State == JobState.Finished
                                             || j.Job.State == JobState.Aborted
@@ -623,24 +609,4 @@
         this.HiveJob = allHiveJobs[this.rootJobId];
 
-
-        //// download them first
-        //IDictionary<Guid, Job> allJobs = new Dictionary<Guid, Job>();
-        //IDictionary<Guid, JobData> allJobDatas = new Dictionary<Guid, JobData>();
-        //foreach (LightweightJob lightweightJob in allResults) {
-        //  jobCount++;
-        //  progress.Status = string.Format("Downloading {0} of {1} jobs...", jobCount, totalJobCount);
-        //  allJobs.Add(lightweightJob.Id, service.GetJob(lightweightJob.Id));
-        //  allJobDatas.Add(lightweightJob.Id, service.GetJobData(lightweightJob.Id));
-        //  progress.ProgressValue = (double)jobCount / totalJobCount;
-        //}
-
-        //jobCount = 1;
-        //progress.Status = string.Format("Deserializing {0} of {1} jobs... ({2} kb)", jobCount, totalJobCount, allJobDatas[this.rootJobId].Data.Count() / 1024);
-        //this.HiveJob = new HiveJob(allJobs[this.rootJobId], allJobDatas[this.rootJobId], false);
-        //allJobDatas.Remove(this.rootJobId); // reduce memory footprint
-        //allJobs.Remove(this.rootJobId);
-        //progress.ProgressValue = (double)jobCount / totalJobCount;
-
-
         if (this.HiveJob.Job.DateFinished.HasValue && this.HiveJob.Job.DateCreated.HasValue) {
           this.ExecutionTime = this.HiveJob.Job.DateFinished.Value - this.HiveJob.Job.DateCreated.Value;
@@ -656,5 +622,4 @@
 
         // build child-job tree
-        //LoadChildResults(service, this.HiveJob, allResults, allJobs, allJobDatas, progress, totalJobCount, ref jobCount);
         BuildHiveJobTree(this.HiveJob, allJobs, allHiveJobs);
         StartResultPolling();
@@ -739,40 +704,4 @@
       return pluginDatas;
     }
-
-    /// <summary>
-    /// Gets the Ids of all plugins needed for executing the job.
-    /// All loaded plugins are assumed to be necessary.
-    /// If a plugin with the same name and version is already online, it is used. Otherwise the local plugin is uploaded.
-    /// If useLocalPlugins is true, all local plugins are uploaded regardless of the existence of the same plugin online.
-    /// </summary>
-    //public static List<Guid> GetPluginsNeededIds(bool useLocalPlugins) {
-    //  IEnumerable<IPluginDescription> localPlugins = ApplicationManager.Manager.Plugins;
-    //  List<Guid> pluginsNeededIds = new List<Guid>();
-
-    //  using (var service = ServiceLocator.Instance.GetService()) {
-    //    IEnumerable<Plugin> onlinePlugins = service.Obj.GetPlugins();
-
-    //    foreach (IPluginDescription localPlugin in localPlugins) {
-    //      Plugin found = onlinePlugins.Where(onlinePlugin => onlinePlugin.Name == localPlugin.Name && onlinePlugin.Version == localPlugin.Version).SingleOrDefault();
-    //      if (!useLocalPlugins && found != null) {
-    //        // plugin is available online; reuse
-    //        pluginsNeededIds.Add(found.Id);
-    //      } else {
-    //        // upload the plugin
-    //        Plugin p = new Plugin() { Name = localPlugin.Name, Version = localPlugin.Version, IsLocal = useLocalPlugins };
-    //        List<PluginData> pluginDatas = new List<PluginData>();
-
-    //        foreach (IPluginFile pf in localPlugin.Files) {
-    //          PluginData pluginData = new PluginData();
-
-    //          pluginData.Data = File.ReadAllBytes(pf.Name);
-    //          pluginDatas.Add(pluginData);
-    //        }
-    //        pluginsNeededIds.Add(service.Obj.AddPlugin(p, pluginDatas));
-    //      }
-    //    }
-    //  }
-    //  return pluginsNeededIds;
-    //}
     #endregion
 
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs	(revision 5793)
@@ -70,5 +70,5 @@
     public OptimizerJob OptimizerJob {
       get { return optimizerJob; }
-      private set {
+      internal set {
         if (optimizerJob != null && syncJobsWithOptimizers) {
           this.childHiveJobs.Clear();
@@ -289,4 +289,10 @@
       syncJobsWithOptimizers = false;
       if (this.OptimizerJob != null && hiveJob.OptimizerJob != null) {
+        // if job is in state Paused, it has to preserve its ResultCollection, which is cleared when a optimizer is added to an experiment
+        OptimizerJob optimizerJobClone = null;
+        if (hiveJob.Job.State == JobState.Paused) {
+          optimizerJobClone = (OptimizerJob)hiveJob.OptimizerJob.Clone();
+        }
+
         if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
           if (!this.OptimizerJob.OptimizerAsExperiment.Optimizers.Contains(hiveJob.OptimizerJob.Optimizer)) {
@@ -295,4 +301,8 @@
         } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
           UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, hiveJob.OptimizerJob);
+        }
+
+        if (hiveJob.Job.State == JobState.Paused) {
+          hiveJob.OptimizerJob = optimizerJobClone;
         }
       }
@@ -524,5 +534,5 @@
     private void OnOptimizerJobChanged() {
       OptimizerJob_ComputeInParallelChanged(this, EventArgs.Empty);
-      var handler = JobChanged;
+      var handler = OptimizerJobChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -649,5 +659,13 @@
 
     public void Restart() {
-      ServiceLocator.Instance.CallHiveService(s => s.RestartJob(this.job.Id));
+      ServiceLocator.Instance.CallHiveService(service => {
+        JobData jobData = new JobData();
+        jobData.JobId = this.job.Id;
+        jobData.Data = PersistenceUtil.Serialize(this.optimizerJob);
+        service.UpdateJobData(this.Job, jobData);
+        service.RestartJob(this.job.Id);
+        Job job = service.GetJob(this.job.Id);
+        this.job.LastJobDataUpdate = job.LastJobDataUpdate;
+      });
     }
   }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobDownloader.cs	(revision 5793)
@@ -88,5 +88,4 @@
         HiveJob hiveJob = new HiveJob(job, jobData, false);
         jobData.Data = null; // reduce memory consumption.
-        hiveJob.OptimizerJob.Prepare(); // reduce memory consumption.
         hiveJob.Job = job;
         return hiveJob;
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs	(revision 5792)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs	(revision 5793)
@@ -2,4 +2,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Permissions;
 using System.ServiceModel;
 using HeuristicLab.Services.Hive.Common;
@@ -32,6 +33,6 @@
 
     #region Job Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
       return trans.UseTransaction(() => {
@@ -52,6 +53,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
       return trans.UseTransaction(() => {
@@ -61,39 +62,39 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public Job GetJob(Guid jobId) {
       return dao.GetJob(jobId);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<Job> GetJobs() {
       return dao.GetJobs(x => true);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
       return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
       return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public JobData GetJobData(Guid jobId) {
       return dao.GetJobData(jobId);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void UpdateJob(Job job) {
       trans.UseTransaction(() => {
@@ -102,7 +103,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void UpdateJobData(Job job, JobData jobData) {
       trans.UseTransaction(() => {
@@ -113,7 +114,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void DeleteJob(Guid jobId) {
       trans.UseTransaction(() => {
@@ -122,7 +123,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void DeleteChildJobs(Guid parentJobId) {
       trans.UseTransaction(() => {
@@ -135,7 +136,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public Job UpdateJobState(Guid jobId, JobState jobState, Guid? slaveId, Guid? userId, string exception) {
       return trans.UseTransaction(() => {
@@ -155,7 +156,7 @@
 
     #region Job Control Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void StopJob(Guid jobId) {
       trans.UseTransaction(() => {
@@ -167,7 +168,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void PauseJob(Guid jobId) {
       trans.UseTransaction(() => {
@@ -179,7 +180,7 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void RestartJob(Guid jobId) {
       trans.UseTransaction(() => {
@@ -192,6 +193,6 @@
 
     #region HiveExperiment Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public HiveExperiment GetHiveExperiment(Guid id) {
       return dao.GetHiveExperiments(x =>
@@ -201,17 +202,17 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<HiveExperiment> GetHiveExperiments() {
       return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]    
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]    
     public IEnumerable<HiveExperiment> GetAllHiveExperiments() {
       return dao.GetHiveExperiments(x => true);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
       return trans.UseTransaction(() => {
@@ -222,6 +223,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
       trans.UseTransaction(() => {
@@ -230,6 +231,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void DeleteHiveExperiment(Guid hiveExperimentId) {
       trans.UseTransaction(() => {
@@ -241,5 +242,5 @@
 
     #region Login Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void Hello(Slave slaveInfo) {
       trans.UseTransaction(() => {
@@ -254,5 +255,5 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public void GoodBye(Guid slaveId) {
       trans.UseTransaction(() => {
@@ -267,5 +268,5 @@
 
     #region Heartbeat Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
       TriggerLifecycle(false);
@@ -275,6 +276,6 @@
 
     #region Plugin Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
       return trans.UseTransaction(() => {
@@ -290,14 +291,14 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public IEnumerable<Plugin> GetPlugins() {
       return dao.GetPlugins(x => x.IsLocal == false);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
     public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
       List<PluginData> pluginDatas = new List<PluginData>();
@@ -319,18 +320,18 @@
 
     #region Slave Methods
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddSlave(Slave slave) {
       return trans.UseTransaction(() => dao.AddSlave(slave));
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
       return trans.UseTransaction(() => dao.AddSlaveGroup(slaveGroup));
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Slave GetSlave(Guid slaveId) {
       return dao.GetSlave(slaveId);
@@ -341,18 +342,18 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<Slave> GetSlaves() {
       return dao.GetSlaves(x => true);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public IEnumerable<SlaveGroup> GetSlaveGroups() {
       return dao.GetSlaveGroups(x => true);
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void UpdateSlave(Slave slave) {
       trans.UseTransaction(() => {
@@ -361,6 +362,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
       trans.UseTransaction(() => {
@@ -369,6 +370,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void DeleteSlave(Guid slaveId) {
       trans.UseTransaction(() => {
@@ -377,6 +378,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void DeleteSlaveGroup(Guid slaveGroupId) {
       trans.UseTransaction(() => {
@@ -385,6 +386,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
       trans.UseTransaction(() => {
@@ -395,6 +396,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
       trans.UseTransaction(() => {
@@ -405,6 +406,6 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     public Guid GetResourceId(string resourceName) {
       return trans.UseTransaction(() => {
@@ -450,10 +451,10 @@
     #region Appointment Methods
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     public Guid AddAppointment(Appointment appointment) {
       return trans.UseTransaction(() => dao.AddAppointment(appointment));
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     public void DeleteAppointment(Guid appointmentId) {
       trans.UseTransaction(() => {
@@ -462,5 +463,5 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     public void UpdateAppointment(Appointment appointment) {
       trans.UseTransaction(() => {
@@ -469,5 +470,5 @@
     }
 
-    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     public IEnumerable<Appointment> GetScheduleForResource(Guid resourceId) {
       return trans.UseTransaction(() => dao.GetAppointments(x => x.ResourceId == resourceId));
