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 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 5958)
@@ -257,5 +257,5 @@
       }
 
-      hiveJob.Job.PluginsNeededIds = GetPluginDependencies(service, this.onlinePlugins, this.alreadyUploadedPlugins, plugins, useLocalPlugins);
+      hiveJob.Job.PluginsNeededIds = PluginUtil.GetPluginDependencies(service, this.onlinePlugins, this.alreadyUploadedPlugins, plugins, useLocalPlugins);
       hiveJob.Job.PluginsNeededIds.Add(configPluginId);
 
@@ -350,54 +350,4 @@
     }
 
-    #region Plugin Management
-    /// <summary>
-    /// Checks if plugins are available on Hive Server. If not they are uploaded. Ids are returned.
-    /// </summary>
-    /// <param name="service">An active service-proxy</param>
-    /// <param name="onlinePlugins">List of plugins which are available online</param>
-    /// <param name="alreadyUploadedPlugins">List of plugins which have been uploaded from this HiveExperiment</param>
-    /// <param name="neededPlugins">List of plugins which need to be uploaded</param>
-    /// <param name="useLocalPlugins">If true, the plugins which are already online are ignored. All local plugins are uploaded, but only once.</param>
-    /// <returns></returns>
-    private static List<Guid> GetPluginDependencies(IHiveService service, IEnumerable<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins, IEnumerable<IPluginDescription> neededPlugins, bool useLocalPlugins) {
-      var pluginIds = new List<Guid>();
-      foreach (var neededPlugin in neededPlugins) {
-        Plugin foundPlugin = alreadyUploadedPlugins.SingleOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
-        if (foundPlugin == null) {
-          foundPlugin = onlinePlugins.SingleOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
-          if (useLocalPlugins || foundPlugin == null) {
-            Plugin p = CreatePlugin(neededPlugin, useLocalPlugins);
-            List<PluginData> pd = CreatePluginDatas(neededPlugin);
-            p.Id = service.AddPlugin(p, pd);
-            alreadyUploadedPlugins.Add(p);
-            pluginIds.Add(p.Id);
-          } else {
-            pluginIds.Add(foundPlugin.Id);
-          }
-        } else {
-          pluginIds.Add(foundPlugin.Id);
-        }
-      }
-      return pluginIds;
-    }
-
-    private static Plugin CreatePlugin(IPluginDescription plugin, bool useLocalPlugins) {
-      return new Plugin() { Name = plugin.Name, Version = plugin.Version, IsLocal = useLocalPlugins };
-    }
-
-    private static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
-      List<PluginData> pluginDatas = new List<PluginData>();
-
-      foreach (IPluginFile pf in plugin.Files) {
-        PluginData pluginData = new PluginData();
-
-        pluginData.Data = File.ReadAllBytes(pf.Name);
-        pluginData.FileName = Path.GetFileName(pf.Name);
-        pluginDatas.Add(pluginData);
-      }
-      return pluginDatas;
-    }
-    #endregion
-
     public static OptimizerJob LoadOptimizerJob(Guid jobId) {
       JobData jobData = ServiceLocator.Instance.CallHiveService(s => s.GetJobData(jobId));
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 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJobClient.cs	(revision 5958)
@@ -491,28 +491,9 @@
       };
 
-      CollectDeclaringPlugins(plugins, usedTypes);
+      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
 
       return jobData;
     }
 
-    private void CollectDeclaringPlugins(List<IPluginDescription> plugins, IEnumerable<Type> usedTypes) {
-      foreach (Type type in usedTypes) {
-        var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
-        if (plugin != null && !plugins.Contains(plugin)) {
-          plugins.Add(plugin);
-          CollectPluginDependencies(plugins, plugin);
-        }
-      }
-    }
-
-    private void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
-      if (plugin == null) return;
-      foreach (var dependency in plugin.Dependencies) {
-        if (!plugins.Contains(dependency)) {
-          plugins.Add(dependency);
-          CollectPluginDependencies(plugins, dependency);
-        }
-      }
-    }
 
     #region Events
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 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 5958)
@@ -130,9 +130,10 @@
     <Compile Include="ExperimentManager\HiveJobClient.cs" />
     <Compile Include="ExperimentManager\JobResultPoller.cs" />
+    <Compile Include="PersistenceUtil.cs" />
+    <Compile Include="PluginUtil.cs" />
     <Compile Include="Progress\IProgress.cs" />
     <Compile Include="Progress\IProgressReporter.cs" />
     <Compile Include="Progress\Progress.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="PersistenceUtil.cs" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <Compile Include="Exceptions\ServiceClientFactoryException.cs" />
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 5958)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,6 +32,6 @@
   [Item("Optimizer Job", "Represents Job which executes a IOptimizer object.")]
   [StorableClass]
-  public class OptimizerJob : DeepCloneable, IJob {
-    public virtual bool IsParallelizable {
+  public class OptimizerJob : AbstractJob {
+    public override bool IsParallelizable {
       get { return this.Optimizer is Optimization.Experiment || this.Optimizer is BatchRun; }
     }
@@ -42,26 +43,8 @@
       set {
         if (value != optimizer) {
-          if (optimizer != null) DeregisterEvents();
+          if (optimizer != null) DeregisterOptimizerEvents();
           optimizer = value;
-          if (optimizer != null) RegisterEvents();
+          if (optimizer != null) RegisterOptimizerEvents();
           OnOptimizerChanged();
-        }
-      }
-    }
-
-    [Storable]
-    protected ILog log;
-    public ILog Log {
-      get { return log; }
-    }
-
-    [Storable]
-    protected bool computeInParallel;
-    public bool ComputeInParallel {
-      get { return computeInParallel; }
-      set {
-        if (computeInParallel != value) {
-          computeInParallel = value;
-          OnComputeInParallelChanged();
         }
       }
@@ -75,13 +58,6 @@
     }
 
-    [Storable]
-    private bool collectChildJobs;
-    public bool CollectChildJobs {
-      get { return collectChildJobs; }
-      set { collectChildJobs = value; }
-    }
-
-    public OptimizerJob() {
-      this.log = new Log();
+    public OptimizerJob() : base() {
+      
     }
     public OptimizerJob(IOptimizer optimizer)
@@ -102,9 +78,7 @@
       : base(original, cloner) {
       this.Optimizer = cloner.Clone(original.Optimizer);
-      this.log = cloner.Clone(original.Log);
-      this.ComputeInParallel = original.ComputeInParallel;
       this.IndexInParentOptimizerList = original.IndexInParentOptimizerList;
       this.CollectChildJobs = original.CollectChildJobs;
-      this.RegisterEvents();
+      this.RegisterOptimizerEvents();
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -114,5 +88,5 @@
     [StorableHook(HookType.AfterDeserialization)]
     protected virtual void AfterDeserialization() {
-      RegisterEvents();
+      RegisterOptimizerEvents();
     }
 
@@ -133,17 +107,17 @@
     #region IJob Members
 
-    public virtual ExecutionState ExecutionState {
+    public override ExecutionState ExecutionState {
       get { return optimizer.ExecutionState; }
     }
 
-    public TimeSpan ExecutionTime {
+    public override TimeSpan ExecutionTime {
       get { return optimizer.ExecutionTime; }
     }
 
-    public virtual void Prepare() {
+    public override void Prepare() {
       optimizer.Prepare();
     }
 
-    public virtual void Start() {
+    public override void Start() {
       if ((optimizer is Optimization.Experiment && OptimizerAsExperiment.Optimizers.Count == 0) || // experiment would not fire OnStopped if it has 0 optimizers
           (optimizer is Optimization.BatchRun && OptimizerAsBatchRun.Optimizer == null)) { // batchrun would not fire OnStopped if algorithm == null
@@ -154,67 +128,19 @@
     }
 
-    public virtual void Pause() {
+    public override void Pause() {
       optimizer.Pause();
     }
 
-    public virtual void Stop() {
+    public override void Stop() {
       optimizer.Stop();
     }
 
-    public virtual void Resume(IEnumerable<IJob> childJobs) {
+    public override void Resume(IEnumerable<IJob> childJobs) {
       OnJobStopped();
     }
-
-    public event EventHandler JobStopped;
-    protected virtual void OnJobStopped() {
-      EventHandler handler = JobStopped;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler JobPaused;
-    protected virtual void OnJobPaused() {
-      EventHandler handler = JobPaused;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler JobFailed;
-    protected virtual void OnJobFailed(EventArgs<Exception> e) {
-      EventHandler handler = JobFailed;
-      if (handler != null) handler(this, e);
-    }
-
-    public event EventHandler<EventArgs<IJob>> NewChildJob;
-    protected virtual void OnNewChildJob(IJob job) {
-      EventHandler<EventArgs<IJob>> handler = NewChildJob;
-      if (handler != null) handler(this, new EventArgs<IJob>(job));
-    }
-
-    public event EventHandler WaitForChildJobs;
-    protected virtual void OnWaitForChildJobs() {
-      EventHandler handler = WaitForChildJobs;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler DeleteChildJobs;
-    protected virtual void OnDeleteChildJobs() {
-      EventHandler handler = DeleteChildJobs;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler ComputeInParallelChanged;
-    protected virtual void OnComputeInParallelChanged() {
-      EventHandler handler = ComputeInParallelChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler OptimizerChanged;
-    protected virtual void OnOptimizerChanged() {
-      EventHandler handler = OptimizerChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
     #endregion
 
     #region Optimizer Events
-    protected virtual void RegisterEvents() {
+    protected virtual void RegisterOptimizerEvents() {
       optimizer.Stopped += new EventHandler(optimizer_Stopped);
       optimizer.Paused += new EventHandler(optimizer_Paused);
@@ -227,32 +153,32 @@
     }
 
-    protected virtual void DeregisterEvents() {
+    protected virtual void DeregisterOptimizerEvents() {
       optimizer.Stopped -= new EventHandler(optimizer_Stopped);
       optimizer.Paused -= new EventHandler(optimizer_Paused);
       optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
-      optimizer.DescriptionChanged -= this.DescriptionChanged;
-      optimizer.ItemImageChanged -= this.ItemImageChanged;
-      optimizer.NameChanged -= this.NameChanged;
-      optimizer.NameChanging -= this.NameChanging;
-      optimizer.ToStringChanged -= this.ToStringChanged;
-    }
-
-    void optimizer_ToStringChanged(object sender, EventArgs e) {
+      optimizer.DescriptionChanged -= new EventHandler(optimizer_DescriptionChanged);
+      optimizer.ItemImageChanged -= new EventHandler(optimizer_ItemImageChanged);
+      optimizer.NameChanged -= new EventHandler(optimizer_NameChanged);
+      optimizer.NameChanging -= new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
+      optimizer.ToStringChanged -= new EventHandler(optimizer_ToStringChanged);
+    }
+
+    protected void optimizer_ToStringChanged(object sender, EventArgs e) {
       this.OnToStringChanged();
     }
 
-    void optimizer_NameChanging(object sender, CancelEventArgs<string> e) {
+    protected void optimizer_NameChanging(object sender, CancelEventArgs<string> e) {
       this.OnNameChanging(e.Value, e.Cancel);
     }
 
-    void optimizer_NameChanged(object sender, EventArgs e) {
+    protected void optimizer_NameChanged(object sender, EventArgs e) {
       this.OnNameChanged();
     }
 
-    void optimizer_ItemImageChanged(object sender, EventArgs e) {
+    protected void optimizer_ItemImageChanged(object sender, EventArgs e) {
       this.OnItemImageChanged();
     }
 
-    void optimizer_DescriptionChanged(object sender, EventArgs e) {
+    protected void optimizer_DescriptionChanged(object sender, EventArgs e) {
       this.OnDescriptionChanged();
     }
@@ -273,88 +199,41 @@
     #region INamedItem Members
 
-    public bool CanChangeDescription {
+    public override bool CanChangeDescription {
       get { return optimizer.CanChangeDescription; }
     }
 
-    public bool CanChangeName {
+    public override bool CanChangeName {
       get { return optimizer.CanChangeName; }
     }
 
-    public string Description {
+    public override string Description {
       get { return optimizer.Description; }
       set { optimizer.Description = value; }
     }
 
-    public string Name {
+    public override string Name {
       get { return optimizer.Name; }
       set { optimizer.Name = value; }
     }
     #endregion
-
-    #region Events
-    public event EventHandler DescriptionChanged;
-    protected virtual void OnDescriptionChanged() {
-      var handler = DescriptionChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler ItemImageChanged;
-    protected virtual void OnItemImageChanged() {
-      var handler = ItemImageChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler ToStringChanged;
-    protected virtual void OnToStringChanged() {
-      var handler = ToStringChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler NameChanged;
-    protected virtual void OnNameChanged() {
-      var handler = NameChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler<CancelEventArgs<string>> NameChanging;
-    protected virtual void OnNameChanging(string value, bool cancel) {
-      var handler = NameChanging;
-      if (handler != null) handler(this, new CancelEventArgs<string>(value, cancel));
-    }
-    public event EventHandler ExecutionTimeChanged;
-    protected virtual void OnExecutionTimeChanged() {
-      EventHandler handler = ExecutionTimeChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler ExecutionStateChanged;
-    protected virtual void OnExecutionStateChanged() {
-      EventHandler handler = ExecutionStateChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    #endregion
-
+    
     #region IItem Members
 
-    public string ItemDescription {
+    public override string ItemDescription {
       get { return optimizer.ItemDescription; }
     }
 
-    public System.Drawing.Image ItemImage {
+    public override Image ItemImage {
       get { return optimizer.ItemImage; }
     }
 
-    public string ItemName {
+    public override string ItemName {
       get { return optimizer.ItemName; }
     }
 
-    public Version ItemVersion {
+    public override Version ItemVersion {
       get { return optimizer.ItemVersion; }
     }
-
-    #endregion
-
-    /// <summary>
-    /// Gets the string representation of the current instance in the format: <c>Name: [null|Value]</c>.
-    /// </summary>
-    /// <returns>The current instance as a string.</returns>
-    public override string ToString() {
-      return Name;
-    }
+    #endregion
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs	(revision 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs	(revision 5958)
@@ -20,10 +20,9 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.IO;
+using HeuristicLab.Persistence.Core;
 using HeuristicLab.Persistence.Default.Xml;
-using System.Collections.Generic;
-using HeuristicLab.PluginInfrastructure;
-using System;
-using HeuristicLab.Persistence.Core;
 
 namespace HeuristicLab.Clients.Hive {
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PluginUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PluginUtil.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PluginUtil.cs	(revision 5958)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+  public static class PluginUtil {
+
+    /// <summary>
+    /// Checks if plugins are available on Hive Server. If not they are uploaded. Ids are returned.
+    /// </summary>
+    /// <param name="service">An active service-proxy</param>
+    /// <param name="onlinePlugins">List of plugins which are available online</param>
+    /// <param name="alreadyUploadedPlugins">List of plugins which have been uploaded from this HiveExperiment</param>
+    /// <param name="neededPlugins">List of plugins which need to be uploaded</param>
+    /// <param name="useLocalPlugins">If true, the plugins which are already online are ignored. All local plugins are uploaded, but only once.</param>
+    /// <returns></returns>
+    public static List<Guid> GetPluginDependencies(IHiveService service, IEnumerable<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins, IEnumerable<IPluginDescription> neededPlugins, bool useLocalPlugins) {
+      var pluginIds = new List<Guid>();
+      foreach (var neededPlugin in neededPlugins) {
+        Plugin foundPlugin = alreadyUploadedPlugins.SingleOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
+        if (foundPlugin == null) {
+          foundPlugin = onlinePlugins.SingleOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
+          if (useLocalPlugins || foundPlugin == null) {
+            Plugin p = CreatePlugin(neededPlugin, useLocalPlugins);
+            List<PluginData> pd = CreatePluginDatas(neededPlugin);
+            p.Id = service.AddPlugin(p, pd);
+            alreadyUploadedPlugins.Add(p);
+            pluginIds.Add(p.Id);
+          } else {
+            pluginIds.Add(foundPlugin.Id);
+          }
+        } else {
+          pluginIds.Add(foundPlugin.Id);
+        }
+      }
+      return pluginIds;
+    }
+
+    public static Plugin CreatePlugin(IPluginDescription plugin, bool useLocalPlugins) {
+      return new Plugin() { Name = plugin.Name, Version = plugin.Version, IsLocal = useLocalPlugins };
+    }
+
+    public static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
+      List<PluginData> pluginDatas = new List<PluginData>();
+
+      foreach (IPluginFile pf in plugin.Files) {
+        PluginData pluginData = new PluginData();
+
+        pluginData.Data = File.ReadAllBytes(pf.Name);
+        pluginData.FileName = Path.GetFileName(pf.Name);
+        pluginDatas.Add(pluginData);
+      }
+      return pluginDatas;
+    }
+
+    public static void CollectDeclaringPlugins(List<IPluginDescription> plugins, IEnumerable<Type> usedTypes) {
+      foreach (Type type in usedTypes) {
+        var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
+        if (plugin != null && !plugins.Contains(plugin)) {
+          plugins.Add(plugin);
+          CollectPluginDependencies(plugins, plugin);
+        }
+      }
+    }
+
+    public static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
+      if (plugin == null) return;
+      foreach (var dependency in plugin.Dependencies) {
+        if (!plugins.Contains(dependency)) {
+          plugins.Add(dependency);
+          CollectPluginDependencies(plugins, dependency);
+        }
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 5958)
@@ -88,4 +88,8 @@
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hive Common", "Hive Common", "{70CE526B-B92C-4750-B3D3-A38C572042A8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HeuristicLab.HiveEngine", "HeuristicLab.HiveEngine", "{4596C5BB-CAB1-4C01-891F-4890F9F16CF8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveEngine-3.4", "HeuristicLab.HiveEngine\3.4\HeuristicLab.HiveEngine-3.4.csproj", "{2C036542-5451-4A23-AFF6-87575C7BAFE7}"
 EndProject
 Global
@@ -366,4 +370,20 @@
 		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|x86.ActiveCfg = Release|x86
 		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE}.Release|x86.Build.0 = Release|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x64.ActiveCfg = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x64.Build.0 = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x86.ActiveCfg = Debug|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x86.Build.0 = Debug|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Mixed Platforms.Build.0 = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x64.ActiveCfg = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x64.Build.0 = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x86.ActiveCfg = Release|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
@@ -371,25 +391,26 @@
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
+		{F98A1740-9AC9-4D36-A582-6A2D0D06978D} = {70CE526B-B92C-4750-B3D3-A38C572042A8}
+		{8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{C4CBD11E-1B83-464A-B0AD-0DC0FF7E57AA} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{464D70B8-2D91-485C-B622-22E4A4891C68} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{BA8001DE-E83C-4B1F-8B2E-2695C4222491} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{28711372-0255-4883-9BED-81E150D73880} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{989FE92B-484E-41EE-87E2-6A24AF0381D8} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
+		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
+		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
+		{0CA6706D-A569-45DE-A85C-4158891CC1BC} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
+		{17187EAC-5D8C-4B11-9CEA-D88F71B59658} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
+		{14424A16-48D4-445E-80BF-DDF617548BBB} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
+		{E1D6C801-892A-406A-B606-F158E36DD3C3} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
+		{8D40A723-139D-40E4-8BBA-4CB309A9E4B9} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
+		{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
 		{A2061FFC-C564-4872-AA06-56B002DDEDBF} = {063D87A6-1085-49F6-A195-5D1890CBE994}
 		{02766ECC-D0F5-4115-9ECA-47409167B638} = {A2061FFC-C564-4872-AA06-56B002DDEDBF}
-		{989FE92B-484E-41EE-87E2-6A24AF0381D8} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{464D70B8-2D91-485C-B622-22E4A4891C68} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{7C4B1DE4-FC9A-4448-BCF8-3CB3FA3CB8FA} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{BA8001DE-E83C-4B1F-8B2E-2695C4222491} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{C4CBD11E-1B83-464A-B0AD-0DC0FF7E57AA} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{28711372-0255-4883-9BED-81E150D73880} = {622F8E95-CDFC-4B4E-BBA7-3EE4E47DB52A}
-		{0CA6706D-A569-45DE-A85C-4158891CC1BC} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
-		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
-		{14424A16-48D4-445E-80BF-DDF617548BBB} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
-		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
-		{17187EAC-5D8C-4B11-9CEA-D88F71B59658} = {E69A1E5F-63F7-493F-BBA2-163D6E321D44}
-		{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
-		{8D40A723-139D-40E4-8BBA-4CB309A9E4B9} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
-		{E1D6C801-892A-406A-B606-F158E36DD3C3} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
-		{A0EB9657-4D57-4CC1-A309-EC010D7F9EAB} = {9963403B-3CB9-48E0-9FEB-B1CE12C31601}
 		{54491B6A-1EDD-4C76-90A7-338BA9C1FBF8} = {9963403B-3CB9-48E0-9FEB-B1CE12C31601}
 		{BEB9D81C-3878-4F2E-BBAF-5B24AA90AEEE} = {9963403B-3CB9-48E0-9FEB-B1CE12C31601}
-		{F98A1740-9AC9-4D36-A582-6A2D0D06978D} = {70CE526B-B92C-4750-B3D3-A38C572042A8}
+		{A0EB9657-4D57-4CC1-A309-EC010D7F9EAB} = {9963403B-3CB9-48E0-9FEB-B1CE12C31601}
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7} = {4596C5BB-CAB1-4C01-891F-4890F9F16CF8}
 	EndGlobalSection
 EndGlobal
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/AbstractJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/AbstractJob.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/AbstractJob.cs	(revision 5958)
@@ -0,0 +1,203 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Hive {
+  [Item("Abstract Job", "Represents a executable hive job.")]
+  [StorableClass]
+  public abstract class AbstractJob : DeepCloneable, IJob {
+    public virtual bool IsParallelizable {
+      get { return true; }
+    }
+
+    [Storable]
+    protected ILog log;
+    public ILog Log {
+      get { return log; }
+    }
+
+    [Storable]
+    protected bool computeInParallel;
+    public bool ComputeInParallel {
+      get { return computeInParallel; }
+      set {
+        if (computeInParallel != value) {
+          computeInParallel = value;
+          OnComputeInParallelChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private bool collectChildJobs;
+    public bool CollectChildJobs {
+      get { return collectChildJobs; }
+      set { collectChildJobs = value; }
+    }
+
+    public AbstractJob() {
+      this.log = new Log();
+    }
+    [StorableConstructor]
+    protected AbstractJob(bool deserializing) { }
+    protected AbstractJob(AbstractJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.log = cloner.Clone(original.Log);
+      this.ComputeInParallel = original.ComputeInParallel;
+      this.CollectChildJobs = original.CollectChildJobs;
+    }
+
+    #region IJob Members
+
+    public abstract ExecutionState ExecutionState{ get; }
+
+    public abstract TimeSpan ExecutionTime{ get; }
+
+    public abstract void Prepare();
+
+    public abstract void Start();
+
+    public abstract void Pause();
+
+    public abstract void Stop();
+
+    public abstract void Resume(IEnumerable<IJob> childJobs);
+
+    public event EventHandler JobStopped;
+    protected virtual void OnJobStopped() {
+      EventHandler handler = JobStopped;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobPaused;
+    protected virtual void OnJobPaused() {
+      EventHandler handler = JobPaused;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobFailed;
+    protected virtual void OnJobFailed(EventArgs<Exception> e) {
+      EventHandler handler = JobFailed;
+      if (handler != null) handler(this, e);
+    }
+
+    public event EventHandler<EventArgs<IJob>> NewChildJob;
+    protected virtual void OnNewChildJob(IJob job) {
+      EventHandler<EventArgs<IJob>> handler = NewChildJob;
+      if (handler != null) handler(this, new EventArgs<IJob>(job));
+    }
+
+    public event EventHandler WaitForChildJobs;
+    protected virtual void OnWaitForChildJobs() {
+      EventHandler handler = WaitForChildJobs;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler DeleteChildJobs;
+    protected virtual void OnDeleteChildJobs() {
+      EventHandler handler = DeleteChildJobs;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ComputeInParallelChanged;
+    protected virtual void OnComputeInParallelChanged() {
+      EventHandler handler = ComputeInParallelChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler OptimizerChanged;
+    protected virtual void OnOptimizerChanged() {
+      EventHandler handler = OptimizerChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+    
+    #region INamedItem Members
+    public abstract bool CanChangeDescription { get; }
+
+    public abstract bool CanChangeName { get; }
+
+    public abstract string Description { get; set; }
+
+    public abstract string Name { get; set; }
+    #endregion
+
+    #region Events
+    public event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged() {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged() {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ToStringChanged;
+    protected virtual void OnToStringChanged() {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler NameChanged;
+    protected virtual void OnNameChanged() {
+      var handler = NameChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler<CancelEventArgs<string>> NameChanging;
+    protected virtual void OnNameChanging(string value, bool cancel) {
+      var handler = NameChanging;
+      if (handler != null) handler(this, new CancelEventArgs<string>(value, cancel));
+    }
+    public event EventHandler ExecutionTimeChanged;
+    protected virtual void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ExecutionStateChanged;
+    protected virtual void OnExecutionStateChanged() {
+      EventHandler handler = ExecutionStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region IItem Members
+
+    public abstract string ItemDescription { get; }
+
+    public abstract Image ItemImage { get; }
+
+    public abstract string ItemName { get; }
+
+    public abstract Version ItemVersion { get; }
+
+    #endregion
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj	(revision 5957)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj	(revision 5958)
@@ -85,4 +85,5 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
@@ -95,4 +96,5 @@
     <Compile Include="HeuristicLabHivePlugin.cs" />
     <Compile Include="IJob.cs" />
+    <Compile Include="AbstractJob.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/EngineJob.cs	(revision 5958)
@@ -0,0 +1,124 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Hive;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.HiveEngine {
+  [StorableClass]
+  public class EngineJob : AbstractJob {
+    [Storable]
+    private IEngine engine;
+
+    [Storable]
+    protected IOperation initialOperation;
+    public IOperation InitialOperation {
+      get { return initialOperation; }
+      set { initialOperation = value; }
+    }
+
+    public override TimeSpan ExecutionTime {
+      get { return engine.ExecutionTime; }
+    }
+
+    public override ExecutionState ExecutionState {
+      get { return engine.ExecutionState; }
+    }
+
+    #region constructors and cloning
+    public EngineJob() { }
+    public EngineJob(IOperation initialOperation, IEngine engine) {
+      this.initialOperation = initialOperation;
+      this.engine = engine;
+      this.engine.Prepare(initialOperation);
+      RegisterEngineEvents();
+    }
+
+    [StorableConstructor]
+    protected EngineJob(bool deserializing) : base(deserializing) { }
+    protected EngineJob(EngineJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.engine = cloner.Clone(original.engine);
+      RegisterEngineEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EngineJob(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEngineEvents();
+    }
+    #endregion
+
+    public override bool IsParallelizable {
+      get { return false; }
+    }
+
+    public override void Prepare() { }
+
+    public override void Start() {
+      engine.Start();
+    }
+    
+    public override void Pause() {
+      throw new NotImplementedException();
+    }
+
+    public override void Stop() {
+      engine.Stop();
+    }
+    
+    public override void Resume(IEnumerable<IJob> childJobs) {
+      throw new NotImplementedException();
+    }
+
+    private void RegisterEngineEvents() {
+      engine.Stopped += new EventHandler(engine_Stopped);
+      engine.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
+    }
+
+    void engine_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      OnJobFailed(e);
+    }
+
+    void engine_Stopped(object sender, EventArgs e) {
+      OnJobStopped();
+    }
+
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public override string Description {
+      get { return string.Empty; }
+      set { throw new NotSupportedException(); }
+    }
+
+    public override string Name {
+      get { return engine.ToString(); }
+      set { throw new NotSupportedException(); }
+    }
+
+    public override string ItemDescription {
+      get { return Description; }
+    }
+
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Operator; }
+    }
+    
+    public override string ItemName {
+      get { return "EngineJob"; }
+    }
+
+    public override Version ItemVersion {
+      get { return null; }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/HiveEngineException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/HiveEngineException.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/HiveEngineException.cs	(revision 5958)
@@ -0,0 +1,9 @@
+﻿using System;
+
+namespace HeuristicLab.HiveEngine {
+  public class HiveEngineException : Exception {
+    public HiveEngineException(string message) : base(message) { }
+
+    public HiveEngineException(string message, Exception innerException) : base(message, innerException) { }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/ScopeMergeException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/ScopeMergeException.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Exceptions/ScopeMergeException.cs	(revision 5958)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.HiveEngine {
+  [Serializable]
+  public class ScopeMergeException : Exception {
+    public ScopeMergeException() : base() { }
+    public ScopeMergeException(string msg) : base(msg) { }
+    public ScopeMergeException(string msg, Exception e) : base(msg, e) { }
+    protected ScopeMergeException(SerializationInfo info, StreamingContext context) : base(info, context) { }
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLab.HiveEngine-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLab.HiveEngine-3.4.csproj	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLab.HiveEngine-3.4.csproj	(revision 5958)
@@ -0,0 +1,207 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2C036542-5451-4A23-AFF6-87575C7BAFE7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HiveEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.HiveEngine-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Clients.Common-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="EngineJob.cs" />
+    <Compile Include="HeuristicLabHiveEnginePlugin.cs" />
+    <Compile Include="Exceptions\ScopeMergeException.cs" />
+    <Compile Include="Views\HiveEngineView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\HiveEngineView.Designer.cs">
+      <DependentUpon>HiveEngineView.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLabHiveEnginePlugin.cs.frame" />
+    <Compile Include="HiveEngine.cs" />
+    <Compile Include="Exceptions\HiveEngineException.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj">
+      <Project>{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}</Project>
+      <Name>HeuristicLab.Clients.Hive-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
+      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
+      <Name>HeuristicLab.Hive-3.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\HiveEngineView.resx">
+      <DependentUpon>HiveEngineView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLabHiveEnginePlugin.cs.frame	(revision 5958)
@@ -0,0 +1,40 @@
+﻿#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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.HiveEngine {
+  [Plugin("HeuristicLab.HiveEngine", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.HiveEngine-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.DataAccess", "3.3")]
+  [PluginDependency("HeuristicLab.Hive.Contracts", "3.3")]
+  [PluginDependency("HeuristicLab.Hive.ExperimentManager", "3.3")]
+  [PluginDependency("HeuristicLab.Hive.JobBase", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
+  public class HeuristicLabHiveEnginePlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 5958)
@@ -0,0 +1,482 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.HiveEngine {
+  /// <summary>
+  /// Represents an engine that executes operations which can be executed in parallel on the hive
+  /// </summary>
+  [StorableClass]
+  [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 CancellationToken cancellationToken;
+
+    [Storable]
+    private IOperator currentOperator;
+
+    [Storable]
+    public string ResourceIds { get; set; }
+
+    [Storable]
+    private int priority;
+    public int Priority {
+      get { return priority; }
+      set { priority = value; }
+    }
+
+    [Storable]
+    private TimeSpan executionTimeOnHive;
+    public TimeSpan ExecutionTimeOnHive {
+      get { return executionTimeOnHive; }
+      set {
+        if (value != executionTimeOnHive) {
+          executionTimeOnHive = value;
+          OnExecutionTimeOnHiveChanged();
+        }
+      }
+    }
+
+    private IEnumerable<Plugin> onlinePlugins;
+    public IEnumerable<Plugin> OnlinePlugins {
+      get { return onlinePlugins; }
+      set { onlinePlugins = value; }
+    }
+    
+    private List<Plugin> alreadyUploadedPlugins;
+    public List<Plugin> AlreadyUploadedPlugins {
+      get { return alreadyUploadedPlugins; }
+      set { alreadyUploadedPlugins = value; }
+    }
+
+    #region constructors and cloning
+    public HiveEngine() {
+      ResourceIds = "HEAL";
+    }
+
+    [StorableConstructor]
+    protected HiveEngine(bool deserializing) : base(deserializing) { }
+    protected HiveEngine(HiveEngine original, Cloner cloner)
+      : base(original, cloner) {
+      this.ResourceIds = original.ResourceIds;
+      this.currentOperator = cloner.Clone(original.currentOperator);
+      this.priority = original.priority;
+      this.executionTimeOnHive = original.executionTimeOnHive;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveEngine(this, cloner);
+    }
+    #endregion
+
+    #region Events
+    protected override void OnPrepared() {
+      base.OnPrepared();
+      this.ExecutionTimeOnHive = TimeSpan.Zero;
+    }
+
+    public event EventHandler ExecutionTimeOnHiveChanged;
+    protected virtual void OnExecutionTimeOnHiveChanged() {
+      var handler = ExecutionTimeOnHiveChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    protected override void Run(CancellationToken cancellationToken) {
+      this.cancellationToken = cancellationToken;
+      Run(ExecutionStack);
+    }
+
+    private void Run(object state) {
+      Stack<IOperation> executionStack = (Stack<IOperation>)state;
+      IOperation next;
+      OperationCollection coll;
+      IAtomicOperation operation;
+      TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
+
+      this.OnlinePlugins = ServiceLocator.Instance.CallHiveService(s => s.GetPlugins());
+      this.AlreadyUploadedPlugins = new List<Plugin>();
+
+      while (ExecutionStack.Count > 0) {
+        cancellationToken.ThrowIfCancellationRequested();
+
+        next = ExecutionStack.Pop();
+        if (next is OperationCollection) {
+          coll = (OperationCollection)next;
+          if (coll.Parallel) {
+            // clone the parent scope here and reuse it for each operation. otherwise for each job the whole scope-tree first needs to be copied and then cleaned, which causes a lot of work for the Garbage Collector
+            IScope parentScopeClone = (IScope)((IAtomicOperation)coll.First()).Scope.Parent.Clone();
+            parentScopeClone.SubScopes.Clear();
+            parentScopeClone.ClearParentScopes();
+
+            EngineJob[] jobs = new EngineJob[coll.Count];
+            for (int i = 0; i < coll.Count; i++) {
+              jobs[i] = new EngineJob(coll[i], new SequentialEngine.SequentialEngine());
+            }
+
+            IScope[] scopes = ExecuteOnHive(jobs, parentScopeClone, cancellationToken);
+
+            for (int i = 0; i < coll.Count; i++) {
+              if (coll[i] is IAtomicOperation) {
+                ExchangeScope(scopes[i], ((IAtomicOperation)coll[i]).Scope);
+              } else if (coll[i] is OperationCollection) {
+                // todo ??
+              }
+            }
+          } else {
+            for (int i = coll.Count - 1; i >= 0; i--)
+              if (coll[i] != null) executionStack.Push(coll[i]);
+          }
+        } else if (next is IAtomicOperation) {
+          operation = (IAtomicOperation)next;
+          try {
+            next = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
+          }
+          catch (Exception ex) {
+            ExecutionStack.Push(operation);
+            if (ex is OperationCanceledException) throw ex;
+            else throw new OperatorExecutionException(operation.Operator, ex);
+          }
+          if (next != null) ExecutionStack.Push(next);
+
+          if (operation.Operator.Breakpoint) {
+            LogMessage(string.Format("Breakpoint: {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName));
+            Pause();
+          }
+        }
+      }
+    }
+
+    private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) {
+      e.SetObserved(); // avoid crash of process
+    }
+
+    private IRandom FindRandomParameter(IExecutionContext ec) {
+      try {
+        if (ec == null)
+          return null;
+
+        foreach (var p in ec.Parameters) {
+          if (p.Name == "Random" && p is IValueParameter)
+            return ((IValueParameter)p).Value as IRandom;
+        }
+        return FindRandomParameter(ec.Parent);
+      }
+      catch { return null; }
+    }
+
+    private static void ReIntegrateScope(IAtomicOperation source, IAtomicOperation target) {
+      ExchangeScope(source.Scope, target.Scope);
+    }
+
+    private static void ExchangeScope(IScope source, IScope target) {
+      target.Variables.Clear();
+      target.Variables.AddRange(source.Variables);
+      target.SubScopes.Clear();
+      target.SubScopes.AddRange(source.SubScopes);
+      // TODO: validate if parent scopes match - otherwise source is invalid
+    }
+
+    /// <summary>
+    /// This method blocks until all jobs are finished
+    /// TODO: Cancelation needs to be refined; all tasks currently stay in Semaphore.WaitOne after cancelation
+    /// </summary>
+    /// <param name="jobs"></param>
+    private IScope[] ExecuteOnHive(EngineJob[] jobs, IScope parentScopeClone, CancellationToken cancellationToken) {
+      LogMessage(string.Format("Executing {0} operations on the hive.", jobs.Length));
+      IScope[] scopes = new Scope[jobs.Length];
+      object locker = new object();
+      IDictionary<Guid, int> jobIndices = new Dictionary<Guid, int>();
+
+      try {
+        List<Guid> remainingJobIds = new List<Guid>();
+        List<LightweightJob> lightweightJobs;
+
+        int finishedCount = 0;
+        int uploadCount = 0;
+
+        // create upload-tasks
+        var uploadTasks = new List<Task<Job>>();
+        for (int i = 0; i < jobs.Length; i++) {
+          var job = jobs[i];
+
+          // shuffle random variable to avoid the same random sequence in each operation; todo: does not yet work (it cannot find the random variable)
+          IRandom random = FindRandomParameter(job.InitialOperation as IExecutionContext);
+          if (random != null)
+            random.Reset(random.Next());
+
+          uploadTasks.Add(Task.Factory.StartNew<Job>((keyValuePairObj) => {
+            return UploadJob(keyValuePairObj, parentScopeClone, cancellationToken, GetResourceIds());
+          }, new KeyValuePair<int, EngineJob>(i, job), cancellationToken));
+        }
+
+        Task processUploadedJobsTask = new Task(() => {
+          // process finished upload-tasks
+          int uploadTasksCount = uploadTasks.Count;
+          for (int i = 0; i < uploadTasksCount; i++) {
+            cancellationToken.ThrowIfCancellationRequested();
+
+            var uploadTasksArray = uploadTasks.ToArray();
+            var task = uploadTasksArray[Task.WaitAny(uploadTasksArray)];
+            if (task.Status == TaskStatus.Faulted) {
+              LogException(task.Exception);
+              throw task.Exception;
+            }
+
+            int key = ((KeyValuePair<int, EngineJob>)task.AsyncState).Key;
+            Job job = task.Result;
+            lock (locker) {
+              uploadCount++;
+              jobIndices.Add(job.Id, key);
+              remainingJobIds.Add(job.Id);
+            }
+            jobs[key] = null; // relax memory
+            LogMessage(string.Format("Uploaded job #{0}", key + 1, job.Id));
+            uploadTasks.Remove(task);
+          }
+        }, cancellationToken, TaskCreationOptions.PreferFairness);
+        processUploadedJobsTask.Start();
+
+        // poll job-statuses and create tasks for those which are finished
+        var downloadTasks = new List<Task<EngineJob>>();
+        var executionTimes = new List<TimeSpan>();
+        var executionTimeOnHiveBefore = executionTimeOnHive;
+        while (processUploadedJobsTask.Status != TaskStatus.RanToCompletion || remainingJobIds.Count > 0) {
+          cancellationToken.ThrowIfCancellationRequested();
+
+          Thread.Sleep(10000);
+          try {
+            lightweightJobs = ServiceLocator.Instance.CallHiveService(s => s.GetLightweightJobs(remainingJobIds));
+
+            var jobsFinished = lightweightJobs.Where(j => j.State == JobState.Finished || j.State == JobState.Failed || j.State == JobState.Aborted);
+            finishedCount += jobsFinished.Count();
+            if (jobsFinished.Count() > 0) LogMessage(string.Format("Finished: {0}/{1}", finishedCount, jobs.Length));
+            ExecutionTimeOnHive = executionTimeOnHiveBefore + executionTimes.Sum() + lightweightJobs.Select(x => x.ExecutionTime.HasValue ? x.ExecutionTime.Value : TimeSpan.Zero).Sum();
+
+            foreach (var result in jobsFinished) {
+              if (result.State == JobState.Finished) {
+                downloadTasks.Add(Task.Factory.StartNew<EngineJob>((jobIdObj) => {
+                  return DownloadJob(jobIndices, jobIdObj, cancellationToken);
+                }, result.Id, cancellationToken));
+              } else if (result.State == JobState.Aborted) {
+                LogMessage(string.Format("Job #{0} aborted (id: {1})", jobIndices[result.Id] + 1, result.Id));
+              } else if (result.State == JobState.Failed) {
+                LogMessage(string.Format("Job #{0} failed (id: {1}): {2}", jobIndices[result.Id] + 1, result.Id, result.CurrentStateLog != null ? result.CurrentStateLog.Exception : string.Empty));
+              }
+              remainingJobIds.Remove(result.Id);
+              executionTimes.Add(result.ExecutionTime.HasValue ? result.ExecutionTime.Value : TimeSpan.Zero);
+            }
+          }
+          catch (Exception e) {
+            LogException(e);
+          }
+        }
+
+        // process finished download-tasks
+        int downloadTasksCount = downloadTasks.Count;
+        for (int i = 0; i < downloadTasksCount; i++) {
+          cancellationToken.ThrowIfCancellationRequested();
+
+          var downloadTasksArray = downloadTasks.ToArray();
+          var task = downloadTasksArray[Task.WaitAny(downloadTasksArray)];
+          var jobId = (Guid)task.AsyncState;
+          if (task.Status == TaskStatus.Faulted) {
+            LogException(task.Exception);
+            throw task.Exception;
+          }
+          scopes[jobIndices[(Guid)task.AsyncState]] = ((IAtomicOperation)task.Result.InitialOperation).Scope;
+          downloadTasks.Remove(task);
+        }
+
+        LogMessage(string.Format("All jobs finished (TotalExecutionTime: {0}).", executionTimes.Sum()));
+        DeleteJobs(jobIndices);
+
+        return scopes;
+      }
+      catch (OperationCanceledException e) {
+        lock (locker) {
+          if (jobIndices != null) DeleteJobs(jobIndices);
+        }
+        throw e;
+      }
+      catch (Exception e) {
+        lock (locker) {
+          if (jobIndices != null) DeleteJobs(jobIndices);
+        }
+        LogException(e);
+        throw e;
+      }
+    }
+
+    private void DeleteJobs(IDictionary<Guid, int> jobIndices) {
+      if (jobIndices.Count > 0) {
+        TryAndRepeat(() => {
+          LogMessage(string.Format("Deleting {0} jobs on hive.", jobIndices.Count));
+          ServiceLocator.Instance.CallHiveService(service => {
+            foreach (Guid jobId in jobIndices.Keys) {
+              service.DeleteJob(jobId);
+            }
+            jobIndices.Clear();
+          });
+        }, 5, string.Format("Could not delete {0} jobs", jobIndices.Count));
+      }
+    }
+
+    private static object locker = new object();
+    private Job UploadJob(object keyValuePairObj, IScope parentScopeClone, CancellationToken cancellationToken, List<Guid> resourceIds) {
+      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>();
+        PluginUtil.CollectDeclaringPlugins(neededPlugins, usedTypes);
+
+        job.CoresNeeded = 1;
+        job.PluginsNeededIds = ServiceLocator.Instance.CallHiveService(s => PluginUtil.GetPluginDependencies(s, this.OnlinePlugins, this.AlreadyUploadedPlugins, neededPlugins, false));
+        job.Priority = priority;
+
+        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 => {
+        var resourceNames = ResourceIds.Split(';');
+        var resourceIds = new List<Guid>();
+        foreach (var resourceName in resourceNames) {
+          Guid resourceId = service.GetResourceId(resourceName);
+          if (resourceId == Guid.Empty) {
+            throw new ResourceNotFoundException(string.Format("Could not find the resource '{0}'", resourceName));
+          }
+          resourceIds.Add(resourceId);
+        }
+        return resourceIds;
+      });
+    }
+
+    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) {
+        Log.LogMessage(message);
+      }
+    }
+
+    /// <summary>
+    /// Threadsafe exception logging
+    /// </summary>
+    private void LogException(Exception exception) {
+      lock (Log) {
+        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) {
+      while (repetitions > 0) {
+        try { action(); }
+        catch (Exception e) {
+          repetitions--;
+          if (repetitions == 0) {
+            throw new HiveEngineException(errorMessage, e);
+          }
+        }
+      }
+    }
+
+    private static void TryAndRepeat(Action action) {
+      TryAndRepeat(action, -1, string.Empty);
+    }
+  }
+
+  public static class ScopeExtensions {
+    public static void ClearParentScopes(this IScope scope) {
+      scope.ClearParentScopes(null);
+    }
+
+    public static void ClearParentScopes(this IScope scope, IScope childScope) {
+      if (childScope != null) {
+        scope.SubScopes.Clear();
+        scope.SubScopes.Add(childScope);
+      }
+      if (scope.Parent != null)
+        scope.Parent.ClearParentScopes(scope);
+    }
+  }
+
+  public static class EnumerableExtensions {
+    public static TimeSpan Sum(this IEnumerable<TimeSpan> times) {
+      return TimeSpan.FromMilliseconds(times.Select(e => e.TotalMilliseconds).Sum());
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Properties/AssemblyInfo.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Properties/AssemblyInfo.frame	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Properties/AssemblyInfo.frame	(revision 5958)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.HiveEngine-3.4")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2011 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7c14407e-6980-465b-ba3a-4a916d48989b")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.Designer.cs	(revision 5958)
@@ -0,0 +1,137 @@
+﻿namespace HeuristicLab.HiveEngine.Views {
+  partial class HiveEngineView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.resourceIdsLabel = new System.Windows.Forms.Label();
+      this.resourceIdsTextBox = new System.Windows.Forms.TextBox();
+      this.priorityLabel = new System.Windows.Forms.Label();
+      this.priorityTextBox = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.executionTimeOnHiveTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Size = new System.Drawing.Size(623, 20);
+      // 
+      // logView
+      // 
+      this.logView.Location = new System.Drawing.Point(0, 78);
+      this.logView.Size = new System.Drawing.Size(715, 469);
+      // 
+      // resourceIdsLabel
+      // 
+      this.resourceIdsLabel.AutoSize = true;
+      this.resourceIdsLabel.Location = new System.Drawing.Point(113, 55);
+      this.resourceIdsLabel.Name = "resourceIdsLabel";
+      this.resourceIdsLabel.Size = new System.Drawing.Size(70, 13);
+      this.resourceIdsLabel.TabIndex = 3;
+      this.resourceIdsLabel.Text = "ResourceIds:";
+      // 
+      // resourceIdsTextBox
+      // 
+      this.resourceIdsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.resourceIdsTextBox.Location = new System.Drawing.Point(189, 52);
+      this.resourceIdsTextBox.Name = "resourceIdsTextBox";
+      this.resourceIdsTextBox.Size = new System.Drawing.Size(526, 20);
+      this.resourceIdsTextBox.TabIndex = 4;
+      this.resourceIdsTextBox.Text = "HEAL";
+      this.resourceIdsTextBox.TextChanged += new System.EventHandler(this.resourceIdsTextBox_TextChanged);
+      // 
+      // priorityLabel
+      // 
+      this.priorityLabel.AutoSize = true;
+      this.priorityLabel.Location = new System.Drawing.Point(3, 55);
+      this.priorityLabel.Name = "priorityLabel";
+      this.priorityLabel.Size = new System.Drawing.Size(41, 13);
+      this.priorityLabel.TabIndex = 5;
+      this.priorityLabel.Text = "Priority:";
+      // 
+      // priorityTextBox
+      // 
+      this.priorityTextBox.Location = new System.Drawing.Point(50, 52);
+      this.priorityTextBox.Name = "priorityTextBox";
+      this.priorityTextBox.Size = new System.Drawing.Size(57, 20);
+      this.priorityTextBox.TabIndex = 6;
+      this.priorityTextBox.Text = "0";
+      this.priorityTextBox.TextChanged += new System.EventHandler(this.priorityTextBox_TextChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 29);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(123, 13);
+      this.label1.TabIndex = 7;
+      this.label1.Text = "Execution Time on Hive:";
+      // 
+      // executionTimeOnHiveTextBox
+      // 
+      this.executionTimeOnHiveTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeOnHiveTextBox.Location = new System.Drawing.Point(129, 26);
+      this.executionTimeOnHiveTextBox.Name = "executionTimeOnHiveTextBox";
+      this.executionTimeOnHiveTextBox.ReadOnly = true;
+      this.executionTimeOnHiveTextBox.Size = new System.Drawing.Size(586, 20);
+      this.executionTimeOnHiveTextBox.TabIndex = 8;
+      // 
+      // HiveEngineView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.executionTimeOnHiveTextBox);
+      this.Controls.Add(this.priorityTextBox);
+      this.Controls.Add(this.priorityLabel);
+      this.Controls.Add(this.resourceIdsLabel);
+      this.Controls.Add(this.resourceIdsTextBox);
+      this.Name = "HiveEngineView";
+      this.Size = new System.Drawing.Size(715, 550);
+      this.Controls.SetChildIndex(this.resourceIdsTextBox, 0);
+      this.Controls.SetChildIndex(this.resourceIdsLabel, 0);
+      this.Controls.SetChildIndex(this.priorityLabel, 0);
+      this.Controls.SetChildIndex(this.priorityTextBox, 0);
+      this.Controls.SetChildIndex(this.logView, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.executionTimeOnHiveTextBox, 0);
+      this.Controls.SetChildIndex(this.label1, 0);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label resourceIdsLabel;
+    private System.Windows.Forms.TextBox resourceIdsTextBox;
+    private System.Windows.Forms.Label priorityLabel;
+    private System.Windows.Forms.TextBox priorityTextBox;
+    private System.Windows.Forms.Label label1;
+    protected System.Windows.Forms.TextBox executionTimeOnHiveTextBox;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.cs	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.cs	(revision 5958)
@@ -0,0 +1,80 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.Core.Views;
+
+namespace HeuristicLab.HiveEngine.Views {
+  [View("Hive Engine View")]
+  [Content(typeof(HiveEngine), IsDefaultView = true)]
+  public sealed partial class HiveEngineView : EngineView {
+    public new HiveEngine Content {
+      get { return (HiveEngine)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HiveEngineView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExecutionTimeOnHiveChanged -= new EventHandler(Content_ExecutionTimeOnHiveChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutionTimeOnHiveChanged += new EventHandler(Content_ExecutionTimeOnHiveChanged);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ExecutionTimeOnHiveChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ExecutionTimeOnHiveChanged), sender, e);
+      } else {
+        executionTimeOnHiveTextBox.Text = Content.ExecutionTimeOnHive.ToString();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        resourceIdsTextBox.Text = string.Empty;
+        priorityTextBox.Text = string.Empty;
+        executionTimeOnHiveTextBox.Text = string.Empty;
+      } else {
+        resourceIdsTextBox.Text = Content.ResourceIds;
+        priorityTextBox.Text = Content.Priority.ToString();
+        executionTimeOnHiveTextBox.Text = Content.ExecutionTimeOnHive.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // Enable or disable controls based on whether the content is null or the view is set readonly
+      if (Content != null) {
+        resourceIdsTextBox.ReadOnly = this.ReadOnly;
+        priorityTextBox.ReadOnly = this.ReadOnly;
+      } else {
+        resourceIdsTextBox.ReadOnly = false;
+        priorityTextBox.ReadOnly = false;
+      }
+    }
+    
+    #region Event Handlers (child controls)
+    private void resourceIdsTextBox_TextChanged(object sender, EventArgs e) {
+      Content.ResourceIds = resourceIdsTextBox.Text;
+    }
+    #endregion
+
+    private void priorityTextBox_TextChanged(object sender, EventArgs e) {
+      Content.Priority = int.Parse(priorityTextBox.Text);
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.resx	(revision 5958)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Views/HiveEngineView.resx	(revision 5958)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
