Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6039)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ExperimentManager/RefreshableHiveExperiment.cs	(revision 6110)
@@ -25,8 +25,7 @@
 using System.Drawing;
 using System.Linq;
-using HeuristicLab.Clients.Hive.ExperimentManager;
-using HeuristicLab.Clients.Hive.Jobs;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Hive;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -35,4 +34,5 @@
   public class RefreshableHiveExperiment : IHiveItem, IDeepCloneable, IContent, IProgressReporter {
     private JobResultPoller jobResultPoller;
+    private JobDownloader<ItemJob> jobDownloader = new JobDownloader<ItemJob>(2, 2);
 
     [Storable]
@@ -69,9 +69,9 @@
           refreshAutomatically = value;
           OnRefreshAutomaticallyChanged();
-          if (RefreshAutomatically) {
-            StartResultPolling();
-          } else {
-            StopResultPolling();
-          }
+        }
+        if (RefreshAutomatically && hiveExperiment.HiveJobs != null && hiveExperiment.HiveJobs.Count > 0 && (jobResultPoller == null || !jobResultPoller.IsPolling)) {
+          StartResultPolling();
+        } else {
+          StopResultPolling();
         }
       }
@@ -103,27 +103,4 @@
     #endregion
 
-    //public Experiment GetExperiment(int idx) {
-    //  if (hiveExperiment.HiveJobs != null) {
-    //    var hj = hiveExperiment.HiveJobs.ElementAtOrDefault(idx);
-    //    if (hj != null)
-    //      return ((OptimizerHiveJob)hj).JobItem.OptimizerAsExperiment;
-    //  }
-    //  return null;
-    //}
-
-    //public void AddExperiment(Experiment experiment) {
-    //  if (hiveExperiment.HiveJobs == null)
-    //    hiveExperiment.HiveJobs = new ItemCollection<HiveJob>();
-    //  hiveExperiment.HiveJobs.Add(new OptimizerHiveJob(experiment));
-    //}
-
-    //public void SetExperiment(Experiment experiment) {
-    //  if (hiveExperiment.HiveJobs == null)
-    //    hiveExperiment.HiveJobs = new ItemCollection<HiveJob>();
-    //  else
-    //    hiveExperiment.HiveJobs.Clear();
-    //  hiveExperiment.HiveJobs.Add(new OptimizerHiveJob(experiment));
-    //}
-
     private void hiveExperiment_HiveJobsChanged(object sender, EventArgs e) {
       if (jobResultPoller != null && jobResultPoller.IsPolling) {
@@ -141,5 +118,5 @@
     public void StartResultPolling() {
       if (jobResultPoller == null) {
-        jobResultPoller = new JobResultPoller(hiveExperiment.HiveJobs, /*ApplicationConstants.ResultPollingInterval*/new TimeSpan(0, 0, 5)); //TODO: find a better place for ApplicationConstants
+        jobResultPoller = new JobResultPoller(hiveExperiment.Id, /*ApplicationConstants.ResultPollingInterval*/new TimeSpan(0, 0, 5)); //TODO: find a better place for ApplicationConstants
         RegisterResultPollingEvents();
       }
@@ -172,5 +149,5 @@
     private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightJob>> e) {
       foreach (LightweightJob lightweightJob in e.Value) {
-        OptimizerHiveJob hj = GetHiveJobById(lightweightJob.Id);
+        HiveJob hj = GetHiveJobById(lightweightJob.Id);
         if (hj != null) {
           DateTime lastJobDataUpdate = hj.Job.LastJobDataUpdate;
@@ -179,18 +156,21 @@
           // lastJobDataUpdate equals DateTime.MinValue right after it was uploaded. When the first results are polled, this value is updated
           if (lastJobDataUpdate != DateTime.MinValue && lastJobDataUpdate < hj.Job.LastJobDataUpdate) {
-            OptimizerJob optimizerJob = ExperimentManagerClient.LoadOptimizerJob(hj.Job.Id);
-            if (optimizerJob == null) {
-              // something bad happened to this job. bad job, BAAAD job!
-            } else {
-              // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
-              if (hj.Job.State == JobState.Paused) {
-                hj.JobItem = optimizerJob;
+            jobDownloader.DownloadJob(hj.Job.Id, (itemJob) => {
+              if (itemJob == null) {
+                // something bad happened to this job. bad job, BAAAD job!
               } else {
-                if (lightweightJob.ParentJobId.HasValue) {
-                  OptimizerHiveJob parentHiveJob = GetHiveJobById(lightweightJob.ParentJobId.Value);
-                  parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.Job.Id);
+                // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
+                if (hj.Job.State == JobState.Paused) {
+                  hj.JobItem = itemJob;
+                } else {
+                  if (lightweightJob.ParentJobId.HasValue) {
+                    HiveJob parentHiveJob = GetHiveJobById(lightweightJob.ParentJobId.Value);
+                    parentHiveJob.IntegrateChild(itemJob, hj.Job.Id);
+                  } else {
+                    hj.JobItem = itemJob;
+                  }
                 }
               }
-            }
+            });
           }
         }
@@ -205,7 +185,7 @@
     }
 
-    public OptimizerHiveJob GetHiveJobById(Guid jobId) {
-      foreach (OptimizerHiveJob job in hiveExperiment.HiveJobs) {
-        var hj = job.GetHiveJobByJobId(jobId) as OptimizerHiveJob;
+    public HiveJob GetHiveJobById(Guid jobId) {
+      foreach (HiveJob job in hiveExperiment.HiveJobs) {
+        var hj = job.GetHiveJobByJobId(jobId);
         if (hj != null)
           return hj;
@@ -226,4 +206,8 @@
                                             || j.Job.State == JobState.Failed);
     }
+
+    //public bool AllJobsFinishedAndDownloaded() {
+    //  return this.AllJobsFinished() && hiveExperiment.GetAllHiveJobs().All(j => j.JobItem.;
+    //}
 
     private void jobResultPoller_ExceptionOccured(object sender, EventArgs<Exception> e) {
@@ -261,5 +245,5 @@
       hiveExperiment.IsProgressingChanged -= new EventHandler(hiveExperiment_IsProgressingChanged);
     }
-    
+
     #region Events
     public event EventHandler RefreshAutomaticallyChanged;
@@ -314,5 +298,5 @@
     }
     public void Store() {
-      hiveExperiment.Store() ;
+      hiveExperiment.Store();
     }
     public string ItemDescription {
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Heartbeat.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Heartbeat.cs	(revision 6039)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/Heartbeat.cs	(revision 6110)
@@ -31,7 +31,7 @@
 
     public override string ToString() {
-      String val = "SlaveId: " + SlaveId + ", FreeCores: " + FreeCores;
+      string val = string.Format("SlaveId: {0}, FreeCores: {1}", SlaveId, FreeCores);
       foreach (KeyValuePair<Guid, TimeSpan> kvp in JobProgress) {
-        val += Environment.NewLine + "Id" + kvp.Key + " ExecutionTime " + kvp.Value;
+        val += Environment.NewLine + string.Format("Id: {0}, ExecutionTime {1}", kvp.Key, kvp.Value);
       }
       return val;
