Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/HeuristicLab.Analysis.SolutionCaching-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/HeuristicLab.Analysis.SolutionCaching-3.3.csproj	(revision 10116)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/HeuristicLab.Analysis.SolutionCaching-3.3.csproj	(revision 10117)
@@ -93,4 +93,5 @@
     <Reference Include="System.Core" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierHiveTask.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierHiveTask.cs	(revision 10116)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierHiveTask.cs	(revision 10117)
@@ -20,6 +20,10 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Clients.Hive;
 using HeuristicLab.Common;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Analysis.SolutionCaching {
@@ -30,14 +34,77 @@
       ItemTask = task;
     }
+
     public RunCollectionModifierHiveTask(RunCollectionModifierExecutable executable)
       : base() {
       ItemTask = new RunCollectionModifierTask(executable);
     }
+
     protected RunCollectionModifierHiveTask(RunCollectionModifierHiveTask original, Cloner cloner)
-      : base(original, cloner) { }
+      : base(original, cloner) {
+    }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new RunCollectionModifierHiveTask(this, cloner);
     }
     #endregion
+
+    public override void IntegrateChild(ItemTask task, Guid childTaskId) {
+      var optimizerTask = (RunCollectionModifierTask)task;
+      syncTasksWithOptimizers = false; // don't sync with optimizers during this method
+
+      if (this.ItemTask != null && this.ItemTask.Item != null) {
+        itemTaskLock.EnterWriteLock();
+        try {
+          this.ItemTask.Item.RunCollection.AddRange(((RunCollectionModifierExecutable)task.Item).RunCollection);
+        }
+        finally {
+          itemTaskLock.ExitWriteLock();
+        }
+      }
+
+      IEnumerable<HiveTask> childs = this.ChildHiveTasks.Where(j => j.Task.Id == childTaskId);
+      //TODO: in very rare cases childs is empty. This shouldn't be the case and should be further investigated.
+      if (childs.Count() > 0) {
+        RunCollectionModifierHiveTask child = childs.First() as RunCollectionModifierHiveTask;
+        if (child != null && !optimizerTask.ComputeInParallel) {
+          child.ItemTask = optimizerTask;
+        }
+      }
+      syncTasksWithOptimizers = true;
+    }
+
+    protected override void UpdateChildHiveTasks() {
+      childHiveTasksLock.EnterWriteLock();
+      try {
+        if (Task != null && syncTasksWithOptimizers) {
+          if (!ItemTask.ComputeInParallel) {
+            if (childHiveTasks.Any()) {
+              var exec = (RunCollectionModifierExecutable)ItemTask.Item;
+              //compute in parallel was deactivated, copy runs back
+              foreach (var childHiveTask in childHiveTasks) {
+                exec.RunCollection.AddRange(((RunCollectionModifierExecutable)childHiveTask.ItemTask.Item).RunCollection);
+              }
+            }
+            childHiveTasks.Clear();
+          } else {
+            var runs = ItemTask.Item.RunCollection;
+            foreach (var run in runs) {
+              var exec = (RunCollectionModifierExecutable)ItemTask.Item.Clone(new Cloner());
+              //TODO: this could be more efficient, create new RCME instead of cloning
+              exec.RunCollection.Clear();
+              exec.RunCollection.Add(run);
+
+              var rcmHiveTask = new RunCollectionModifierHiveTask(exec);
+              rcmHiveTask.Task.Priority = Task.Priority;
+              childHiveTasks.Add(rcmHiveTask);
+            }
+            ItemTask.Item.RunCollection.Clear();
+          }
+        }
+      }
+      finally {
+        childHiveTasksLock.ExitWriteLock();
+      }
+    }
   }
 }
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierTask.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierTask.cs	(revision 10116)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.SolutionCaching/3.3/RunCollectionModifiers/RunCollectionModifierTask.cs	(revision 10117)
@@ -30,7 +30,7 @@
   [StorableClass]
   public class RunCollectionModifierTask : ItemTask {
-    public override bool IsParallelizable {
+    /*public override bool IsParallelizable {
       get { return false; }
-    }
+    } */
 
     public new RunCollectionModifierExecutable Item {
