Index: trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- trunk/sources/HeuristicLab 3.3.sln	(revision 5192)
+++ trunk/sources/HeuristicLab 3.3.sln	(revision 5193)
@@ -90,4 +90,5 @@
 		{A51DA44F-CB35-4F6F-99F5-2A2E904AB93B} = {A51DA44F-CB35-4F6F-99F5-2A2E904AB93B}
 		{2C36CD4F-E5F5-43A4-801A-201EA895FE17} = {2C36CD4F-E5F5-43A4-801A-201EA895FE17}
+		{00814351-4AB8-4088-9B99-F62787B89E93} = {00814351-4AB8-4088-9B99-F62787B89E93}
 		{3EAF1454-086D-44A2-8509-B1BA24DB1865} = {3EAF1454-086D-44A2-8509-B1BA24DB1865}
 		{3BD61258-31DA-4B09-89C0-4F71FEF5F05A} = {3BD61258-31DA-4B09-89C0-4F71FEF5F05A}
@@ -324,4 +325,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Algorithms.NSGA2-3.3", "HeuristicLab.Algorithms.NSGA2\3.3\HeuristicLab.Algorithms.NSGA2-3.3.csproj", "{15452B9F-A436-4139-8EE7-DA72FB8D3664}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.ParallelEngine-3.3", "HeuristicLab.ParallelEngine\3.3\HeuristicLab.ParallelEngine-3.3.csproj", "{00814351-4AB8-4088-9B99-F62787B89E93}"
 EndProject
 Global
@@ -1466,4 +1469,16 @@
 		{15452B9F-A436-4139-8EE7-DA72FB8D3664}.Release|x86.ActiveCfg = Release|x86
 		{15452B9F-A436-4139-8EE7-DA72FB8D3664}.Release|x86.Build.0 = Release|x86
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|x64.ActiveCfg = Debug|x64
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|x64.Build.0 = Debug|x64
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|x86.ActiveCfg = Debug|x86
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Debug|x86.Build.0 = Debug|x86
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|Any CPU.Build.0 = Release|Any CPU
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|x64.ActiveCfg = Release|x64
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|x64.Build.0 = Release|x64
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|x86.ActiveCfg = Release|x86
+		{00814351-4AB8-4088-9B99-F62787B89E93}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 5192)
+++ trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 5193)
@@ -12,5 +12,6 @@
     <AssemblyName>HeuristicLab.Common-3.3</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile></TargetFrameworkProfile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
     <SignAssembly>true</SignAssembly>
Index: trunk/sources/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 5193)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Threading;
+using System.Threading.Tasks;
 using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -42,16 +43,12 @@
     }
 
-    private bool pausePending, stopPending;
+    #region Variables for communication between threads
+    private CancellationTokenSource cancellationTokenSource;
+    private bool stopPending;
     private DateTime lastUpdateTime;
-    private System.Timers.Timer timer;
+    #endregion
 
     [StorableConstructor]
-    protected Engine(bool deserializing)
-      : base(deserializing) {
-      pausePending = stopPending = false;
-      timer = new System.Timers.Timer(100);
-      timer.AutoReset = true;
-      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
-    }
+    protected Engine(bool deserializing) : base(deserializing) { }
     protected Engine(Engine original, Cloner cloner)
       : base(original, cloner) {
@@ -62,9 +59,4 @@
       for (int i = contexts.Length - 1; i >= 0; i--)
         executionStack.Push(cloner.Clone(contexts[i]));
-      pausePending = original.pausePending;
-      stopPending = original.stopPending;
-      timer = new System.Timers.Timer(100);
-      timer.AutoReset = true;
-      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
     }
     protected Engine()
@@ -72,8 +64,4 @@
       log = new Log();
       executionStack = new Stack<IOperation>();
-      pausePending = stopPending = false;
-      timer = new System.Timers.Timer(100);
-      timer.AutoReset = true;
-      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
     }
 
@@ -97,5 +85,26 @@
     public override void Start() {
       base.Start();
-      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
+      cancellationTokenSource = new CancellationTokenSource();
+      stopPending = false;
+      Task task = Task.Factory.StartNew(Run, cancellationTokenSource.Token, cancellationTokenSource.Token);
+      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();
+      });
     }
     protected override void OnStarted() {
@@ -106,5 +115,5 @@
     public override void Pause() {
       base.Pause();
-      pausePending = true;
+      cancellationTokenSource.Cancel();
     }
     protected override void OnPaused() {
@@ -115,6 +124,11 @@
     public override void Stop() {
       base.Stop();
-      stopPending = true;
-      if (ExecutionState == ExecutionState.Paused) OnStopped();
+      if (ExecutionState == ExecutionState.Paused) {
+        executionStack.Clear();
+        OnStopped();
+      } else {
+        stopPending = true;
+        cancellationTokenSource.Cancel();
+      }
     }
     protected override void OnStopped() {
@@ -129,20 +143,24 @@
 
     private void Run(object state) {
+      CancellationToken cancellationToken = (CancellationToken)state;
+
       OnStarted();
-      pausePending = stopPending = false;
+      lastUpdateTime = DateTime.Now;
+      System.Timers.Timer timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+      timer.Start();
+      try {
+        Run(cancellationToken);
+      }
+      finally {
+        timer.Stop();
+        timer.Dispose();
+        ExecutionTime += DateTime.Now - lastUpdateTime;
+      }
 
-      lastUpdateTime = DateTime.Now;
-      timer.Start();
-      while (!pausePending && !stopPending && (executionStack.Count > 0)) {
-        ProcessNextOperation();
-      }
-      timer.Stop();
-      ExecutionTime += DateTime.Now - lastUpdateTime;
-
-      if (pausePending) OnPaused();
-      else OnStopped();
+      cancellationToken.ThrowIfCancellationRequested();
     }
-
-    protected abstract void ProcessNextOperation();
+    protected abstract void Run(CancellationToken cancellationToken);
 
     private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs	(revision 5193)
@@ -21,34 +21,16 @@
 
 using System;
+using System.Threading;
 
 namespace HeuristicLab.Core {
   /// <summary>
-  /// Interface to represent an operator (e.g. GreaterThanComparator,...), 
-  /// a basic instruction of an algorithm.
+  /// Interface to represent an operator.
   /// </summary>
   public interface IOperator : IParameterizedNamedItem {
-    /// <summary>
-    /// Gets or sets a boolean value whether the engine should stop here during the run.
-    /// </summary>
     bool Breakpoint { get; set; }
 
-    /// <summary>
-    /// Executes the current instance on the specified <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The scope where to execute the current instance.</param>
-    /// <returns>The next operation.</returns>
-    IOperation Execute(IExecutionContext context);
-    /// <summary>
-    /// Aborts the current operator.
-    /// </summary>
-    void Abort();
+    IOperation Execute(IExecutionContext context, CancellationToken cancellationToken);
 
-    /// <summary>
-    /// Occurs when the breakpoint flag of the current instance was changed.
-    /// </summary>
-    event EventHandler BreakpointChanged; 
-    /// <summary>
-    /// Occurs when the current instance is executed.
-    /// </summary>
+    event EventHandler BreakpointChanged;
     event EventHandler Executed;
   }
Index: trunk/sources/HeuristicLab.DebugEngine/3.3/DebugEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.DebugEngine/3.3/DebugEngine.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.DebugEngine/3.3/DebugEngine.cs	(revision 5193)
@@ -23,4 +23,5 @@
 using System.Linq;
 using System.Threading;
+using System.Threading.Tasks;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -38,5 +39,4 @@
     protected DebugEngine(bool deserializing)
       : base(deserializing) {
-      pausePending = stopPending = false;
       InitializeTimer();
     }
@@ -48,9 +48,6 @@
       ExecutionStack = cloner.Clone(original.ExecutionStack);
       OperatorTrace = cloner.Clone(original.OperatorTrace);
-      pausePending = original.pausePending;
-      stopPending = original.stopPending;
       InitializeTimer();
       currentOperation = cloner.Clone(original.currentOperation);
-      currentOperator = cloner.Clone(original.currentOperator);
     }
     public DebugEngine()
@@ -59,5 +56,4 @@
       ExecutionStack = new ExecutionStack();
       OperatorTrace = new OperatorTrace();
-      pausePending = stopPending = false;
       InitializeTimer();
     }
@@ -86,10 +82,8 @@
     public OperatorTrace OperatorTrace { get; private set; }
 
-    private bool pausePending, stopPending;
+    private CancellationTokenSource cancellationTokenSource;
+    private bool stopPending;
     private DateTime lastUpdateTime;
     private System.Timers.Timer timer;
-
-    [Storable]
-    private IOperator currentOperator;
 
     [Storable]
@@ -159,17 +153,50 @@
     public virtual void Step(bool skipStackOperations) {
       OnStarted();
+      cancellationTokenSource = new CancellationTokenSource();
+      stopPending = false;
       lastUpdateTime = DateTime.Now;
       timer.Start();
-      ProcessNextOperation(true);
-      while (skipStackOperations && !(CurrentOperation is IAtomicOperation) && CanContinue)
-        ProcessNextOperation(true);
+      try {
+        ProcessNextOperation(true, cancellationTokenSource.Token);
+        while (skipStackOperations && !(CurrentOperation is IAtomicOperation) && CanContinue)
+          ProcessNextOperation(true, cancellationTokenSource.Token);
+      }
+      catch (Exception ex) {
+        OnExceptionOccurred(ex);
+      }
       timer.Stop();
       ExecutionTime += DateTime.Now - lastUpdateTime;
-      OnPaused();
+      cancellationTokenSource.Dispose();
+      cancellationTokenSource = null;
+      if (stopPending) ExecutionStack.Clear();
+      if (stopPending || !CanContinue) OnStopped();
+      else OnPaused();
     }
 
     public override void Start() {
       base.Start();
-      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
+      cancellationTokenSource = new CancellationTokenSource();
+      stopPending = false;
+      Task task = Task.Factory.StartNew(Run, cancellationTokenSource.Token, cancellationTokenSource.Token);
+      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 (stopPending || !CanContinue) OnStopped();
+        else OnPaused();
+      });
     }
 
@@ -181,6 +208,5 @@
     public override void Pause() {
       base.Pause();
-      pausePending = true;
-      if (currentOperator != null) currentOperator.Abort();
+      cancellationTokenSource.Cancel();
     }
 
@@ -193,7 +219,11 @@
       CurrentOperation = null;
       base.Stop();
-      stopPending = true;
-      if (currentOperator != null) currentOperator.Abort();
-      if (ExecutionState == ExecutionState.Paused) OnStopped();
+      if (ExecutionState == ExecutionState.Paused) {
+        ExecutionStack.Clear();
+        OnStopped();
+      } else {
+        stopPending = true;
+        cancellationTokenSource.Cancel();
+      }
     }
 
@@ -209,22 +239,23 @@
 
     private void Run(object state) {
+      CancellationToken cancellationToken = (CancellationToken)state;
+
       OnStarted();
-      pausePending = stopPending = false;
-
       lastUpdateTime = DateTime.Now;
       timer.Start();
-      if (!pausePending && !stopPending && CanContinue)
-        ProcessNextOperation(false);
-      while (!pausePending && !stopPending && CanContinue && !IsAtBreakpoint)
-        ProcessNextOperation(false);
-      timer.Stop();
-      ExecutionTime += DateTime.Now - lastUpdateTime;
-
-      if (IsAtBreakpoint)
-        Log.LogMessage(string.Format("Breaking before: {0}", CurrentAtomicOperation.Operator.Name));
-      if (pausePending || IsAtBreakpoint)
-        OnPaused();
-      else
-        OnStopped();
+      try {
+        if (!cancellationToken.IsCancellationRequested && CanContinue)
+          ProcessNextOperation(false, cancellationToken);
+        while (!cancellationToken.IsCancellationRequested && CanContinue && !IsAtBreakpoint)
+          ProcessNextOperation(false, cancellationToken);
+        cancellationToken.ThrowIfCancellationRequested();
+      }
+      finally {
+        timer.Stop();
+        ExecutionTime += DateTime.Now - lastUpdateTime;
+
+        if (IsAtBreakpoint)
+          Log.LogMessage(string.Format("Breaking before: {0}", CurrentAtomicOperation.Operator.Name));
+      }
     }
 
@@ -247,49 +278,44 @@
     /// is pushed on the stack again.<br/>
     /// If the execution was successful <see cref="EngineBase.OnOperationExecuted"/> is called.</remarks>
-    protected virtual void ProcessNextOperation(bool logOperations) {
-      try {
-        IAtomicOperation atomicOperation = CurrentOperation as IAtomicOperation;
-        OperationCollection operations = CurrentOperation as OperationCollection;
-        if (atomicOperation != null && operations != null)
-          throw new InvalidOperationException("Current operation is both atomic and an operation collection");
-
-        if (atomicOperation != null) {
-          if (logOperations)
-            Log.LogMessage(string.Format("Performing atomic operation {0}", Utils.Name(atomicOperation)));
-          PerformAtomicOperation(atomicOperation);
-        } else if (operations != null) {
-          if (logOperations)
-            Log.LogMessage("Expanding operation collection");
-          ExecutionStack.AddRange(operations.Reverse());
-          CurrentOperation = null;
-        } else if (ExecutionStack.Count > 0) {
-          if (logOperations)
-            Log.LogMessage("Popping execution stack");
-          CurrentOperation = ExecutionStack.Last();
-          ExecutionStack.RemoveAt(ExecutionStack.Count - 1);
-        } else {
-          if (logOperations)
-            Log.LogMessage("Nothing to do");
-        }
-        OperatorTrace.Regenerate(CurrentAtomicOperation);
-      } catch (Exception x) {
-        OnExceptionOccurred(x);
-      }
-    }
-
-    protected virtual void PerformAtomicOperation(IAtomicOperation operation) {
+    protected virtual void ProcessNextOperation(bool logOperations, CancellationToken cancellationToken) {
+      IAtomicOperation atomicOperation = CurrentOperation as IAtomicOperation;
+      OperationCollection operations = CurrentOperation as OperationCollection;
+      if (atomicOperation != null && operations != null)
+        throw new InvalidOperationException("Current operation is both atomic and an operation collection");
+
+      if (atomicOperation != null) {
+        if (logOperations)
+          Log.LogMessage(string.Format("Performing atomic operation {0}", Utils.Name(atomicOperation)));
+        PerformAtomicOperation(atomicOperation, cancellationToken);
+      } else if (operations != null) {
+        if (logOperations)
+          Log.LogMessage("Expanding operation collection");
+        ExecutionStack.AddRange(operations.Reverse());
+        CurrentOperation = null;
+      } else if (ExecutionStack.Count > 0) {
+        if (logOperations)
+          Log.LogMessage("Popping execution stack");
+        CurrentOperation = ExecutionStack.Last();
+        ExecutionStack.RemoveAt(ExecutionStack.Count - 1);
+      } else {
+        if (logOperations)
+          Log.LogMessage("Nothing to do");
+      }
+      OperatorTrace.Regenerate(CurrentAtomicOperation);
+    }
+
+    protected virtual void PerformAtomicOperation(IAtomicOperation operation, CancellationToken cancellationToken) {
       if (operation != null) {
         try {
-          currentOperator = operation.Operator;
-          IOperation successor = operation.Operator.Execute((IExecutionContext)operation);
+          IOperation successor = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
           if (successor != null) {
             OperatorTrace.RegisterParenthood(operation, successor);
             ExecutionStack.Add(successor);
           }
-          currentOperator = null;
           CurrentOperation = null;
-        } catch (Exception ex) {
-          OnExceptionOccurred(new OperatorExecutionException(operation.Operator, ex));
-          Pause();
+        }
+        catch (Exception ex) {
+          if (ex is OperationCanceledException) throw ex;
+          else throw new OperatorExecutionException(operation.Operator, ex);
         }
       }
Index: trunk/sources/HeuristicLab.Operators/3.3/Operator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 5193)
@@ -22,4 +22,5 @@
 using System;
 using System.Drawing;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,5 +29,5 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// The base class for all operators.
+  /// Base class for operators.
   /// </summary>
   [Item("Operator", "Base class for operators.")]
@@ -43,35 +44,20 @@
     }
 
-    [Storable]
-    private IExecutionContext executionContext;
+    private Lazy<ThreadLocal<IExecutionContext>> executionContexts;
     protected IExecutionContext ExecutionContext {
-      get { return executionContext; }
+      get { return executionContexts.Value.Value; }
       private set {
-        if (value != executionContext) {
-          executionContext = value;
-          OnExecutionContextChanged();
+        if (value != executionContexts.Value.Value) {
+          executionContexts.Value.Value = value;
         }
       }
     }
-
-    /// <summary>
-    /// Flag whether the current instance has been canceled.
-    /// </summary>
-    private bool canceled;
-    /// <inheritdoc/>
-    protected bool Canceled {
-      get { return canceled; }
-      private set {
-        if (value != canceled) {
-          canceled = value;
-          OnCanceledChanged();
-        }
-      }
+    private CancellationToken cancellationToken;
+    protected CancellationToken CancellationToken {
+      get { return cancellationToken; }
     }
 
     [Storable]
     private bool breakpoint;
-    /// <inheritdoc/>
-    /// <remarks>Calls <see cref="OnBreakpointChanged"/> in the setter.</remarks>
     public bool Breakpoint {
       get { return breakpoint; }
@@ -86,46 +72,43 @@
 
     [StorableConstructor]
-    protected Operator(bool deserializing) : base(deserializing) { }
+    protected Operator(bool deserializing)
+      : base(deserializing) {
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+    }
     protected Operator(Operator original, Cloner cloner)
       : base(original, cloner) {
-      this.canceled = original.canceled;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       this.breakpoint = original.breakpoint;
-      this.executionContext = cloner.Clone<IExecutionContext>(original.executionContext);
     }
-    /// <summary>
-    /// Initializes a new instance of <see cref="OperatorBase"/> setting the breakpoint flag and 
-    /// the canceled flag to <c>false</c> and the name of the operator to the type name. 
-    /// </summary>
     protected Operator()
       : base() {
-      canceled = false;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       breakpoint = false;
     }
     protected Operator(string name)
       : base(name) {
-      canceled = false;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       breakpoint = false;
     }
     protected Operator(string name, ParameterCollection parameters)
       : base(name, parameters) {
-      canceled = false;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       breakpoint = false;
     }
     protected Operator(string name, string description)
       : base(name, description) {
-      canceled = false;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       breakpoint = false;
     }
     protected Operator(string name, string description, ParameterCollection parameters)
       : base(name, description, parameters) {
-      canceled = false;
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
       breakpoint = false;
     }
 
-    /// <inheritdoc/>
-    public virtual IOperation Execute(IExecutionContext context) {
+    public virtual IOperation Execute(IExecutionContext context, CancellationToken cancellationToken) {
       try {
-        Canceled = false;
         ExecutionContext = context;
+        this.cancellationToken = cancellationToken;
         foreach (IParameter param in Parameters)
           param.ExecutionContext = context;
@@ -140,23 +123,7 @@
       }
     }
-    /// <inheritdoc/>
-    /// <remarks>Sets property <see cref="Canceled"/> to <c>true</c>.</remarks>
-    public void Abort() {
-      Canceled = true;
-    }
-    /// <summary>
-    /// Performs the current operator on the specified <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The scope where to execute the operator</param>
-    /// <returns><c>null</c>.</returns>
     public abstract IOperation Apply();
 
-    protected virtual void OnExecutionContextChanged() { }
-    protected virtual void OnCanceledChanged() { }
-    /// <inheritdoc/>
     public event EventHandler BreakpointChanged;
-    /// <summary>
-    /// Fires a new <c>BreakpointChanged</c> event.
-    /// </summary>
     protected virtual void OnBreakpointChanged() {
       if (BreakpointChanged != null) {
@@ -164,9 +131,5 @@
       }
     }
-    /// <inheritdoc/>
     public event EventHandler Executed;
-    /// <summary>
-    /// Fires a new <c>Executed</c> event.
-    /// </summary>
     protected virtual void OnExecuted() {
       if (Executed != null) {
Index: trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs	(revision 5193)
@@ -30,4 +30,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Threading;
 
 namespace HeuristicLab.Optimization {
@@ -248,9 +249,5 @@
       public bool Breakpoint { get; set; }
 
-      public IOperation Execute(IExecutionContext context) {
-        throw new InvalidOperationException("Please choose an appropriate evaluation operator.");
-      }
-
-      public void Abort() {
+      public IOperation Execute(IExecutionContext context, CancellationToken cancellationToken) {
         throw new InvalidOperationException("Please choose an appropriate evaluation operator.");
       }
Index: trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLab.ParallelEngine-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLab.ParallelEngine-3.3.csproj	(revision 5193)
+++ trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLab.ParallelEngine-3.3.csproj	(revision 5193)
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{00814351-4AB8-4088-9B99-F62787B89E93}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.ParallelEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.ParallelEngine-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.ParallelEngine-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.ParallelEngine-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.ParallelEngine-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.ParallelEngine-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="HeuristicLabParallelEnginePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ParallelEngine.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="HeuristicLabParallelEnginePlugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabParallelEnginePlugin.cs.frame" "%25ProjectDir%25\HeuristicLabParallelEnginePlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLabParallelEnginePlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLabParallelEnginePlugin.cs.frame	(revision 5193)
+++ trunk/sources/HeuristicLab.ParallelEngine/3.3/HeuristicLabParallelEnginePlugin.cs.frame	(revision 5193)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.ParallelEngine {
+  /// <summary>
+  /// Plugin class for HeuristicLab.ParallelEngine plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.ParallelEngine", "3.3.2.$WCREV$")]
+  [PluginFile("HeuristicLab.ParallelEngine-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabParallelEnginePlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.ParallelEngine/3.3/ParallelEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.ParallelEngine/3.3/ParallelEngine.cs	(revision 5193)
+++ trunk/sources/HeuristicLab.ParallelEngine/3.3/ParallelEngine.cs	(revision 5193)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.ParallelEngine {
+  /// <summary>
+  /// Represents an engine that executes its steps in parallel (if possible) using multiple threads.
+  /// This engine is suitable for parallel processing on shared memory systems which provide multiple cores.
+  /// </summary>
+  [StorableClass]
+  [Item("Parallel Engine", "Engine for parallel execution of algorithms using multiple threads (suitable for shared memory systems with multiple cores).")]
+  public class ParallelEngine : Engine {
+    private CancellationToken cancellationToken;
+
+    [StorableConstructor]
+    protected ParallelEngine(bool deserializing) : base(deserializing) { }
+    protected ParallelEngine(ParallelEngine original, Cloner cloner) : base(original, cloner) { }
+    public ParallelEngine() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParallelEngine(this, cloner);
+    }
+
+    protected override void Run(CancellationToken cancellationToken) {
+      this.cancellationToken = cancellationToken;
+      Run(ExecutionStack);
+    }
+
+    private void Run(object state) {
+      Stack<IOperation> executionStack = (Stack<IOperation>)state;
+      IOperation next;
+      OperationCollection coll;
+      IAtomicOperation operation;
+
+      while (executionStack.Count > 0) {
+        cancellationToken.ThrowIfCancellationRequested();
+
+        next = executionStack.Pop();
+        if (next is OperationCollection) {
+          coll = (OperationCollection)next;
+          if (coll.Parallel) {
+            Task[] tasks = new Task[coll.Count];
+            Stack<IOperation>[] stacks = new Stack<IOperation>[coll.Count];
+            for (int i = 0; i < coll.Count; i++) {
+              stacks[i] = new Stack<IOperation>();
+              stacks[i].Push(coll[i]);
+              tasks[i] = Task.Factory.StartNew(Run, stacks[i], cancellationToken);
+            }
+            try {
+              Task.WaitAll(tasks);
+            }
+            catch (AggregateException ex) {
+              OperationCollection remaining = new OperationCollection() { Parallel = true };
+              for (int i = 0; i < stacks.Length; i++) {
+                if (stacks[i].Count == 1)
+                  remaining.Add(stacks[i].Pop());
+                if (stacks[i].Count > 1) {
+                  OperationCollection ops = new OperationCollection();
+                  while (stacks[i].Count > 0)
+                    ops.Add(stacks[i].Pop());
+                  remaining.Add(ops);
+                }
+              }
+              if (remaining.Count > 0) executionStack.Push(remaining);
+              throw ex;
+            }
+          } else {
+            for (int i = coll.Count - 1; i >= 0; i--)
+              if (coll[i] != null) executionStack.Push(coll[i]);
+          }
+        } else if (next is IAtomicOperation) {
+          operation = (IAtomicOperation)next;
+          try {
+            next = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
+          }
+          catch (Exception ex) {
+            executionStack.Push(operation);
+            if (ex is OperationCanceledException) throw ex;
+            else throw new OperatorExecutionException(operation.Operator, ex);
+          }
+          if (next != null) executionStack.Push(next);
+
+          if (operation.Operator.Breakpoint) {
+            string message = string.Format("Breakpoint: {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName);
+            Log.LogMessage(message);
+            throw new OperationCanceledException(message);
+          }
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.ParallelEngine/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.ParallelEngine/3.3/Properties/AssemblyInfo.frame	(revision 5193)
+++ trunk/sources/HeuristicLab.ParallelEngine/3.3/Properties/AssemblyInfo.frame	(revision 5193)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.ParallelEngine")]
+[assembly: AssemblyDescription("HeuristicLab engine for parallel processing using multiple cores on a shared memory system")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("6d0f12ff-4fa9-4af8-aaf5-8261c7e9b2d5")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.2.$WCREV$")]
Index: trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 5193)
@@ -52,12 +52,6 @@
     }
     public new T ActualValue {
-      get {
-        if (cachedActualValue == null) cachedActualValue = GetActualValue();
-        return (T)cachedActualValue;
-      }
-      set {
-        cachedActualValue = value;
-        SetActualValue(value);
-      }
+      get { return (T)base.ActualValue; }
+      set { base.ActualValue = value; }
     }
 
Index: trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 5193)
@@ -22,4 +22,5 @@
 using System;
 using System.Drawing;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -53,24 +54,23 @@
       get { return dataType; }
     }
-    protected IItem cachedActualValue;
+
+    private Lazy<ThreadLocal<IItem>> cachedActualValues;
     public IItem ActualValue {
       get {
-        if (cachedActualValue == null) cachedActualValue = GetActualValue();
-        return cachedActualValue;
+        if (cachedActualValues.Value.Value == null) cachedActualValues.Value.Value = GetActualValue();
+        return cachedActualValues.Value.Value;
       }
       set {
-        cachedActualValue = value;
+        cachedActualValues.Value.Value = value;
         SetActualValue(value);
       }
     }
-    [Storable]
-    private IExecutionContext executionContext;
+    private Lazy<ThreadLocal<IExecutionContext>> executionContexts;
     public IExecutionContext ExecutionContext {
-      get { return executionContext; }
+      get { return executionContexts.Value.Value; }
       set {
-        if (value != executionContext) {
-          executionContext = value;
-          cachedActualValue = null;
-          OnExecutionContextChanged();
+        if (value != executionContexts.Value.Value) {
+          executionContexts.Value.Value = value;
+          cachedActualValues.Value.Value = null;
         }
       }
@@ -78,13 +78,20 @@
 
     [StorableConstructor]
-    protected Parameter(bool deserializing) : base(deserializing) { }
+    protected Parameter(bool deserializing)
+      : base(deserializing) {
+      cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+    }
     protected Parameter(Parameter original, Cloner cloner)
       : base(original, cloner) {
       dataType = original.dataType;
-      executionContext = cloner.Clone(original.executionContext);
+      cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
     }
     protected Parameter()
       : base("Anonymous") {
       dataType = typeof(IItem);
+      cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
     }
     protected Parameter(string name, Type dataType)
@@ -92,4 +99,6 @@
       if (dataType == null) throw new ArgumentNullException();
       this.dataType = dataType;
+      cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
     }
     protected Parameter(string name, string description, Type dataType)
@@ -97,4 +106,6 @@
       if (dataType == null) throw new ArgumentNullException();
       this.dataType = dataType;
+      cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
+      executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
     }
 
@@ -105,6 +116,4 @@
     protected abstract IItem GetActualValue();
     protected abstract void SetActualValue(IItem value);
-
-    protected virtual void OnExecutionContextChanged() { }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 5193)
@@ -54,5 +54,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
 
       string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 5193)
@@ -51,5 +51,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
     }
   }
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 5193)
@@ -46,5 +46,5 @@
       PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
       IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
 
       return next;
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 5193)
@@ -68,5 +68,5 @@
       moveMaker.PermutationParameter.ActualName = VRPToursParameter.ActualName;
       IAtomicOperation op = this.ExecutionContext.CreateChildOperation(moveMaker);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
 
       return next;
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 5193)
@@ -29,5 +29,5 @@
   [Item("PrinsPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
   [StorableClass]
-  public sealed class PrinsPermutationCrossover : PrinsCrossover, IPrinsOperator {    
+  public sealed class PrinsPermutationCrossover : PrinsCrossover, IPrinsOperator {
     public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
       get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
@@ -52,5 +52,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
 
       string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 5193)
@@ -42,5 +42,5 @@
     public PrinsPermutationManipulator()
       : base() {
-        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+      Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
     }
 
@@ -50,5 +50,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
     }
   }
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 5193)
@@ -54,5 +54,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
 
       string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 5193)
@@ -52,5 +52,5 @@
       IAtomicOperation op = this.ExecutionContext.CreateOperation(
         InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
-      op.Operator.Execute((IExecutionContext)op);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
     }
   }
Index: trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 5192)
+++ trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 5193)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -27,12 +28,9 @@
 namespace HeuristicLab.SequentialEngine {
   /// <summary>
-  /// Represents an engine that executes its steps sequentially, also if they could be executed 
-  /// in parallel.
+  /// Engine for sequential execution of algorithms.
   /// </summary>
   [StorableClass]
   [Item("Sequential Engine", "Engine for sequential execution of algorithms.")]
   public class SequentialEngine : Engine {
-    private IOperator currentOperator;
-
     [StorableConstructor]
     protected SequentialEngine(bool deserializing) : base(deserializing) { }
@@ -44,47 +42,36 @@
     }
 
-    /// <summary>
-    /// Deals with the next operation, if it is an <see cref="AtomicOperation"/> it is executed,
-    /// if it is a <see cref="CompositeOperation"/> its single operations are pushed on the execution stack.
-    /// </summary>
-    /// <remarks>If an error occurs during the execution the operation is aborted and the operation
-    /// is pushed on the stack again.<br/>
-    /// If the execution was successful <see cref="EngineBase.OnOperationExecuted"/> is called.</remarks>
-    protected override void ProcessNextOperation() {
-      currentOperator = null;
-      IOperation next = ExecutionStack.Pop();
-      OperationCollection coll = next as OperationCollection;
-      while (coll != null) {
-        for (int i = coll.Count - 1; i >= 0; i--)
-          ExecutionStack.Push(coll[i]);
-        next = ExecutionStack.Count > 0 ? ExecutionStack.Pop() : null;
-        coll = next as OperationCollection;
-      }
-      IAtomicOperation operation = next as IAtomicOperation;
-      if (operation != null) {
-        try {
-          currentOperator = operation.Operator;
-          ExecutionStack.Push(operation.Operator.Execute((IExecutionContext)operation));
-        }
-        catch (Exception ex) {
-          ExecutionStack.Push(operation);
-          OnExceptionOccurred(new OperatorExecutionException(operation.Operator, ex));
-          Pause();
-        }
-        if (operation.Operator.Breakpoint) {
-          Log.LogMessage(string.Format("Breakpoint: {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName));
-          Pause();
+    protected override void Run(CancellationToken cancellationToken) {
+      IOperation next;
+      OperationCollection coll;
+      IAtomicOperation operation;
+
+      while (ExecutionStack.Count > 0) {
+        cancellationToken.ThrowIfCancellationRequested();
+
+        next = ExecutionStack.Pop();
+        if (next is OperationCollection) {
+          coll = (OperationCollection)next;
+          for (int i = coll.Count - 1; i >= 0; i--)
+            if (coll[i] != null) ExecutionStack.Push(coll[i]);
+        } else if (next is IAtomicOperation) {
+          operation = (IAtomicOperation)next;
+          try {
+            next = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
+          }
+          catch (Exception ex) {
+            ExecutionStack.Push(operation);
+            if (ex is OperationCanceledException) throw ex;
+            else throw new OperatorExecutionException(operation.Operator, ex);
+          }
+          if (next != null) ExecutionStack.Push(next);
+
+          if (operation.Operator.Breakpoint) {
+            Log.LogMessage(string.Format("Breakpoint: {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName));
+            Pause();
+          }
         }
       }
     }
-
-    public override void Pause() {
-      base.Pause();
-      if (currentOperator != null) currentOperator.Abort();
-    }
-    public override void Stop() {
-      base.Stop();
-      if (currentOperator != null) currentOperator.Abort();
-    }
   }
 }
Index: trunk/sources/HeuristicLab/3.3/Files.txt
===================================================================
--- trunk/sources/HeuristicLab/3.3/Files.txt	(revision 5192)
+++ trunk/sources/HeuristicLab/3.3/Files.txt	(revision 5193)
@@ -42,4 +42,5 @@
 HeuristicLab.Optimization.Views\3.3:HeuristicLab.Optimization.Views-3.3.dll
 HeuristicLab.Optimizer\3.3:HeuristicLab.Optimizer-3.3.dll
+HeuristicLab.ParallelEngine\3.3:HeuristicLab.ParallelEngine-3.3.dll
 HeuristicLab.Parameters\3.3:HeuristicLab.Parameters-3.3.dll
 HeuristicLab.Parameters.Views\3.3:HeuristicLab.Parameters.Views-3.3.dll
Index: trunk/sources/HeuristicLab/3.3/Tests/Builder.testsettings
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/Builder.testsettings	(revision 5192)
+++ trunk/sources/HeuristicLab/3.3/Tests/Builder.testsettings	(revision 5193)
@@ -14,10 +14,11 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.VehicleRouting.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Persistence-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.SequentialEngine-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation.GP-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.DataAnalysis.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.DataAnalysis.Classification.Views-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.Knapsack-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\LibSVM-1.6.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Operators.Views.GraphVisualization-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.PluginInfrastructure-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.MainForm-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Core.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Optimizer-3.3.dll" />
@@ -27,9 +28,9 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Tracing-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\Google.ProtocolBuffers-0.9.1.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.ALGLIB-2.5.0.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\ICSharpCode.SharpDevelop.Dom.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Data.Views-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.TabuSearch-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\Netron.Diagramming.Core-3.0.2672.12446.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Operators.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.PermutationEncoding-3.3.dll" />
@@ -39,18 +40,19 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.ProtobufCS-0.9.1.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ArtificialAnt.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.MainForm.WindowsForms-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Data.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Persistence.GUI-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.VehicleRouting-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Operators.Programmable-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.PermutationEncoding.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.TabuSearch-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.ParallelEngine-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.TestFunctions.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Common-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Netron-3.0.2672.12446.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.SequentialEngine-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\ICSharpCode.SharpZipLib.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ArtificialAnt-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Operators-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\Mono.Cecil.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.NSGA2-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.SimulatedAnnealing-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.DataAnalysis-3.3.dll" />
@@ -58,5 +60,5 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.OneMax-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Core-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Operators.Views-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.TravelingSalesman-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll" />
@@ -64,5 +66,5 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.TestFunctions-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.MainForm-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Parameters.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Collections-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\ALGLIB-2.5.0.dll" />
@@ -71,25 +73,25 @@
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.TravelingSalesman.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.MainForm.WindowsForms-3.3_Accessor.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Parameters.Views-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.LibSVM-1.6.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\ICSharpCode.TextEditor.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.LibSVM-1.6.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab-3.3.Tests.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Analysis.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.MainForm.WindowsForms-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation.GP-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.DataAnalysis.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.log4net-1.2.10.0.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.DataAnalysis-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.DataAnalysis.Regression-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.Knapsack-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Data-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\Mono.Cecil.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Optimization-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Random-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Clients.Common-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Data-3.3.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\Google.ProtocolBuffers-0.9.1.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.ExternalEvaluation.GP.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\ALGLIB-3.1.0.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.OneMax.Views-3.3.dll" />
-    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab-3.3.Tests.dll" />
+    <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Problems.DataAnalysis.Classification.Views-3.3.dll" />
     <DeploymentItem filename="HeuristicLab\3.3\Tests\bin\Release\HeuristicLab.Optimization.Operators-3.3.dll" />
   </Deployment>
Index: trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj	(revision 5192)
+++ trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj	(revision 5193)
@@ -151,4 +151,8 @@
       <Name>HeuristicLab.Algorithms.LocalSearch-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Algorithms.NSGA2\3.3\HeuristicLab.Algorithms.NSGA2-3.3.csproj">
+      <Project>{15452B9F-A436-4139-8EE7-DA72FB8D3664}</Project>
+      <Name>HeuristicLab.Algorithms.NSGA2-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm\3.3\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.csproj">
       <Project>{F409DD9E-1E9C-4EB1-AA3A-9F6E987C6E58}</Project>
@@ -331,4 +335,8 @@
       <Name>HeuristicLab.Optimizer-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.ParallelEngine\3.3\HeuristicLab.ParallelEngine-3.3.csproj">
+      <Project>{00814351-4AB8-4088-9B99-F62787B89E93}</Project>
+      <Name>HeuristicLab.ParallelEngine-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\HeuristicLab.Parameters.Views\3.3\HeuristicLab.Parameters.Views-3.3.csproj">
       <Project>{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}</Project>
@@ -460,5 +468,7 @@
   </ItemGroup>
   <ItemGroup>
-    <None Include="Builder.testsettings" />
+    <None Include="Builder.testsettings">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="GA_TSP.hl">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
