Index: branches/Async/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- branches/Async/HeuristicLab.Core/3.3/Engine.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Core/3.3/Engine.cs	(revision 15065)
@@ -23,5 +23,4 @@
 using System.Collections.Generic;
 using System.Threading;
-using System.Threading.Tasks;
 using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -82,30 +81,24 @@
     }
 
-    public override async Task StartAsync(CancellationToken cancellationToken) {
-      await base.StartAsync(cancellationToken);
-      cancellationTokenSource = new CancellationTokenSource();
+    public override void Start(CancellationToken cancellationToken) {
+      base.Start(cancellationToken);
+      cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
       stopPending = false;
-      using (var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokenSource.Token, cancellationToken)) {
-        Task task = Task.Factory.StartNew(Run, cts.Token, cts.Token);
-        await task.ContinueWith(t => {
-          try {
-            t.Wait();
-          }
-          catch (AggregateException ex) {
-            try {
-              ex.Flatten().Handle(x => x is OperationCanceledException);
-            }
-            catch (AggregateException remaining) {
-              if (remaining.InnerExceptions.Count == 1) OnExceptionOccurred(remaining.InnerExceptions[0]);
-              else OnExceptionOccurred(remaining);
-            }
-          }
-          cancellationTokenSource.Dispose();
-          cancellationTokenSource = null;
-          if (stopPending) executionStack.Clear();
-          if (executionStack.Count == 0) OnStopped();
-          else OnPaused();
-        });
+
+      try {
+        Run((object)cancellationTokenSource.Token);
+      } catch (OperationCanceledException) {
+      } catch (AggregateException ae) {
+        if (ae.InnerExceptions.Count == 1) OnExceptionOccurred(ae.InnerExceptions[0]);
+        else OnExceptionOccurred(ae);
+      } catch (Exception e) {
+        OnExceptionOccurred(e);
       }
+
+      cancellationTokenSource.Dispose();
+      cancellationTokenSource = null;
+      if (stopPending) executionStack.Clear();
+      if (executionStack.Count == 0) OnStopped();
+      else OnPaused();
     }
     protected override void OnStarted() {
@@ -154,6 +147,5 @@
       try {
         Run(cancellationToken);
-      }
-      finally {
+      } finally {
         timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
         timer.Stop();
Index: branches/Async/HeuristicLab.Core/3.3/Executable.cs
===================================================================
--- branches/Async/HeuristicLab.Core/3.3/Executable.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Core/3.3/Executable.cs	(revision 15065)
@@ -84,13 +84,14 @@
       ExecutionTime = TimeSpan.Zero;
     }
-    public void Start() {
-      StartAsync().Wait();
+    public virtual void Start() {
+      Start(CancellationToken.None);
     }
-    public async Task StartAsync() {
-      await StartAsync(CancellationToken.None);
-    }
-    public virtual async Task StartAsync(CancellationToken cancellationToken) {
+    public virtual void Start(CancellationToken cancellationToken) {
       if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused))
         throw new InvalidOperationException(string.Format("Start not allowed in execution state \"{0}\".", ExecutionState));
+    }
+    public virtual async Task StartAsync() { await StartAsync(CancellationToken.None); }
+    public virtual async Task StartAsync(CancellationToken cancellationToken) {
+      await Task.Factory.StartNew((ct) => Start((CancellationToken)ct), cancellationToken, cancellationToken);
     }
     public virtual void Pause() {
Index: branches/Async/HeuristicLab.Core/3.3/Interfaces/IExecutable.cs
===================================================================
--- branches/Async/HeuristicLab.Core/3.3/Interfaces/IExecutable.cs	(revision 13401)
+++ branches/Async/HeuristicLab.Core/3.3/Interfaces/IExecutable.cs	(revision 15065)
@@ -32,4 +32,5 @@
     void Prepare();
     void Start();
+    void Start(CancellationToken cancellationToken);
     Task StartAsync();
     Task StartAsync(CancellationToken cancellationToken);
