Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 6023)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 6024)
@@ -48,7 +48,7 @@
 
     private static int metaAlgorithmPopulationSize = 10;
-    private static int metaAlgorithmMaxGenerations = 10;
+    private static int metaAlgorithmMaxGenerations = 20;
     private static int metaProblemRepetitions = 2;
-    private static int baseAlgorithmMaxGenerations = 10;
+    private static int baseAlgorithmMaxGenerations = 50;
     private static double mutationProbability = 0.10;
 
@@ -80,6 +80,6 @@
       MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
       metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
-      GeneticAlgorithm metaLevelAlgorithm = GetMetaGA(metaOptimizationProblem);
-      //GeneticAlgorithm metaLevelAlgorithm = GetParallelMetaGA(metaOptimizationProblem);
+      //GeneticAlgorithm metaLevelAlgorithm = GetMetaGA(metaOptimizationProblem);
+      GeneticAlgorithm metaLevelAlgorithm = GetParallelMetaGA(metaOptimizationProblem);
       //GeneticAlgorithm metaLevelAlgorithm = GetHiveParallelMetaGA(metaOptimizationProblem);
 
@@ -353,9 +353,10 @@
         tasks[i] = new Task<TimeSpan>((alg) => {
           Console.WriteLine("Task {0} started.", Task.CurrentId);
+          var cancellationTokenSource = new CancellationTokenSource();
 
           Stopwatch swx = new Stopwatch();
           swx.Start();
           ((EngineAlgorithm)alg).ExecutionTimeChanged += new EventHandler(Program_ExecutionTimeChanged);
-          ((EngineAlgorithm)alg).StartSync();
+          ((EngineAlgorithm)alg).StartSync(cancellationTokenSource.Token);
           ((EngineAlgorithm)alg).ExecutionTimeChanged -= new EventHandler(Program_ExecutionTimeChanged);
           swx.Stop();
@@ -467,7 +468,8 @@
         algs.Enqueue(clonedGa);
 
+        var cancellationTokenSource = new CancellationTokenSource();
         //if (algs.Count > 24)
         //  algs.Dequeue();
-        clonedGa.StartSync();
+        clonedGa.StartSync(cancellationTokenSource.Token);
         sw.Stop();
         latestExecutionTimes.Enqueue(sw.Elapsed);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 6023)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 6024)
@@ -6,8 +6,4 @@
 
   public static class AlgorithmExtensions {
-    public static void StartSync(this IAlgorithm algorithm) {
-      var executor = new AlgorithmExecutor(algorithm);
-      executor.StartSync();
-    }
     public static void StartSync(this IAlgorithm algorithm, CancellationToken cancellationToken) {
       var executor = new AlgorithmExecutor(algorithm, cancellationToken);
@@ -23,14 +19,8 @@
     private AutoResetEvent waitHandle = new AutoResetEvent(false);
     private CancellationToken cancellationToken;
-    private bool useCancellationToken = false;
-
-    public AlgorithmExecutor(IAlgorithm algorithm) {
-      this.algorithm = algorithm;
-    }
 
     public AlgorithmExecutor(IAlgorithm algorithm, CancellationToken cancellationToken) {
       this.algorithm = algorithm;
       this.cancellationToken = cancellationToken;
-      this.useCancellationToken = true;
     }
 
@@ -38,22 +28,28 @@
       algorithm.Stopped += new EventHandler(algorithm_Stopped);
       algorithm.Paused += new EventHandler(algorithm_Paused);
-      
-      if(useCancellationToken && algorithm is EngineAlgorithm && ((EngineAlgorithm)algorithm).Engine is SequentialEngine.SequentialEngine) {
-        ((SequentialEngine.SequentialEngine)((EngineAlgorithm)algorithm).Engine).Start(cancellationToken);
-      } else {
+
+      using (CancellationTokenRegistration registration = cancellationToken.Register(new Action(cancellationToken_Canceled))) {
         algorithm.Start();
+        waitHandle.WaitOne();
+        waitHandle.Dispose();
       }
 
-      waitHandle.WaitOne();
-      waitHandle.Dispose();
       algorithm.Stopped -= new EventHandler(algorithm_Stopped);
       algorithm.Paused -= new EventHandler(algorithm_Paused);
+      if (algorithm.ExecutionState == Core.ExecutionState.Started) {
+        algorithm.Pause();
+      }
+      cancellationToken.ThrowIfCancellationRequested();
     }
 
-    void algorithm_Paused(object sender, EventArgs e) {
+    private void algorithm_Paused(object sender, EventArgs e) {
       waitHandle.Set();
     }
 
-    void algorithm_Stopped(object sender, EventArgs e) {
+    private void algorithm_Stopped(object sender, EventArgs e) {
+      waitHandle.Set();
+    }
+
+    private void cancellationToken_Canceled() {
       waitHandle.Set();
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 6023)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 6024)
@@ -64,4 +64,8 @@
       var sw = new Stopwatch();
       sw.Start();
+      //// prepare and clear is needed, if the algorithm has been started and stopped before (this happens when meta level algorithm is paused)
+      //algorithm.Prepare(); // <--- SHOULD NOT HAPPEN!
+      //algorithm.Runs.Clear();
+
       algorithm.StartSync(CancellationToken);
       sw.Stop();
