Index: branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessCovarianceOptimizationProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessCovarianceOptimizationProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessCovarianceOptimizationProblem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -197,5 +198,5 @@
     private readonly object syncRoot = new object();
     // Does not produce the same result for the same seed when using parallel engine (see below)!
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       var meanFunction = new MeanConst();
       var problemData = ProblemData;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 17320)
@@ -23,9 +23,10 @@
 using System;
 using System.Collections.Generic;
+using System.Threading;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
 using HeuristicLab.Optimization;
-using HEAL.Attic;
 
 namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
@@ -93,7 +94,9 @@
     }
 
+    public double Evaluate(BinaryVector vector, IRandom random) {
+      return Evaluate(vector, random, CancellationToken.None);
+    }
 
-
-    public double Evaluate(BinaryVector vector, IRandom random) {
+    public double Evaluate(BinaryVector vector, IRandom random, CancellationToken cancellationToken) {
       if (Evaluations >= maxEvaluations) throw new OperationCanceledException("Maximum Evaluation Limit Reached");
       Evaluations++;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs	(revision 17320)
@@ -33,3 +33,5 @@
     where TEncoding : class, IEncoding<TEncodedSolution>
     where TEncodedSolution : class, IEncodedSolution { }
+
+  //TODO derive IMutliObjectiveProblem from IMultiObjectiveProblemDefinition?
 }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs	(revision 17320)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Core;
@@ -38,4 +39,5 @@
     where TEncodedSolution : class, IEncodedSolution {
     double[] Evaluate(TEncodedSolution solution, IRandom random);
+    double[] Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
     void Analyze(TEncodedSolution[] solutions, double[][] qualities, ResultCollection results, IRandom random);
   }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs	(revision 17320)
@@ -33,3 +33,4 @@
     where TEncoding : class, IEncoding<TEncodedSolution>
     where TEncodedSolution : class, IEncodedSolution { }
+  //TODO derive ISingleObjectiveProblem from ISingleObjectiveProblemDefinition?
 }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs	(revision 17320)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Core;
@@ -35,5 +36,8 @@
     where TEncoding : class, IEncoding<TEncodedSolution>
     where TEncodedSolution : class, IEncodedSolution {
+
     double Evaluate(TEncodedSolution solution, IRandom random);
+    double Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
+
     void Analyze(TEncodedSolution[] solutions, double[] qualities, ResultCollection results, IRandom random);
     IEnumerable<TEncodedSolution> GetNeighbors(TEncodedSolution solution, IRandom random);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -133,5 +134,9 @@
     }
 
-    public abstract double[] Evaluate(TEncodedSolution solution, IRandom random);
+    public virtual double[] Evaluate(TEncodedSolution solution, IRandom random) {
+      return Evaluate(solution, random, CancellationToken.None);
+    }
+
+    public abstract double[] Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
     public virtual void Analyze(TEncodedSolution[] solutions, double[][] qualities, ResultCollection results, IRandom random) { }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -112,5 +113,8 @@
     }
 
-    public abstract double Evaluate(TEncodedSolution solution, IRandom random);
+    public virtual double Evaluate(TEncodedSolution solution, IRandom random) {
+      return Evaluate(solution, random, CancellationToken.None);
+    }
+    public abstract double Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
     public virtual void Analyze(TEncodedSolution[] solutions, double[] qualities, ResultCollection results, IRandom random) { }
     public virtual IEnumerable<TEncodedSolution> GetNeighbors(TEncodedSolution solution, IRandom random) {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 
 using System;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -80,5 +81,5 @@
     }
 
-    public override double Evaluate(BinaryVector individual, IRandom random) {
+    public override double Evaluate(BinaryVector individual, IRandom random, CancellationToken cancellationToken) {
       if (individual.Length != Length) throw new ArgumentException("The individual has not the correct length.");
       int total = 0;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 
 using System;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -47,5 +48,5 @@
     }
     // In the GECCO paper, Section 4.1
-    public override double Evaluate(BinaryVector individual, IRandom random) {
+    public override double Evaluate(BinaryVector individual, IRandom random, CancellationToken cancellationToken) {
       int[] level = new int[individual.Length];
       int levelLength = individual.Length;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -47,5 +48,5 @@
     }
 
-    public override double Evaluate(BinaryVector vector, IRandom random) {
+    public override double Evaluate(BinaryVector vector, IRandom random, CancellationToken cancellationToken) {
       return vector.Count(b => b);
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 17320)
@@ -31,4 +31,5 @@
 using System.Threading;
 using Google.ProtocolBuffers;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Common.Resources;
@@ -36,5 +37,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.ExternalEvaluation {
@@ -50,5 +50,5 @@
       private byte[] rawMessage;
 
-      private object lockObject = new object();
+      private readonly object lockObject = new object();
 
       public byte[] RawMessage {
@@ -116,5 +116,5 @@
     }
 
-    public delegate QualityMessage Evaluator(SolutionMessage message);
+    public delegate QualityMessage Evaluator(SolutionMessage message, CancellationToken cancellationToken);
     #endregion
 
@@ -124,5 +124,5 @@
 
     private HashSet<string> activeEvaluations = new HashSet<string>();
-    private object cacheLock = new object();
+    private readonly object cacheLock = new object();
     #endregion
 
@@ -221,5 +221,5 @@
     }
 
-    void CapacityChanged(object sender, EventArgs e) {
+    private void CapacityChanged(object sender, EventArgs e) {
       if (Capacity < 0)
         throw new ArgumentOutOfRangeException("Cache capacity cannot be less than zero");
@@ -240,5 +240,5 @@
     }
 
-    public QualityMessage GetValue(SolutionMessage message, Evaluator evaluate, ExtensionRegistry extensions) {
+    public QualityMessage GetValue(SolutionMessage message, Evaluator evaluate, ExtensionRegistry extensions, CancellationToken cancellationToken) {
       var entry = new CacheEntry(message.ToString());
       bool lockTaken = false;
@@ -267,5 +267,5 @@
               OnChanged();
               try {
-                entry.SetMessage(evaluate(message));
+                entry.SetMessage(evaluate(message, cancellationToken));
                 Monitor.Enter(cacheLock, ref lockTaken);
                 index[entry] = list.AddLast(entry);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IExternalEvaluationProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IExternalEvaluationProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IExternalEvaluationProblem.cs	(revision 17320)
@@ -20,8 +20,9 @@
 #endregion
 
+using System.Threading;
 using Google.ProtocolBuffers;
+using HEAL.Attic;
 using HeuristicLab.Core;
 using HeuristicLab.Optimization;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.ExternalEvaluation {
@@ -32,5 +33,5 @@
     CheckedItemCollection<IEvaluationServiceClient> Clients { get; }
 
-    QualityMessage Evaluate(SolutionMessage solutionMessage);
+    QualityMessage Evaluate(SolutionMessage solutionMessage, CancellationToken cancellationToken);
     ExtensionRegistry GetQualityMessageExtensions();
   }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs	(revision 17320)
@@ -106,14 +106,14 @@
     }
 
-    public override double[] Evaluate(TEncodedSolution individual, IRandom random) {
-      var qualityMessage = Evaluate(BuildSolutionMessage(individual));
+    public override double[] Evaluate(TEncodedSolution individual, IRandom random, CancellationToken cancellationToken) {
+      var qualityMessage = Evaluate(BuildSolutionMessage(individual), cancellationToken);
       if (!qualityMessage.HasExtension(MultiObjectiveQualityMessage.QualityMessage_))
         throw new InvalidOperationException("The received message is not a MultiObjectiveQualityMessage.");
       return qualityMessage.GetExtension(MultiObjectiveQualityMessage.QualityMessage_).QualitiesList.ToArray();
     }
-    public virtual QualityMessage Evaluate(SolutionMessage solutionMessage) {
+    public virtual QualityMessage Evaluate(SolutionMessage solutionMessage, CancellationToken cancellationToken) {
       return Cache == null
-        ? EvaluateOnNextAvailableClient(solutionMessage)
-        : Cache.GetValue(solutionMessage, EvaluateOnNextAvailableClient, GetQualityMessageExtensions());
+        ? EvaluateOnNextAvailableClient(solutionMessage, cancellationToken)
+        : Cache.GetValue(solutionMessage, EvaluateOnNextAvailableClient, GetQualityMessageExtensions(), cancellationToken);
     }
 
@@ -132,7 +132,7 @@
     #region Evaluation
     private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
-    private object clientLock = new object();
+    private readonly object clientLock = new object();
 
-    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
+    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message, CancellationToken cancellationToken) {
       IEvaluationServiceClient client = null;
       lock (clientLock) {
@@ -147,6 +147,5 @@
       try {
         return client.Evaluate(message, GetQualityMessageExtensions());
-      }
-      finally {
+      } finally {
         lock (clientLock) {
           activeClients.Remove(client);
@@ -165,6 +164,5 @@
           try {
             MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
-          }
-          catch (ArgumentException ex) {
+          } catch (ArgumentException ex) {
             throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", Name), ex);
           }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/SingleObjectiveExternalEvaluationProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/SingleObjectiveExternalEvaluationProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/SingleObjectiveExternalEvaluationProblem.cs	(revision 17320)
@@ -103,14 +103,14 @@
 
     #region Single Objective Problem Overrides
-    public override double Evaluate(TEncodedSolution solution, IRandom random) {
-      var qualityMessage = Evaluate(BuildSolutionMessage(solution));
+    public override double Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken) {
+      var qualityMessage = Evaluate(BuildSolutionMessage(solution), cancellationToken);
       if (!qualityMessage.HasExtension(SingleObjectiveQualityMessage.QualityMessage_))
         throw new InvalidOperationException("The received message is not a SingleObjectiveQualityMessage.");
       return qualityMessage.GetExtension(SingleObjectiveQualityMessage.QualityMessage_).Quality;
     }
-    public virtual QualityMessage Evaluate(SolutionMessage solutionMessage) {
+    public virtual QualityMessage Evaluate(SolutionMessage solutionMessage, CancellationToken cancellationToken) {
       return Cache == null
-        ? EvaluateOnNextAvailableClient(solutionMessage)
-        : Cache.GetValue(solutionMessage, EvaluateOnNextAvailableClient, GetQualityMessageExtensions());
+        ? EvaluateOnNextAvailableClient(solutionMessage,cancellationToken)
+        : Cache.GetValue(solutionMessage, EvaluateOnNextAvailableClient, GetQualityMessageExtensions(), cancellationToken);
     }
 
@@ -132,7 +132,7 @@
     #region Evaluation
     private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
-    private object clientLock = new object();
+    private readonly object clientLock = new object();
 
-    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
+    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message, CancellationToken cancellationToken) {
       IEvaluationServiceClient client = null;
       lock (clientLock) {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Diagnostics.Contracts;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -134,5 +135,5 @@
 
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       var interpreter = new Interpreter(tree, World, MaxTimeSteps);
       interpreter.Run();
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -89,5 +90,5 @@
 
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       // Doesn't use classes from HeuristicLab.Problems.DataAnalysis.Symbolic to make sure that the implementation can be fully understood easily.
       // HeuristicLab.Problems.DataAnalysis.Symbolic would already provide all the necessary functionality (esp. interpreter) but at a much higher complexity.
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -103,5 +104,5 @@
 
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       if (NumberOfBits <= 0) throw new NotSupportedException("Number of bits must be larger than zero.");
       if (NumberOfBits > 10) throw new NotSupportedException("Even parity does not support problems with number of bits > 10.");
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs	(revision 17320)
@@ -24,4 +24,5 @@
 using System.Diagnostics.Contracts;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -117,5 +118,5 @@
 
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       if (NumberOfBits <= 0) throw new NotSupportedException("Number of bits must be larger than zero.");
       if (NumberOfBits > 37) throw new NotSupportedException("Multiplexer does not support problems with number of bits > 37.");
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -92,5 +93,5 @@
     }
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       var length = LawnLengthParameter.Value.Value;
       var width = LawnWidthParameter.Value.Value;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs	(revision 17320)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -98,5 +99,5 @@
     private void AfterDeserialization() { RegisterEventHandlers(); }
 
-    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random, CancellationToken cancellationToken) {
       return Interpreter.EvaluateTankProgram(tree, RobocodePath, Enemies, null, false, NrOfRounds);
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -95,5 +96,5 @@
 
     private readonly object syncRoot = new object();
-    public override double Evaluate(IntegerVector solution, IRandom random) {
+    public override double Evaluate(IntegerVector solution, IRandom random, CancellationToken cancellationToken) {
       var bounds = Encoding.Bounds;
       var len = Encoding.Length;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Analysis;
@@ -128,5 +129,5 @@
     }
 
-    public override double Evaluate(LinearLinkage lle, IRandom random) {
+    public override double Evaluate(LinearLinkage lle, IRandom random, CancellationToken cancellationToken) {
       var adjList = adjacencyListParameter.Value;
       var llee = lle.ToEndLinks(); // LLE-e encoding uses the highest indexed member as group number
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Analysis;
@@ -96,5 +97,5 @@
     }
 
-    public override double Evaluate(BinaryVector solution, IRandom random) {
+    public override double Evaluate(BinaryVector solution, IRandom random, CancellationToken cancellationToken) {
       var totalWeight = 0.0;
       var totalValue = 0.0;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.NK/3.3/NKLandscape.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.NK/3.3/NKLandscape.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.NK/3.3/NKLandscape.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Linq;
 using System.Security.Cryptography;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -334,5 +335,5 @@
     }
 
-    public override double Evaluate(BinaryVector vector, IRandom random) {
+    public override double Evaluate(BinaryVector vector, IRandom random, CancellationToken cancellationToken) {
       double[] f_i; //useful for debugging
       double quality = Evaluate(vector, GeneInteractions, Weights, InteractionSeed.Value, out f_i, Q, P);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/HeuristicLab.Problems.PTSP.Views-3.3.csproj
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/HeuristicLab.Problems.PTSP.Views-3.3.csproj	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/HeuristicLab.Problems.PTSP.Views-3.3.csproj	(revision 17320)
@@ -73,4 +73,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
       <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
@@ -157,5 +161,4 @@
       <Private>False</Private>
     </ProjectReference>
-    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs	(revision 17320)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -59,9 +60,9 @@
     }
 
-    public override double Evaluate(Permutation tour, IRandom random) {
-      return Evaluate(tour, ProbabilisticTSPData);
+    public override double Evaluate(Permutation tour, IRandom random, CancellationToken cancellationToken) {
+      return Evaluate(tour, ProbabilisticTSPData, cancellationToken);
     }
 
-    public static double Evaluate(Permutation tour, IProbabilisticTSPData data) {
+    public static double Evaluate(Permutation tour, IProbabilisticTSPData data, CancellationToken cancellationToken) {
       // Analytical evaluation
       var firstSum = 0.0;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -101,6 +102,6 @@
     }
 
-    public override double Evaluate(Permutation tour, IRandom random) {
-      return Evaluate(tour, ProbabilisticTSPData, RealizationData);
+    public override double Evaluate(Permutation tour, IRandom random, CancellationToken cancellationToken) {
+      return Evaluate(tour, ProbabilisticTSPData, RealizationData, cancellationToken);
     }
 
@@ -110,5 +111,5 @@
     }
 
-    public static double Evaluate(Permutation tour, IProbabilisticTSPData data, IEnumerable<BoolArray> realizations) {
+    public static double Evaluate(Permutation tour, IProbabilisticTSPData data, IEnumerable<BoolArray> realizations, CancellationToken cancellationToken) {
       // Estimation-based evaluation, here without calculating variance for faster evaluation
       var estimatedSum = 0.0;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPAnalyticalInsertionMoveEvaluator.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPAnalyticalInsertionMoveEvaluator.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPAnalyticalInsertionMoveEvaluator.cs	(revision 17320)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -50,5 +51,5 @@
       var afterMove = (Permutation)tour.Clone();
       TranslocationManipulator.Apply(afterMove, move.Index1, move.Index1, move.Index3);
-      return AnalyticalPTSP.Evaluate(afterMove, data);
+      return AnalyticalPTSP.Evaluate(afterMove, data, CancellationToken.None);
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPAnalyticalInversionMoveEvaluator.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPAnalyticalInversionMoveEvaluator.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPAnalyticalInversionMoveEvaluator.cs	(revision 17320)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -50,5 +51,5 @@
       var afterMove = (Permutation)tour.Clone();
       InversionManipulator.Apply(afterMove, move.Index1, move.Index2);
-      return AnalyticalPTSP.Evaluate(afterMove, data);
+      return AnalyticalPTSP.Evaluate(afterMove, data, CancellationToken.None);
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs	(revision 17320)
@@ -22,6 +22,6 @@
 using System;
 using System.Collections.Generic;
+using System.Threading;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 
@@ -59,5 +59,9 @@
     #region ISingleObjectiveProblemDefinition<TEncoding,TEncodedSolution> Members
     public abstract bool Maximization { get; }
-    public abstract double Evaluate(TEncodedSolution individual, IRandom random);
+
+    public virtual double Evaluate(TEncodedSolution solution, IRandom random) {
+      return Evaluate(solution, random, CancellationToken.None);
+    }
+    public abstract double Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
     public abstract void Analyze(TEncodedSolution[] individuals, double[] qualities, ResultCollection results, IRandom random);
     public abstract IEnumerable<TEncodedSolution> GetNeighbors(TEncodedSolution individual, IRandom random);
@@ -82,5 +86,9 @@
     public abstract IReadOnlyList<double[]> BestKnownFront { get; }
     public abstract double[] ReferencePoint { get; }
-    public abstract double[] Evaluate(TEncodedSolution individual, IRandom random);
+
+    public virtual double[] Evaluate(TEncodedSolution solution, IRandom random) {
+      return Evaluate(solution, random, CancellationToken.None);
+    }
+    public abstract double[] Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken);
     public abstract void Analyze(TEncodedSolution[] individuals, double[][] qualities, ResultCollection results, IRandom random);
     public abstract IEnumerable<TEncodedSolution> GetNeighbors(TEncodedSolution individual, IRandom random);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 17320)
@@ -21,8 +21,8 @@
 
 using System.Collections.Generic;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 
@@ -59,4 +59,8 @@
     }
 
+    double[] IMultiObjectiveProblemDefinition<TEncoding, TEncodedSolution>.Evaluate(TEncodedSolution individual, IRandom random, CancellationToken cancellationToken) {
+      return CompiledProblemDefinition.Evaluate(individual, random, cancellationToken);
+    }
+
     void IMultiObjectiveProblemDefinition<TEncoding, TEncodedSolution>.Analyze(TEncodedSolution[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
       CompiledProblemDefinition.Analyze(individuals, qualities, results, random);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -118,4 +119,7 @@
       return ProblemDefinition.Evaluate(individual, random);
     }
+    public override double[] Evaluate(TEncodedSolution individual, IRandom random, CancellationToken cancellationToken) {
+      return ProblemDefinition.Evaluate(individual, random, cancellationToken);
+    }
 
     public override void Analyze(TEncodedSolution[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs	(revision 17320)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -50,6 +51,10 @@
     public bool Maximization => CompiledProblemDefinition.Maximization;
 
-    double ISingleObjectiveProblemDefinition<TEncoding, TEncodedSolution>.Evaluate(TEncodedSolution individual, IRandom random) {
-      return CompiledProblemDefinition.Evaluate(individual, random);
+    double ISingleObjectiveProblemDefinition<TEncoding, TEncodedSolution>.Evaluate(TEncodedSolution solution, IRandom random) {
+      return CompiledProblemDefinition.Evaluate(solution, random);
+    }
+
+    double ISingleObjectiveProblemDefinition<TEncoding, TEncodedSolution>.Evaluate(TEncodedSolution solution, IRandom random, CancellationToken cancellationToken) {
+      return CompiledProblemDefinition.Evaluate(solution, random, cancellationToken);
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 17320)
@@ -22,4 +22,5 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Analysis;
@@ -107,6 +108,6 @@
     }
 
-    public override double Evaluate(TEncodedSolution individual, IRandom random) {
-      return ProblemDefinition.Evaluate(individual, random);
+    public override double Evaluate(TEncodedSolution individual, IRandom random, CancellationToken cancellationToken) {
+      return ProblemDefinition.Evaluate(individual, random, cancellationToken);
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 17320)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -135,9 +136,9 @@
     }
 
-    public override double Evaluate(Permutation assignment, IRandom random) {
-      return Evaluate(assignment);
-    }
-
-    public double Evaluate(Permutation assignment) {
+    public override double Evaluate(Permutation assignment, IRandom random, CancellationToken cancellationToken) {
+      return Evaluate(assignment, cancellationToken);
+    }
+
+    public double Evaluate(Permutation assignment, CancellationToken cancellationToken) {
       double quality = 0;
       for (int i = 0; i < assignment.Length; i++) {
@@ -283,6 +284,6 @@
       // calculate the optimum of a LAP relaxation and use it as lower bound of our QAP
       LowerBound = new DoubleValue(GilmoreLawlerBoundCalculator.CalculateLowerBound(Weights, Distances, out lbSolution));
-      // evalute the LAP optimal solution as if it was a QAP solution
-      var lbSolutionQuality = Evaluate(lbSolution);
+      // evaluate the LAP optimal solution as if it was a QAP solution
+      var lbSolutionQuality = Evaluate(lbSolution, CancellationToken.None);
       // in case both qualities are the same it means that the LAP optimum is also a QAP optimum
       if (LowerBound.Value.IsAlmost(lbSolutionQuality)) {
@@ -312,5 +313,5 @@
 
     public void Load(QAPData data) {
-      if (data.Dimension > ProblemSizeLimit) throw new System.IO.InvalidDataException("The problem is limited to instance of size " + ProblemSizeLimit + ". You can change this limit by modifying " + nameof(QuadraticAssignmentProblem) + "." + nameof(ProblemSizeLimit) +"!");
+      if (data.Dimension > ProblemSizeLimit) throw new System.IO.InvalidDataException("The problem is limited to instance of size " + ProblemSizeLimit + ". You can change this limit by modifying " + nameof(QuadraticAssignmentProblem) + "." + nameof(ProblemSizeLimit) + "!");
       var weights = new DoubleMatrix(data.Weights, @readonly: true);
       var distances = new DoubleMatrix(data.Distances, @readonly: true);
@@ -363,5 +364,5 @@
       if (assignment == null || assignment.Length == 0) return;
       var vector = new Permutation(PermutationTypes.Absolute, assignment);
-      var result = Evaluate(vector);
+      var result = Evaluate(vector, CancellationToken.None);
       BestKnownQuality = result;
       BestKnownSolution = vector;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 17320)
@@ -20,4 +20,5 @@
 #endregion
 using System;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Analysis;
@@ -121,5 +122,5 @@
     }
 
-    public override double[] Evaluate(RealVector solution, IRandom random) {
+    public override double[] Evaluate(RealVector solution, IRandom random, CancellationToken cancellationToken) {
       return TestFunction.Evaluate(solution, Objectives);
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Analysis;
@@ -108,5 +109,5 @@
     }
 
-    public override double Evaluate(RealVector individual, IRandom random) {
+    public override double Evaluate(RealVector individual, IRandom random, CancellationToken cancellationToken) {
       return TestFunction.Evaluate(individual);
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs	(revision 17317)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs	(revision 17320)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -82,5 +83,5 @@
     }
 
-    public override double Evaluate(Permutation tour, IRandom random) {
+    public override double Evaluate(Permutation tour, IRandom random, CancellationToken cancellationToken) {
       return Evaluate(tour);
     }
