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 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/ExperimentManagerClient.cs	(revision 6111)
@@ -27,7 +27,7 @@
 using System.Threading;
 using HeuristicLab.Clients.Hive.ExperimentManager;
-using HeuristicLab.Clients.Hive.Jobs;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Hive;
 using HeuristicLab.PluginInfrastructure;
 
@@ -373,8 +373,8 @@
     }
 
-    public static OptimizerJob LoadOptimizerJob(Guid jobId) {
+    public static ItemJob LoadItemJob(Guid jobId) {
       JobData jobData = ServiceLocator.Instance.CallHiveService(s => s.GetJobData(jobId));
       try {
-        return PersistenceUtil.Deserialize<OptimizerJob>(jobData.Data);
+        return PersistenceUtil.Deserialize<ItemJob>(jobData.Data);
       }
       catch {
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/HiveJob.cs	(revision 6111)
@@ -344,4 +344,6 @@
       }
     }
+
+    public virtual void IntegrateChild(ItemJob job, Guid childJobId) { }
   }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobDownloader.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobDownloader.cs	(revision 6111)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobDownloader.cs	(revision 6111)
@@ -0,0 +1,64 @@
+﻿using System;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Hive;
+
+namespace HeuristicLab.Clients.Hive {
+  /// <summary>
+  /// Downloads and deserializes jobs. It avoids too many jobs beeing downloaded or deserialized at the same time to avoid memory problems
+  /// </summary>
+  public class JobDownloader<T> where T : class, IJob {
+    private bool abort = false;
+    // use semaphore to ensure only few concurrenct connections and few SerializedJob objects in memory
+    private Semaphore downloadSemaphore;
+    private Semaphore deserializeSemaphore;
+    
+    public JobDownloader(int concurrentDownloads, int concurrentDeserializations) {
+      downloadSemaphore = new Semaphore(concurrentDownloads, concurrentDownloads);
+      deserializeSemaphore = new Semaphore(concurrentDeserializations, concurrentDeserializations);
+      TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
+    }
+
+    public void DownloadJob(Guid jobId, Action<T> onFinishedAction) {
+      Task<JobData>.Factory.StartNew((x) => DownloadJob(x), jobId)
+                                     .ContinueWith((x) => DeserializeJob(x.Result))
+                                     .ContinueWith((x) => OnJobFinished(x.Result, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously);
+    }
+
+    private T OnJobFinished(T job, Action<T> onFinishedAction) {
+      onFinishedAction(job);
+      return job;
+    }
+
+    protected JobData DownloadJob(object jobId) {
+      downloadSemaphore.WaitOne();
+      deserializeSemaphore.WaitOne();
+      JobData result;
+      try {
+        if (abort) return null;
+        result = ServiceLocator.Instance.CallHiveService(s => s.GetJobData((Guid)jobId));
+      }
+      finally {
+        downloadSemaphore.Release();
+      }
+      return result;
+    }
+
+    protected T DeserializeJob(JobData jobData) {
+      try {
+        Job job = ServiceLocator.Instance.CallHiveService(s => s.GetJob(jobData.JobId));
+        if (abort || job == null || jobData == null) return null;
+        var deserializedJob = PersistenceUtil.Deserialize<T>(jobData.Data);
+        jobData.Data = null; // reduce memory consumption.
+        return deserializedJob;
+      }
+      finally {
+        deserializeSemaphore.Release();
+      }
+    }
+
+    private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) {
+      e.SetObserved(); // avoid crash of process because task crashes. first exception found is handled in Results property
+    }
+  }
+}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobResultPoller.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobResultPoller.cs	(revision 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/JobResultPoller.cs	(revision 6111)
@@ -26,13 +26,13 @@
 
 namespace HeuristicLab.Clients.Hive {
-  internal class JobResultPoller {
+  public class JobResultPoller {
     private bool stopRequested { get; set; }
     private AutoResetEvent waitHandle;
     private Thread thread;
 
-    private IEnumerable<HiveJob> hiveJobs;
-    public IEnumerable<HiveJob> HiveJobs {
-      get { return hiveJobs; }
-      set { hiveJobs = value; }
+    private Guid hiveExperimentId;
+    public Guid HiveExperimentId {
+      get { return hiveExperimentId; }
+      set { hiveExperimentId = value; }
     }
 
@@ -54,7 +54,7 @@
     }
 
-    public JobResultPoller(IEnumerable<HiveJob> hiveJobs, TimeSpan interval) {
+    public JobResultPoller(Guid hiveExperimentId, TimeSpan interval) {
       this.isPolling = false;
-      this.hiveJobs = hiveJobs;
+      this.hiveExperimentId = hiveExperimentId;
       this.interval = interval;
     }
@@ -75,5 +75,5 @@
     }
 
-    public void RunPolling() {
+    private void RunPolling() {
       try {
         waitHandle = new AutoResetEvent(false);
@@ -94,11 +94,10 @@
     }
 
-    private void FetchJobResults() {
-      ServiceLocator.Instance.CallHiveService(service => {
+    public IEnumerable<LightweightJob> FetchJobResults() {
+      return ServiceLocator.Instance.CallHiveService(service => {
         var responses = new List<LightweightJob>();
-        foreach (HiveJob hiveJob in HiveJobs) {
-          responses.AddRange(service.GetLightweightChildJobs(hiveJob.Job.Id, true, true));
-        }
+        responses.AddRange(service.GetLightweightExperimentJobs(hiveExperimentId));
         OnJobResultsReceived(responses);
+        return responses;
       });
     }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs	(revision 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/OptimizerHiveJob.cs	(revision 6111)
@@ -26,4 +26,5 @@
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
+using HeuristicLab.Hive;
 using HeuristicLab.Optimization;
 using HeuristicLab.PluginInfrastructure;
@@ -169,5 +170,6 @@
     ///   add the runs from the optimizerJob to the batchrun and replace the Optimizer
     /// </summary>
-    public void UpdateChildOptimizer(OptimizerJob optimizerJob, Guid childJobId) {
+    public override void IntegrateChild(ItemJob job, Guid childJobId) {
+      var optimizerJob = (OptimizerJob)job;
       syncJobsWithOptimizers = false; // don't sync with optimizers during this method
 
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 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6111)
@@ -120,4 +120,5 @@
     <Compile Include="Exceptions\JobResultPollingException.cs" />
     <Compile Include="Exceptions\OptimizerNotFoundException.cs" />
+    <Compile Include="ExperimentManager\JobDownloader.cs" />
     <Compile Include="ExperimentManager\ExperimentManagerClient.cs" />
     <Compile Include="ExperimentManager\HiveJobDownloader.cs" />
@@ -130,4 +131,5 @@
     <Compile Include="Exceptions\ResourceNotFoundException.cs" />
     <Compile Include="IServiceLocator.cs" />
+    <Compile Include="Jobs\EngineJob.cs" />
     <Compile Include="Jobs\OptimizerJob.cs" />
     <Compile Include="HeuristicLabClientsHivePlugin.cs" />
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs	(revision 6111)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/EngineJob.cs	(revision 6111)
@@ -0,0 +1,125 @@
+﻿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.Clients.Hive {
+  [StorableClass]
+  public class EngineJob : ItemJob {
+    [Storable]
+    protected IOperation initialOperation;
+    public IOperation InitialOperation {
+      get { return initialOperation; }
+      set { initialOperation = value; }
+    }
+
+    public new IEngine Item {
+      get { return (IEngine)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public override TimeSpan ExecutionTime {
+      get { return Item.ExecutionTime; }
+    }
+
+    public override ExecutionState ExecutionState {
+      get { return Item.ExecutionState; }
+    }
+
+    #region constructors and cloning
+    public EngineJob() { }
+    public EngineJob(IOperation initialOperation, IEngine engine) {
+      this.initialOperation = initialOperation;
+      this.Item = engine;
+    }
+
+    [StorableConstructor]
+    protected EngineJob(bool deserializing) : base(deserializing) { }
+    protected EngineJob(EngineJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.initialOperation = cloner.Clone(original.initialOperation);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EngineJob(this, cloner);
+    }
+    #endregion
+
+    public override bool IsParallelizable {
+      get { return false; }
+    }
+
+    public override void Prepare() { }
+
+    public override void Start() {
+      Item.Prepare(initialOperation);
+      Item.Start();
+    }
+    
+    public override void Pause() {
+      Item.Pause();
+    }
+
+    public override void Stop() {
+      Item.Stop();
+    }
+    
+    public override void Resume(IEnumerable<IJob> childJobs) {
+      throw new NotImplementedException();
+    }
+
+    protected override void RegisterItemEvents() {
+      Item.Stopped += new EventHandler(engine_Stopped);
+      Item.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
+    }
+
+    protected override void DeregisterItemEvents() {
+      Item.Stopped -= new EventHandler(engine_Stopped);
+      Item.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(engine_ExceptionOccurred);
+    }
+
+    private void engine_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      OnJobFailed(e);
+    }
+
+    private 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 Item.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.Clients.Hive/3.4/Jobs/OptimizerJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6111)
@@ -131,4 +131,7 @@
       Item.NameChanged += new EventHandler(optimizer_NameChanged);
       Item.NameChanging += new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
+      Item.ExecutionStateChanged += new EventHandler(optimizer_ExecutionStateChanged);
+      Item.ExecutionTimeChanged += new EventHandler(optimizer_ExecutionTimeChanged);
+      Item.Started += new EventHandler(optimizer_Started);
     }
 
@@ -140,4 +143,7 @@
       Item.NameChanged -= new EventHandler(optimizer_NameChanged);
       Item.NameChanging -= new EventHandler<CancelEventArgs<string>>(optimizer_NameChanging);
+      Item.ExecutionStateChanged -= new EventHandler(optimizer_ExecutionStateChanged);
+      Item.ExecutionTimeChanged -= new EventHandler(optimizer_ExecutionTimeChanged);
+      Item.Started -= new EventHandler(optimizer_Started);      
       base.DeregisterItemEvents();
     }
@@ -159,4 +165,8 @@
     }
 
+    protected virtual void optimizer_Started(object sender, EventArgs e) {
+      OnJobStarted();
+    }
+
     protected virtual void optimizer_Stopped(object sender, EventArgs e) {
       OnJobStopped();
@@ -165,4 +175,12 @@
     protected virtual void optimizer_Paused(object sender, EventArgs e) {
       OnJobPaused();
+    }
+
+    protected virtual void optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
+      OnExecutionTimeChanged();
+    }
+
+    protected virtual void optimizer_ExecutionStateChanged(object sender, EventArgs e) {
+      OnExecutionStateChanged();
     }
     #endregion
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 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HeuristicLab.HiveEngine-3.4.csproj	(revision 6111)
@@ -150,5 +150,4 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="EngineJob.cs" />
     <Compile Include="HeuristicLabHiveEnginePlugin.cs" />
     <Compile Include="Exceptions\ScopeMergeException.cs" />
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 6110)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6111)
@@ -226,5 +226,5 @@
       object locker = new object();
       IDictionary<Guid, int> jobIndices = new Dictionary<Guid, int>();
-      var hiveExperiment = new HiveExperiment();;
+      var hiveExperiment = new HiveExperiment();
 
       try {
@@ -240,5 +240,6 @@
         hiveExperiment.ResourceNames = this.ResourceNames;
         hiveExperiment.Id = ServiceLocator.Instance.CallHiveService(s => s.AddHiveExperiment(hiveExperiment));
-        hiveExperiments.Add(new RefreshableHiveExperiment(hiveExperiment));
+        var refreshableHiveExperiment = new RefreshableHiveExperiment(hiveExperiment);
+        hiveExperiments.Add(refreshableHiveExperiment);
 
         // create upload-tasks
@@ -283,4 +284,14 @@
         }, cancellationToken, TaskCreationOptions.PreferFairness);
         processUploadedJobsTask.Start();
+
+        refreshableHiveExperiment.RefreshAutomatically = true;
+        
+        while (!refreshableHiveExperiment.AllJobsFinished()) {
+          Thread.Sleep(1000);
+          // update time
+          // handle cancellation
+        }
+
+
 
         // poll job-statuses and create tasks for those which are finished
