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 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs	(revision 6200)
@@ -46,5 +46,5 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.JobItemChanged += new EventHandler(Content_JobItemChanged);
+      Content.ItemJobChanged += new EventHandler(Content_JobItemChanged);
       Content.JobChanged += new EventHandler(Content_JobChanged);
       Content.JobStateChanged += new EventHandler(Content_JobStateChanged);
@@ -52,5 +52,5 @@
 
     protected override void DeregisterContentEvents() {
-      Content.JobItemChanged -= new EventHandler(Content_JobItemChanged);
+      Content.ItemJobChanged -= new EventHandler(Content_JobItemChanged);
       Content.JobChanged -= new EventHandler(Content_JobChanged);
       Content.JobStateChanged -= new EventHandler(Content_JobStateChanged);
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs	(revision 6200)
@@ -21,5 +21,4 @@
 
 using System;
-using System.ComponentModel;
 using System.Linq;
 using System.Threading;
@@ -58,13 +57,14 @@
       base.RegisterContentEvents();
       Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
       Content.HiveExperimentChanged += new EventHandler(Content_HiveExperimentChanged);
       Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
-    }
+      Content.JobStatisticsChanged += new EventHandler(Content_JobStatisticsChanged);
+    }
+
     protected override void DeregisterContentEvents() {
       Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
-      Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
       Content.HiveExperimentChanged -= new EventHandler(Content_HiveExperimentChanged);
       Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
+      Content.JobStatisticsChanged -= new EventHandler(Content_JobStatisticsChanged);
       base.DeregisterContentEvents();
     }
@@ -104,7 +104,4 @@
         //includeJobsCheckBox.Checked = false;
         refreshAutomaticallyCheckBox.Checked = false;
-        jobsTextBox.Text = "0";
-        calculatingTextBox.Text = "0";
-        finishedTextBox.Text = "0";
         logView.Content = null;
       } else {
@@ -115,9 +112,7 @@
         //includeJobsCheckBox.Checked = Content.IncludeJobs;
         refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
-        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
-        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
-        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
         logView.Content = Content.Log;
       }
+      Content_JobStatisticsChanged(this, EventArgs.Empty);
       Content_HiveExperimentChanged(this, EventArgs.Empty);
       Content_HiveJobChanged(this, EventArgs.Empty);
@@ -233,14 +228,4 @@
     }
 
-    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-      if (InvokeRequired)
-        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
-      else {
-        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
-        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
-        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
-      }
-    }
-
     private void Content_HiveExperimentChanged(object sender, EventArgs e) {
       if (Content.HiveExperiment != null) {
@@ -252,9 +237,24 @@
       SetEnabledStateOfControls();
     }
+    private void Content_JobStatisticsChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_JobStatisticsChanged), sender, e);
+      else {
+        if (Content != null) {
+          jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
+          calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
+          finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
+        } else {
+          jobsTextBox.Text = "0";
+          calculatingTextBox.Text = "0";
+          finishedTextBox.Text = "0";
+        }
+      }
+    }
     #endregion
 
     #region Control events
     private void startButton_Click(object sender, EventArgs e) {
-      ExperimentManagerClient.StartExperiment(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex)), Content);
+      ExperimentManagerClient.StartExperiment((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex), Content);
     }
     private void pauseButton_Click(object sender, EventArgs e) {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/HiveException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/HiveException.cs	(revision 6200)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/HiveException.cs	(revision 6200)
@@ -0,0 +1,29 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.Hive {
+  public class HiveException : Exception {
+    public HiveException(string message) : base(message) { }
+    public HiveException(string message, Exception innerException) : base(message, innerException) { }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ConcurrentJobDownloader.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ConcurrentJobDownloader.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ConcurrentJobDownloader.cs	(revision 6200)
@@ -21,11 +21,15 @@
 
     public void DownloadJob(Job job, Action<Job, T, Exception> onFinishedAction) {
-      Task<JobData>.Factory.StartNew((x) => DownloadJob(x), job.Id)
-                                     .ContinueWith((x) => DeserializeJob(x.Result))
-                                     .ContinueWith((x) => OnJobFinished(job, x, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously);
+      Task<T> task = Task<JobData>.Factory.StartNew((x) => DownloadJob(x), job.Id)
+                                     .ContinueWith((x) => DeserializeJob(x.Result));
+      task.ContinueWith((x) => OnJobFinished(job, x, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion);
+      task.ContinueWith((x) => OnJobFailed(job, x, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnFaulted);
     }
 
     private void OnJobFinished(Job job, Task<T> task, Action<Job, T, Exception> onFinishedAction) {
-      onFinishedAction(job, task.Result, task.Exception);
+      onFinishedAction(job, task.Result, null);
+    }
+    private void OnJobFailed(Job job, Task<T> task, Action<Job, T, Exception> onFinishedAction) {
+      onFinishedAction(job, task.Result, task.Exception.Flatten());
     }
 
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 6200)
@@ -239,5 +239,5 @@
       }
     }
-
+    
     /// <summary>
     /// Uploads the local configuration file as plugin
@@ -286,5 +286,7 @@
       }
 
-      hiveJob.Job.PluginsNeededIds = PluginUtil.GetPluginDependencies(service, this.onlinePlugins, this.alreadyUploadedPlugins, plugins, useLocalPlugins);
+      TryAndRepeat(() => {
+        hiveJob.Job.PluginsNeededIds = PluginUtil.GetPluginDependencies(service, this.onlinePlugins, this.alreadyUploadedPlugins, plugins, useLocalPlugins);
+      }, -1, "Failed to upload plugins");
       hiveJob.Job.PluginsNeededIds.Add(configPluginId);
       hiveJob.Job.HiveExperimentId = hiveExperimentId;
@@ -293,9 +295,12 @@
       progress.ProgressValue = (double)jobCount / totalJobCount;
 
-      if (parentHiveJob != null) {
-        hiveJob.Job.Id = service.AddChildJob(parentHiveJob.Job.Id, hiveJob.Job, jobData);
-      } else {
-        hiveJob.Job.Id = service.AddJob(hiveJob.Job, jobData, groups.ToList());
-      }
+
+      TryAndRepeat(() => {
+        if (parentHiveJob != null) {
+          hiveJob.Job.Id = service.AddChildJob(parentHiveJob.Job.Id, hiveJob.Job, jobData);
+        } else {
+          hiveJob.Job.Id = service.AddJob(hiveJob.Job, jobData, groups.ToList());
+        }
+      }, -1, "Failed to add job");
 
       foreach (HiveJob child in hiveJob.ChildHiveJobs) {
@@ -382,4 +387,18 @@
       }
     }
+
+    /// <summary>
+    /// Executes the action. If it throws an exception it is repeated until repetition-count is reached.
+    /// If repetitions is -1, it is repeated infinitely.
+    /// </summary>
+    public static void TryAndRepeat(Action action, int repetitions, string errorMessage) {
+      try { action(); }
+      catch (Exception e) {
+        repetitions--;
+        if (repetitions == 0)
+          throw new HiveException(errorMessage, e);
+        TryAndRepeat(action, repetitions, errorMessage);
+      }
+    }
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6200)
@@ -86,5 +86,5 @@
           itemJob = value;
           RegisterItemJobEvents();
-          OnJobItemChanged();
+          OnItemJobChanged();
           IsFinishedJobDownloaded = true;
         }
@@ -166,12 +166,12 @@
     protected virtual void RegisterItemJobEvents() {
       if (ItemJob != null) {
-        ItemJob.ComputeInParallelChanged += new EventHandler(JobItem_ComputeInParallelChanged);
-        ItemJob.ToStringChanged += new EventHandler(JobItem_ToStringChanged);
+        ItemJob.ComputeInParallelChanged += new EventHandler(ItemJob_ComputeInParallelChanged);
+        ItemJob.ToStringChanged += new EventHandler(ItemJob_ToStringChanged);
       }
     }
     protected virtual void DergisterItemJobEvents() {
       if (ItemJob != null) {
-        ItemJob.ComputeInParallelChanged -= new EventHandler(JobItem_ComputeInParallelChanged);
-        ItemJob.ToStringChanged -= new EventHandler(JobItem_ToStringChanged);
+        ItemJob.ComputeInParallelChanged -= new EventHandler(ItemJob_ComputeInParallelChanged);
+        ItemJob.ToStringChanged -= new EventHandler(ItemJob_ToStringChanged);
       }
     }
@@ -188,9 +188,9 @@
     }
 
-    protected virtual void JobItem_ToStringChanged(object sender, EventArgs e) {
+    protected virtual void ItemJob_ToStringChanged(object sender, EventArgs e) {
       this.OnToStringChanged();
     }
 
-    protected virtual void JobItem_ComputeInParallelChanged(object sender, EventArgs e) {
+    protected virtual void ItemJob_ComputeInParallelChanged(object sender, EventArgs e) {
       if (ItemJob != null && syncJobsWithOptimizers) {
         this.UpdateChildHiveJobs();
@@ -203,8 +203,8 @@
 
     public override string ToString() {
-      if (itemJob != null) {
+      if (itemJob != null && itemJob.Item != null) {
         return itemJob.ToString();
       } else {
-        return base.ToString();
+        return Job.Id.ToString();
       }
     }
@@ -262,8 +262,8 @@
     }
 
-    public event EventHandler JobItemChanged;
-    private void OnJobItemChanged() {
-      JobItem_ComputeInParallelChanged(this, EventArgs.Empty);
-      var handler = JobItemChanged;
+    public event EventHandler ItemJobChanged;
+    private void OnItemJobChanged() {
+      ItemJob_ComputeInParallelChanged(this, EventArgs.Empty);
+      var handler = ItemJobChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -410,4 +410,10 @@
     public virtual void IntegrateChild(ItemJob job, Guid childJobId) { }
 
+    /// <summary>
+    /// Delete ItemJob
+    /// </summary>
+    public void ClearData() {
+      this.ItemJob.Item = null;
+    }
   }
 
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6200)
@@ -28,8 +28,6 @@
 using HeuristicLab.Core;
 using HeuristicLab.Hive;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Clients.Hive {
-  [StorableClass]
   public class RefreshableHiveExperiment : IHiveItem, IDeepCloneable, IContent, IProgressReporter {
     private JobResultPoller jobResultPoller;
@@ -37,5 +35,4 @@
     private static object locker = new object();
 
-    [Storable]
     private HiveExperiment hiveExperiment;
     public HiveExperiment HiveExperiment {
@@ -55,5 +52,4 @@
 
     /** include jobs when refreshing **/
-    [Storable]
     private bool includeJobs;
     public bool IncludeJobs {
@@ -62,5 +58,4 @@
     }
 
-    [Storable]
     private bool refreshAutomatically;
     public bool RefreshAutomatically {
@@ -83,5 +78,4 @@
     }
 
-    [Storable]
     private bool isControllable = true;
     public bool IsControllable {
@@ -95,5 +89,4 @@
     }
 
-    [Storable]
     private ILog log;
     public ILog Log {
@@ -120,8 +113,8 @@
       cloner.RegisterClonedObject(original, this);
       this.HiveExperiment = original.HiveExperiment;
-      this.RefreshAutomatically = original.RefreshAutomatically;
       this.IncludeJobs = original.IncludeJobs;
       this.IsControllable = original.IsControllable;
       this.Log = cloner.Clone(original.Log);
+      this.RefreshAutomatically = false; // do not start results polling automatically
     }
     public IDeepCloneable Clone(Cloner cloner) {
@@ -196,5 +189,5 @@
 
               if (exception != null) {
-                var ex = new ConcurrentJobDownloaderException("Downloading job failed.", exception);
+                var ex = new ConcurrentJobDownloaderException("Downloading job failed", exception);
                 LogException(ex);
                 localHiveJob.IsDownloading = false;
@@ -206,5 +199,4 @@
               } else {
                 // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
-
 
                 if (localJob.State == JobState.Paused) {
@@ -231,5 +223,5 @@
       }
       UpdateTotalExecutionTime();
-      UpdateStats();
+      UpdateStatistics();
     }
 
@@ -237,5 +229,5 @@
     private void LogException(Exception exception) {
       lock (logLocker) {
-        log.LogException(exception);
+        this.log.LogException(exception);
       }
     }
@@ -243,5 +235,5 @@
     private void LogMessage(string message) {
       lock (logLocker) {
-        log.LogMessage(message);
+        this.log.LogMessage(message);
       }
     }
@@ -256,9 +248,10 @@
     }
 
-    private void UpdateStats() {
+    private void UpdateStatistics() {
       var jobs = hiveExperiment.GetAllHiveJobs();
       hiveExperiment.JobCount = jobs.Count();
       hiveExperiment.CalculatingCount = jobs.Count(j => j.Job.State == JobState.Calculating);
       hiveExperiment.FinishedCount = jobs.Count(j => j.Job.State == JobState.Finished);
+      OnJobStatisticsChanged();
     }
 
@@ -269,8 +262,4 @@
                                                    && j.IsFinishedJobDownloaded);
     }
-
-    //public bool AllJobsFinishedAndDownloaded() {
-    //  return this.AllJobsFinished() && hiveExperiment.GetAllHiveJobs().All(j => j.JobItem.;
-    //}
 
     private void jobResultPoller_ExceptionOccured(object sender, EventArgs<Exception> e) {
@@ -359,4 +348,10 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+
+    public event EventHandler JobStatisticsChanged;
+    private void OnJobStatisticsChanged() {
+      var handler = JobStatisticsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     #endregion
 
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6200)
@@ -123,4 +123,5 @@
     <Compile Include="ExperimentManager\EngineHiveJob.cs" />
     <Compile Include="ExperimentManager\ExperimentManagerClient.cs" />
+    <Compile Include="Exceptions\HiveException.cs" />
     <Compile Include="ExperimentManager\HiveJobDownloader.cs" />
     <Compile Include="ExperimentManager\ConcurrentJobDownloaderException.cs" />
@@ -155,5 +156,4 @@
     <Compile Include="ServiceClients\HiveItem.cs" />
     <Compile Include="ServiceClients\JobData.cs" />
-    <Compile Include="ServiceClients\OperationJob.cs" />
     <Compile Include="ExperimentManager\RefreshableHiveExperiment.cs" />
     <Compile Include="ServiceClients\Plugin.cs" />
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs	(revision 6200)
@@ -129,5 +129,5 @@
 
     public override string Name {
-      get { return Item.ToString(); }
+      get { return Item != null ? Item.ToString() : null; }
       set { throw new NotSupportedException(); }
     }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs	(revision 6200)
@@ -64,5 +64,8 @@
     private void OnFinished() {
       var handler = Finished;
-      if (handler != null) handler(this, EventArgs.Empty);
+      try {
+        if (handler != null) handler(this, EventArgs.Empty);
+      }
+      catch (Exception) { }
     }
 
@@ -70,5 +73,8 @@
     private void OnStatusChanged() {
       var handler = StatusChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
+      try {
+        if (handler != null) handler(this, EventArgs.Empty);
+      }
+      catch (Exception) { }
     }
 
@@ -76,5 +82,8 @@
     private void OnProgressChanged() {
       var handler = ProgressValueChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
+      try {
+        if (handler != null) handler(this, EventArgs.Empty);
+      }
+      catch (Exception) { }
     }
     #endregion
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs	(revision 6200)
@@ -26,10 +26,7 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Clients.Hive {
-  [StorableClass]
   public partial class HiveExperiment : IDeepCloneable, IContent, IProgressReporter {
-    [Storable]
     private bool useLocalPlugins;
     public bool UseLocalPlugins {
@@ -38,5 +35,4 @@
     }
 
-    [Storable]
     private ExecutionState executionState;
     public ExecutionState ExecutionState {
@@ -50,5 +46,4 @@
     }
 
-    [Storable]
     private TimeSpan executionTime;
     public TimeSpan ExecutionTime {
@@ -62,5 +57,4 @@
     }
 
-    [Storable]
     private ItemCollection<HiveJob> hiveJobs;
     public ItemCollection<HiveJob> HiveJobs {
@@ -74,5 +68,4 @@
     }
 
-    [Storable]
     private bool isProgressing;
     public bool IsProgressing {
@@ -86,5 +79,4 @@
     }
 
-    [Storable]
     private IProgress progress;
     public IProgress Progress {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs	(revision 6200)
@@ -28,5 +28,4 @@
 
 namespace HeuristicLab.Clients.Hive {
-
   public partial class HiveItem : IHiveItem {
     public string ItemName {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs	(revision 6200)
@@ -6,5 +6,5 @@
 
 namespace HeuristicLab.Clients.Hive {
-  [Item("HiveItem Collection", "Represents a collection of OKB items.")]
+  [Item("HiveItem Collection", "Represents a collection of Hive items.")]
   public class HiveItemCollection<T> : ItemCollection<T> where T : class, IHiveItem {
     protected HiveItemCollection(HiveItemCollection<T> original, Cloner cloner) : base(original, cloner) { }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Job.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Job.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Job.cs	(revision 6200)
@@ -23,5 +23,4 @@
 using System.Collections.Generic;
 using HeuristicLab.Common;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Clients.Hive {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/JobData.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/JobData.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/JobData.cs	(revision 6200)
@@ -24,5 +24,4 @@
 
 namespace HeuristicLab.Clients.Hive {
-
   public partial class JobData : IDeepCloneable, IContent {
     public JobData() { }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/MessageContainer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/MessageContainer.cs	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/MessageContainer.cs	(revision 6200)
@@ -22,8 +22,6 @@
 using System;
 using HeuristicLab.Common;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Clients.Hive {
-  [StorableClass]
   public partial class MessageContainer : IDeepCloneable, IContent {
 
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/OperationJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/OperationJob.cs	(revision 6199)
+++ 	(revision )
@@ -1,9 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Clients.Hive.ServiceClients {
-  class OperationJob {
-  }
-}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 6200)
@@ -276,5 +276,6 @@
 		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Debug|x86.ActiveCfg = Debug|x86
 		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Debug|x86.Build.0 = Debug|x86
-		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Release|Any CPU.ActiveCfg = Release|x86
+		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Release|Any CPU.Build.0 = Release|Any CPU
 		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Release|Mixed Platforms.ActiveCfg = Release|x86
 		{BA8001DE-E83C-4B1F-8B2E-2695C4222491}.Release|Mixed Platforms.Build.0 = Release|x86
@@ -290,4 +291,5 @@
 		{28711372-0255-4883-9BED-81E150D73880}.Debug|x86.Build.0 = Debug
 		{28711372-0255-4883-9BED-81E150D73880}.Release|Any CPU.ActiveCfg = Release
+		{28711372-0255-4883-9BED-81E150D73880}.Release|Any CPU.Build.0 = Release
 		{28711372-0255-4883-9BED-81E150D73880}.Release|Mixed Platforms.ActiveCfg = Release
 		{28711372-0255-4883-9BED-81E150D73880}.Release|x64.ActiveCfg = Release
@@ -301,5 +303,6 @@
 		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Debug|x86.ActiveCfg = Debug|x86
 		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Debug|x86.Build.0 = Debug|x86
-		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Release|Any CPU.ActiveCfg = Release|x86
+		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Release|Any CPU.Build.0 = Release|Any CPU
 		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Release|Mixed Platforms.ActiveCfg = Release|x86
 		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA}.Release|Mixed Platforms.Build.0 = Release|x86
@@ -397,5 +400,6 @@
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Debug|x86.ActiveCfg = Debug|x86
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Debug|x86.Build.0 = Debug|x86
-		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|Any CPU.ActiveCfg = Release|x86
+		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|Any CPU.Build.0 = Release|Any CPU
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|Mixed Platforms.ActiveCfg = Release|x86
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|Mixed Platforms.Build.0 = Release|x86
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 6199)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6200)
@@ -7,7 +7,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Hive;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.HiveEngine {
@@ -18,8 +16,7 @@
   [Item("Hive Engine", "Engine for parallel execution on the hive. You need enable `Parallel` for at least one operator in your operator graph to have all childoperations parallelized. Also those childoperations must not have sideeffects on a higher scope.")]
   public class HiveEngine : Engine {
-    private Semaphore maxConcurrentConnections = new Semaphore(4, 4); // avoid too many connections
-    private Semaphore maxSerializedJobsInMemory = new Semaphore(4, 4); // avoid memory problems
+    private static object logLocker = new object();
     private CancellationToken cancellationToken;
-
+    
     [Storable]
     private IOperator currentOperator;
@@ -54,6 +51,6 @@
     }
 
-    [Storable]
-    private ItemCollection<RefreshableHiveExperiment> hiveExperiments;
+    // [Storable] -> HiveExperiment can't be storable, so RefreshableHiveExperiment can't be stored
+    private ItemCollection<RefreshableHiveExperiment> hiveExperiments = new ItemCollection<RefreshableHiveExperiment>();
     public ItemCollection<RefreshableHiveExperiment> HiveExperiments {
       get { return hiveExperiments; }
@@ -76,5 +73,4 @@
     public HiveEngine() {
       ResourceNames = "HEAL";
-      HiveExperiments = new ItemCollection<RefreshableHiveExperiment>();
       Priority = 0;
     }
@@ -89,4 +85,5 @@
       this.executionTimeOnHive = original.executionTimeOnHive;
       this.useLocalPlugins = original.useLocalPlugins;
+      this.hiveExperiments = cloner.Clone(original.hiveExperiments);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -202,22 +199,4 @@
       target.SubScopes.AddRange(source.SubScopes);
       // TODO: validate if parent scopes match - otherwise source is invalid
-    }
-
-    // testfunction:
-    private IScope[] ExecuteLocally(EngineJob[] jobs, IScope parentScopeClone, CancellationToken cancellationToken) {
-      IScope[] scopes = new Scope[jobs.Length];
-      for (int i = 0; i < jobs.Length; i++) {
-        var serialized = PersistenceUtil.Serialize(jobs[i]);
-        var deserialized = PersistenceUtil.Deserialize<IJob>(serialized);
-        deserialized.Start();
-        while (deserialized.ExecutionState != ExecutionState.Stopped) {
-          Thread.Sleep(100);
-        }
-        var serialized2 = PersistenceUtil.Serialize(deserialized);
-        var deserialized2 = PersistenceUtil.Deserialize<EngineJob>(serialized2);
-        var newScope = ((IAtomicOperation)deserialized2.InitialOperation).Scope;
-        scopes[i] = newScope;
-      }
-      return scopes;
     }
 
@@ -256,5 +235,8 @@
             random.Reset(random.Next());
         }
-        ExperimentManagerClient.StartExperiment((e) => { throw e; }, refreshableHiveExperiment);
+        ExperimentManagerClient.StartExperiment((e) => {
+          LogException(e);
+        }, refreshableHiveExperiment);
+
         // do polling until experiment is finished and all jobs are downloaded
         while (!refreshableHiveExperiment.AllJobsFinished()) {
@@ -273,4 +255,5 @@
         refreshableHiveExperiment.RefreshAutomatically = false;
         DeleteHiveExperiment(hiveExperiment.Id);
+        ClearData(refreshableHiveExperiment);
         return scopes;
       }
@@ -290,67 +273,17 @@
     }
 
+    private void ClearData(RefreshableHiveExperiment refreshableHiveExperiment) {
+      var jobs = refreshableHiveExperiment.HiveExperiment.GetAllHiveJobs();
+      foreach (var job in jobs) {
+        job.ClearData();
+      }
+    }
+
     private void DeleteHiveExperiment(Guid hiveExperimentId) {
-      TryAndRepeat(() => {
+      ExperimentManagerClient.TryAndRepeat(() => {
         ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(hiveExperimentId));
       }, 5, string.Format("Could not delete jobs"));
     }
-
-    private static object locker = new object();
-    private Job UploadJob(object keyValuePairObj, IScope parentScopeClone, CancellationToken cancellationToken, List<Guid> resourceIds, Guid hiveExperimentId) {
-      var keyValuePair = (KeyValuePair<int, EngineJob>)keyValuePairObj;
-      Job job = new Job();
-
-      try {
-        maxSerializedJobsInMemory.WaitOne();
-        JobData jobData = new JobData();
-        IEnumerable<Type> usedTypes;
-
-        // clone operation and remove unnecessary scopes; don't do this earlier to avoid memory problems
-        lock (locker) {
-          ((IAtomicOperation)keyValuePair.Value.InitialOperation).Scope.Parent = parentScopeClone;
-          keyValuePair.Value.InitialOperation = (IOperation)keyValuePair.Value.InitialOperation.Clone();
-          if (keyValuePair.Value.InitialOperation is IAtomicOperation)
-            ((IAtomicOperation)keyValuePair.Value.InitialOperation).Scope.ClearParentScopes();
-          jobData.Data = PersistenceUtil.Serialize(keyValuePair.Value, out usedTypes);
-        }
-        var neededPlugins = new List<IPluginDescription>();
-
-        bool useAllLocalPlugins = true;
-        if (useAllLocalPlugins) {
-          // use all plugins
-          neededPlugins.AddRange(ApplicationManager.Manager.Plugins);
-        } else {
-          // use only 
-          PluginUtil.CollectDeclaringPlugins(neededPlugins, usedTypes);
-        }
-
-        job.CoresNeeded = 1;
-        job.PluginsNeededIds = ServiceLocator.Instance.CallHiveService(s => PluginUtil.GetPluginDependencies(s, this.OnlinePlugins, this.AlreadyUploadedPlugins, neededPlugins, useLocalPlugins));
-        job.Priority = priority;
-        job.HiveExperimentId = hiveExperimentId;
-
-        try {
-          maxConcurrentConnections.WaitOne();
-          while (job.Id == Guid.Empty) { // repeat until success
-            cancellationToken.ThrowIfCancellationRequested();
-            try {
-              job.Id = ServiceLocator.Instance.CallHiveService(s => s.AddJob(job, jobData, resourceIds));
-            }
-            catch (Exception e) {
-              LogException(e);
-              LogMessage("Repeating upload");
-            }
-          }
-        }
-        finally {
-          maxConcurrentConnections.Release();
-        }
-      }
-      finally {
-        maxSerializedJobsInMemory.Release();
-      }
-      return job;
-    }
-
+    
     private List<Guid> GetResourceIds() {
       return ServiceLocator.Instance.CallHiveService(service => {
@@ -368,37 +301,9 @@
     }
 
-    private EngineJob DownloadJob(IDictionary<Guid, int> jobIndices, object jobIdObj, CancellationToken cancellationToken) {
-      Guid jobId = (Guid)jobIdObj;
-      JobData jobData = null;
-      EngineJob engineJob = null;
-      try {
-        maxSerializedJobsInMemory.WaitOne();
-        maxConcurrentConnections.WaitOne();
-        while (jobData == null) { // repeat until success
-          cancellationToken.ThrowIfCancellationRequested();
-          try {
-            jobData = ServiceLocator.Instance.CallHiveService(s => s.GetJobData(jobId));
-          }
-          catch (Exception e) {
-            LogException(e);
-            LogMessage("Repeating download");
-          }
-        }
-        engineJob = PersistenceUtil.Deserialize<EngineJob>(jobData.Data);
-        jobData = null;
-        LogMessage(string.Format("Downloaded job #{0}", jobIndices[jobId] + 1, jobId));
-      }
-      finally {
-        maxConcurrentConnections.Release();
-        maxSerializedJobsInMemory.Release();
-      }
-      return engineJob;
-    }
-
     /// <summary>
     /// Threadsafe message logging
     /// </summary>
     private void LogMessage(string message) {
-      lock (Log) {
+      lock (logLocker) {
         Log.LogMessage(message);
       }
@@ -409,28 +314,26 @@
     /// </summary>
     private void LogException(Exception exception) {
-      lock (Log) {
+      lock (logLocker) {
         Log.LogException(exception);
       }
     }
 
-    /// <summary>
-    /// Executes the action. If it throws an exception it is repeated until repetition-count is reached.
-    /// If repetitions is -1, it is repeated infinitely.
-    /// </summary>
-    private static void TryAndRepeat(Action action, int repetitions, string errorMessage) {
-      try { action(); }
-      catch (Exception e) {
-        repetitions--;
-        if (repetitions <= 0)
-          throw new HiveEngineException(errorMessage, e);
-        TryAndRepeat(action, repetitions, errorMessage);
-      }
-    }
-  }
-
-  public static class EnumerableExtensions {
-    public static TimeSpan Sum(this IEnumerable<TimeSpan> times) {
-      return TimeSpan.FromMilliseconds(times.Select(e => e.TotalMilliseconds).Sum());
-    }
+    // testfunction:
+    //private IScope[] ExecuteLocally(EngineJob[] jobs, IScope parentScopeClone, CancellationToken cancellationToken) {
+    //  IScope[] scopes = new Scope[jobs.Length];
+    //  for (int i = 0; i < jobs.Length; i++) {
+    //    var serialized = PersistenceUtil.Serialize(jobs[i]);
+    //    var deserialized = PersistenceUtil.Deserialize<IJob>(serialized);
+    //    deserialized.Start();
+    //    while (deserialized.ExecutionState != ExecutionState.Stopped) {
+    //      Thread.Sleep(100);
+    //    }
+    //    var serialized2 = PersistenceUtil.Serialize(deserialized);
+    //    var deserialized2 = PersistenceUtil.Deserialize<EngineJob>(serialized2);
+    //    var newScope = ((IAtomicOperation)deserialized2.InitialOperation).Scope;
+    //    scopes[i] = newScope;
+    //  }
+    //  return scopes;
+    //}
   }
 }
