Index: /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveExperiment.cs	(revision 4812)
+++ /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveExperiment.cs	(revision 4813)
@@ -72,5 +72,5 @@
       get { return log; }
     }
-    
+
     private string resourceIds;
     public string ResourceIds {
@@ -83,5 +83,5 @@
       }
     }
-    
+
     private bool isPollingResults;
     public bool IsPollingResults {
@@ -465,9 +465,14 @@
             LogMessage(hj.JobDto.Id, "Downloading optimizer for job");
             OptimizerJob optimizerJob = LoadOptimizerJob(hj.JobDto.Id);
-            if (jobResult.ParentJobId.HasValue) {
-              HiveJob parentHiveJob = HiveJob.GetHiveJobByJobId(jobResult.ParentJobId.Value);
-              parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.JobDto.Id);
+            if (optimizerJob == null) {
+              // something bad happened to this job. set to finished to allow the rest beeing downloaded
+              hj.IsFinishedOptimizerDownloaded = true;
             } else {
-              this.HiveJob.IsFinishedOptimizerDownloaded = true;
+              if (jobResult.ParentJobId.HasValue) {
+                HiveJob parentHiveJob = HiveJob.GetHiveJobByJobId(jobResult.ParentJobId.Value);
+                parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.JobDto.Id);
+              } else {
+                this.HiveJob.IsFinishedOptimizerDownloaded = true;
+              }
             }
           }
@@ -584,5 +589,11 @@
         jobCount++;
         progress.Status = string.Format("Deserializing {0} of {1} jobs ({2} kb)...", jobCount, totalJobCount, allSerializedJobs[jobResult.Id].SerializedJobData.Count() / 1024);
-        OptimizerJob optimizerJob = SerializedJob.Deserialize<OptimizerJob>(allSerializedJobs[jobResult.Id].SerializedJobData);
+        OptimizerJob optimizerJob = null;
+        try {
+          optimizerJob = SerializedJob.Deserialize<OptimizerJob>(allSerializedJobs[jobResult.Id].SerializedJobData);
+        }
+        catch {
+          optimizerJob = null;
+        }
         progress.ProgressValue = (double)jobCount / totalJobCount;
         HiveJob childHiveJob = new HiveJob(optimizerJob, false);
@@ -598,5 +609,10 @@
       using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
         ResponseObject<SerializedJob> serializedJob = service.Obj.GetLastSerializedResult(jobId);
-        return SerializedJob.Deserialize<OptimizerJob>(serializedJob.Obj.SerializedJobData);
+        try {
+          return SerializedJob.Deserialize<OptimizerJob>(serializedJob.Obj.SerializedJobData);
+        }
+        catch {
+          return null;
+        }
       }
     }
Index: /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveJob.cs	(revision 4812)
+++ /branches/HeuristicLab.Hive.ExperimentManager/HeuristicLab.Hive.ExperimentManager/3.3/HiveJob.cs	(revision 4813)
@@ -31,4 +31,6 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure.Manager;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Hive.ExperimentManager {
@@ -79,5 +81,5 @@
           DergisterOptimizerEvents();
           job = value;
-          if (job.ExecutionState == ExecutionState.Stopped) {
+          if (job != null && job.ExecutionState == ExecutionState.Stopped) {
             IsFinishedOptimizerDownloaded = true;
           }
@@ -142,5 +144,10 @@
       this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
       this.JobDto = serializedJob.JobInfo;
-      this.Job = SerializedJob.Deserialize<OptimizerJob>(serializedJob.SerializedJobData);
+      try {
+        this.Job = SerializedJob.Deserialize<OptimizerJob>(serializedJob.SerializedJobData);
+      }
+      catch {
+        this.Job = null;
+      }
       this.syncJobsWithOptimizers = true;
     }
@@ -163,5 +170,5 @@
     /// </summary>
     private void UpdateChildHiveJobs() {
-      if (Job != null && syncJobsWithOptimizers) {
+      if (Job != null && Job.Optimizer != null && syncJobsWithOptimizers) {
         if (Job.Optimizer is Optimization.Experiment) {
           Optimization.Experiment experiment = (Optimization.Experiment)Job.Optimizer;
@@ -184,5 +191,5 @@
 
     private void RegisterOptimizerEvents() {
-      if (Job != null) {
+      if (Job != null && Job.Optimizer != null) {
         if (Job.Optimizer is Optimization.Experiment) {
           Optimization.Experiment experiment = Job.OptimizerAsExperiment;
@@ -288,10 +295,12 @@
       this.childHiveJobs.Add(hiveJob);
       syncJobsWithOptimizers = false;
-      if (this.Job.Optimizer is Optimization.Experiment) {
-        if (!this.Job.OptimizerAsExperiment.Optimizers.Contains(hiveJob.Job.Optimizer)) {
-          UpdateOptimizerInExperiment(this.Job.OptimizerAsExperiment, hiveJob.Job);
-        }
-      } else if (this.Job.Optimizer is Optimization.BatchRun) {
-        UpdateOptimizerInBatchRun(this.Job.OptimizerAsBatchRun, hiveJob.Job);
+      if (this.Job != null && hiveJob.Job != null) {
+        if (this.Job.Optimizer is Optimization.Experiment) {
+          if (!this.Job.OptimizerAsExperiment.Optimizers.Contains(hiveJob.Job.Optimizer)) {
+            UpdateOptimizerInExperiment(this.Job.OptimizerAsExperiment, hiveJob.Job);
+          }
+        } else if (this.Job.Optimizer is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.Job.OptimizerAsBatchRun, hiveJob.Job);
+        }
       }
       syncJobsWithOptimizers = true;
@@ -308,14 +317,16 @@
       bool childIsFinishedOptimizerDownloaded = false;
 
-      if (this.Job.Optimizer is Optimization.Experiment) {
-        UpdateOptimizerInExperiment(this.Job.OptimizerAsExperiment, optimizerJob);
-        childIsFinishedOptimizerDownloaded = true;
-      } else if (this.Job.Optimizer is Optimization.BatchRun) {
-        UpdateOptimizerInBatchRun(this.Job.OptimizerAsBatchRun, optimizerJob);
-        if (this.Job.OptimizerAsBatchRun.Repetitions == this.Job.Optimizer.Runs.Count) {
+      if (this.Job != null && this.Job.Optimizer != null) {
+        if (this.Job.Optimizer is Optimization.Experiment) {
+          UpdateOptimizerInExperiment(this.Job.OptimizerAsExperiment, optimizerJob);
           childIsFinishedOptimizerDownloaded = true;
-        }
-      } else {
-        childIsFinishedOptimizerDownloaded = optimizerJob.Optimizer.ExecutionState == ExecutionState.Stopped;
+        } else if (this.Job.Optimizer is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.Job.OptimizerAsBatchRun, optimizerJob);
+          if (this.Job.OptimizerAsBatchRun.Repetitions == this.Job.Optimizer.Runs.Count) {
+            childIsFinishedOptimizerDownloaded = true;
+          }
+        } else {
+          childIsFinishedOptimizerDownloaded = optimizerJob.Optimizer.ExecutionState == ExecutionState.Stopped;
+        }
       }
 
@@ -374,5 +385,5 @@
     /// </summary>
     internal void SetIndexInParentOptimizerList(HiveJob parentHiveJob) {
-      if (parentHiveJob != null) {
+      if (parentHiveJob != null && parentHiveJob.Job != null && parentHiveJob.Job.Optimizer != null) {
         if (parentHiveJob.Job.Optimizer is Optimization.Experiment) {
           this.Job.IndexInParentOptimizerList = parentHiveJob.Job.OptimizerAsExperiment.Optimizers.IndexOf(this.Job.Optimizer);
@@ -389,5 +400,5 @@
 
     public override string ToString() {
-      if (jobDto != null) {
+      if (job != null) {
         return job.ToString();
       } else {
@@ -420,4 +431,7 @@
     /// </param>
     public SerializedJob GetAsSerializedJob(bool withoutChildOptimizers) {
+      if (this.job == null || this.job.Optimizer == null)
+        return null;
+
       byte[] jobByteArray;
       if (withoutChildOptimizers && this.Job.Optimizer is Optimization.Experiment) {
@@ -450,5 +464,8 @@
     /// </summary>
     private void UpdateRequiredPlugins() {
-      this.JobDto.PluginsNeeded = HivePluginInfoDto.FindPluginsNeeded(job.GetType());
+      if (job != null) {
+        //this.JobDto.PluginsNeeded = HivePluginInfoDto.FindPluginsNeeded(job);
+        this.JobDto.PluginsNeeded = ApplicationManager.Manager.Plugins.Select(x => new HivePluginInfoDto { Name = x.Name, Version = x.Version }).ToList();
+      }
     }
 
