Index: trunk/sources/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs	(revision 5208)
@@ -120,5 +120,5 @@
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Recombinator", "The operator used to cross solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation."));
@@ -142,10 +142,10 @@
       Placeholder strategyMutator1 = new Placeholder();
       Placeholder mutator1 = new Placeholder();
-      Placeholder evaluator1 = new Placeholder();
       SubScopesRemover subScopesRemover = new SubScopesRemover();
       UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
       Placeholder strategyMutator2 = new Placeholder();
       Placeholder mutator2 = new Placeholder();
-      Placeholder evaluator2 = new Placeholder();
+      UniformSubScopesProcessor uniformSubScopesProcessor3 = new UniformSubScopesProcessor();
+      Placeholder evaluator = new Placeholder();
       ConditionalBranch plusOrCommaReplacementBranch = new ConditionalBranch();
       MergingReducer plusReplacement = new MergingReducer();
@@ -195,7 +195,4 @@
       mutator1.OperatorParameter.ActualName = MutatorParameter.Name;
 
-      evaluator1.Name = "Evaluator (placeholder)";
-      evaluator1.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
       subScopesRemover.RemoveAllSubScopes = true;
 
@@ -206,6 +203,8 @@
       mutator2.OperatorParameter.ActualName = MutatorParameter.Name;
 
-      evaluator2.Name = "Evaluator (placeholder)";
-      evaluator2.OperatorParameter.ActualName = EvaluatorParameter.Name;
+      uniformSubScopesProcessor3.Parallel.Value = true;
+
+      evaluator.Name = "Evaluator (placeholder)";
+      evaluator.OperatorParameter.ActualName = EvaluatorParameter.Name;
 
       plusOrCommaReplacementBranch.ConditionParameter.ActualName = PlusSelectionParameter.Name;
@@ -245,5 +244,5 @@
       useRecombinationBranch.TrueBranch = childrenCreator;
       useRecombinationBranch.FalseBranch = uniformSubScopesProcessor2;
-      useRecombinationBranch.Successor = null;
+      useRecombinationBranch.Successor = uniformSubScopesProcessor3;
       childrenCreator.Successor = uniformSubScopesProcessor1;
       uniformSubScopesProcessor1.Operator = recombinator;
@@ -252,11 +251,13 @@
       strategyRecombinator.Successor = strategyMutator1;
       strategyMutator1.Successor = mutator1;
-      mutator1.Successor = evaluator1;
-      evaluator1.Successor = subScopesRemover;
+      mutator1.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
       uniformSubScopesProcessor2.Operator = strategyMutator2;
       uniformSubScopesProcessor2.Successor = null;
       strategyMutator2.Successor = mutator2;
-      mutator2.Successor = evaluator2;
+      mutator2.Successor = null;
+      uniformSubScopesProcessor3.Operator = evaluator;
+      uniformSubScopesProcessor3.Successor = null;
+      evaluator.Successor = null;
       plusOrCommaReplacementBranch.TrueBranch = plusReplacement;
       plusOrCommaReplacementBranch.FalseBranch = commaReplacement;
Index: trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs	(revision 5208)
@@ -104,5 +104,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed."));
@@ -119,10 +119,11 @@
       SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
       ChildrenCreator childrenCreator = new ChildrenCreator();
-      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
+      UniformSubScopesProcessor uniformSubScopesProcessor1 = new UniformSubScopesProcessor();
       Placeholder crossover = new Placeholder();
       StochasticBranch stochasticBranch = new StochasticBranch();
       Placeholder mutator = new Placeholder();
+      SubScopesRemover subScopesRemover = new SubScopesRemover();
+      UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
       Placeholder evaluator = new Placeholder();
-      SubScopesRemover subScopesRemover = new SubScopesRemover();
       SubScopesProcessor subScopesProcessor2 = new SubScopesProcessor();
       BestSelector bestSelector = new BestSelector();
@@ -157,8 +158,10 @@
       mutator.OperatorParameter.ActualName = "Mutator";
 
+      subScopesRemover.RemoveAllSubScopes = true;
+
+      uniformSubScopesProcessor2.Parallel.Value = true;
+
       evaluator.Name = "Evaluator";
       evaluator.OperatorParameter.ActualName = "Evaluator";
-
-      subScopesRemover.RemoveAllSubScopes = true;
 
       bestSelector.CopySelected = new BoolValue(false);
@@ -193,14 +196,16 @@
       subScopesProcessor1.Operators.Add(childrenCreator);
       subScopesProcessor1.Successor = subScopesProcessor2;
-      childrenCreator.Successor = uniformSubScopesProcessor;
-      uniformSubScopesProcessor.Operator = crossover;
-      uniformSubScopesProcessor.Successor = null;
+      childrenCreator.Successor = uniformSubScopesProcessor1;
+      uniformSubScopesProcessor1.Operator = crossover;
+      uniformSubScopesProcessor1.Successor = uniformSubScopesProcessor2;
       crossover.Successor = stochasticBranch;
       stochasticBranch.FirstBranch = mutator;
       stochasticBranch.SecondBranch = null;
-      stochasticBranch.Successor = evaluator;
+      stochasticBranch.Successor = subScopesRemover;
       mutator.Successor = null;
-      evaluator.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
+      uniformSubScopesProcessor2.Operator = evaluator;
+      uniformSubScopesProcessor2.Successor = null;
+      evaluator.Successor = null;
       subScopesProcessor2.Operators.Add(bestSelector);
       subScopesProcessor2.Operators.Add(new EmptyOperator());
Index: trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 5208)
@@ -130,5 +130,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The results collection to store the results."));
@@ -153,6 +153,7 @@
       StochasticBranch stochasticBranch = new StochasticBranch();
       Placeholder mutator = new Placeholder();
+      SubScopesRemover subScopesRemover = new SubScopesRemover();
+      UniformSubScopesProcessor uniformSubScopesProcessor3 = new UniformSubScopesProcessor();
       Placeholder evaluator = new Placeholder();
-      SubScopesRemover subScopesRemover = new SubScopesRemover();
       SubScopesProcessor subScopesProcessor2 = new SubScopesProcessor();
       BestSelector bestSelector = new BestSelector();
@@ -166,8 +167,8 @@
       Assigner resetGenerationsSinceLastMigrationAssigner = new Assigner();
       IntCounter migrationsCounter = new IntCounter();
-      UniformSubScopesProcessor uniformSubScopesProcessor3 = new UniformSubScopesProcessor();
+      UniformSubScopesProcessor uniformSubScopesProcessor4 = new UniformSubScopesProcessor();
       Placeholder emigrantsSelector = new Placeholder();
       Placeholder migrator = new Placeholder();
-      UniformSubScopesProcessor uniformSubScopesProcessor4 = new UniformSubScopesProcessor();
+      UniformSubScopesProcessor uniformSubScopesProcessor5 = new UniformSubScopesProcessor();
       Placeholder immigrationReplacer = new Placeholder();
       Comparator generationsComparator = new Comparator();
@@ -211,8 +212,10 @@
       mutator.OperatorParameter.ActualName = MutatorParameter.Name;
 
+      subScopesRemover.RemoveAllSubScopes = true;
+
+      uniformSubScopesProcessor3.Parallel.Value = true;
+
       evaluator.Name = "Evaluator (placeholder)";
       evaluator.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
-      subScopesRemover.RemoveAllSubScopes = true;
 
       bestSelector.CopySelected = new BoolValue(false);
@@ -293,12 +296,14 @@
       childrenCreator.Successor = uniformSubScopesProcessor2;
       uniformSubScopesProcessor2.Operator = crossover;
-      uniformSubScopesProcessor2.Successor = null;
+      uniformSubScopesProcessor2.Successor = uniformSubScopesProcessor3;
       crossover.Successor = stochasticBranch;
       stochasticBranch.FirstBranch = mutator;
       stochasticBranch.SecondBranch = null;
-      stochasticBranch.Successor = evaluator;
+      stochasticBranch.Successor = subScopesRemover;
       mutator.Successor = null;
-      evaluator.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
+      uniformSubScopesProcessor3.Operator = evaluator;
+      uniformSubScopesProcessor3.Successor = null;
+      evaluator.Successor = null;
       subScopesProcessor2.Operators.Add(bestSelector);
       subScopesProcessor2.Operators.Add(new EmptyOperator());
@@ -315,10 +320,10 @@
       migrationBranch.Successor = generationsComparator;
       resetGenerationsSinceLastMigrationAssigner.Successor = migrationsCounter;
-      migrationsCounter.Successor = uniformSubScopesProcessor3;
-      uniformSubScopesProcessor3.Operator = emigrantsSelector;
-      uniformSubScopesProcessor3.Successor = migrator;
-      migrator.Successor = uniformSubScopesProcessor4;
-      uniformSubScopesProcessor4.Operator = immigrationReplacer;
-      uniformSubScopesProcessor4.Successor = null;
+      migrationsCounter.Successor = uniformSubScopesProcessor4;
+      uniformSubScopesProcessor4.Operator = emigrantsSelector;
+      uniformSubScopesProcessor4.Successor = migrator;
+      migrator.Successor = uniformSubScopesProcessor5;
+      uniformSubScopesProcessor5.Operator = immigrationReplacer;
+      uniformSubScopesProcessor5.Successor = null;
       generationsComparator.Successor = analyzer2;
       analyzer2.Successor = resultsCollector3;
Index: trunk/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 5208)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -27,5 +28,4 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Selection;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -97,5 +97,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed."));
       Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
@@ -110,5 +110,5 @@
       SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
       ChildrenCreator childrenCreator = new ChildrenCreator();
-      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
+      UniformSubScopesProcessor uniformSubScopesProcessor1 = new UniformSubScopesProcessor();
       StochasticBranch crossoverStochasticBranch = new StochasticBranch();
       Placeholder crossover = new Placeholder();
@@ -116,6 +116,7 @@
       StochasticBranch mutationStochasticBranch = new StochasticBranch();
       Placeholder mutator = new Placeholder();
+      SubScopesRemover subScopesRemover = new SubScopesRemover();
+      UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
       Placeholder evaluator = new Placeholder();
-      SubScopesRemover subScopesRemover = new SubScopesRemover();
       MergingReducer mergingReducer = new MergingReducer();
       RankAndCrowdingSorter rankAndCrowdingSorter = new RankAndCrowdingSorter();
@@ -156,8 +157,10 @@
       mutator.OperatorParameter.ActualName = MutatorParameter.Name;
 
+      subScopesRemover.RemoveAllSubScopes = true;
+
+      uniformSubScopesProcessor2.Parallel.Value = true;
+
       evaluator.Name = "Evaluator";
       evaluator.OperatorParameter.ActualName = EvaluatorParameter.Name;
-
-      subScopesRemover.RemoveAllSubScopes = true;
 
       rankAndCrowdingSorter.CrowdingDistanceParameter.ActualName = "CrowdingDistance";
@@ -193,7 +196,7 @@
       subScopesProcessor1.Operators.Add(childrenCreator);
       subScopesProcessor1.Successor = mergingReducer;
-      childrenCreator.Successor = uniformSubScopesProcessor;
-      uniformSubScopesProcessor.Operator = crossoverStochasticBranch;
-      uniformSubScopesProcessor.Successor = null;
+      childrenCreator.Successor = uniformSubScopesProcessor1;
+      uniformSubScopesProcessor1.Operator = crossoverStochasticBranch;
+      uniformSubScopesProcessor1.Successor = uniformSubScopesProcessor2;
       crossoverStochasticBranch.FirstBranch = crossover;
       crossoverStochasticBranch.SecondBranch = noCrossover;
@@ -203,8 +206,10 @@
       mutationStochasticBranch.FirstBranch = mutator;
       mutationStochasticBranch.SecondBranch = null;
-      mutationStochasticBranch.Successor = evaluator;
+      mutationStochasticBranch.Successor = subScopesRemover;
       mutator.Successor = null;
-      evaluator.Successor = subScopesRemover;
       subScopesRemover.Successor = null;
+      uniformSubScopesProcessor2.Operator = evaluator;
+      uniformSubScopesProcessor2.Successor = null;
+      evaluator.Successor = null;
       mergingReducer.Successor = rankAndCrowdingSorter;
       rankAndCrowdingSorter.Successor = leftSelector;
Index: trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 5208)
@@ -153,5 +153,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The results collection to store the results."));
Index: trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 5208)
@@ -115,5 +115,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed."));
Index: trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 5208)
@@ -109,5 +109,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solutions."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
@@ -124,27 +124,39 @@
       SubScopesProcessor subScopesProcessor1 = new SubScopesProcessor();
       ChildrenCreator childrenCreator = new ChildrenCreator();
-      UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
-      Placeholder crossover = new Placeholder();
       ConditionalBranch osBeforeMutationBranch = new ConditionalBranch();
+      UniformSubScopesProcessor uniformSubScopesProcessor1 = new UniformSubScopesProcessor();
+      Placeholder crossover1 = new Placeholder();
+      UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
       Placeholder evaluator1 = new Placeholder();
       IntCounter evaluationCounter1 = new IntCounter();
       WeightedParentsQualityComparator qualityComparer1 = new WeightedParentsQualityComparator();
+      SubScopesRemover subScopesRemover1 = new SubScopesRemover();
+      UniformSubScopesProcessor uniformSubScopesProcessor3 = new UniformSubScopesProcessor();
       StochasticBranch mutationBranch1 = new StochasticBranch();
       Placeholder mutator1 = new Placeholder();
+      VariableCreator variableCreator1 = new VariableCreator();
+      VariableCreator variableCreator2 = new VariableCreator();
+      ConditionalSelector conditionalSelector = new ConditionalSelector();
+      SubScopesProcessor subScopesProcessor2 = new SubScopesProcessor();
+      UniformSubScopesProcessor uniformSubScopesProcessor4 = new UniformSubScopesProcessor();
       Placeholder evaluator2 = new Placeholder();
       IntCounter evaluationCounter2 = new IntCounter();
+      MergingReducer mergingReducer1 = new MergingReducer();
+      UniformSubScopesProcessor uniformSubScopesProcessor5 = new UniformSubScopesProcessor();
+      Placeholder crossover2 = new Placeholder();
       StochasticBranch mutationBranch2 = new StochasticBranch();
       Placeholder mutator2 = new Placeholder();
+      UniformSubScopesProcessor uniformSubScopesProcessor6 = new UniformSubScopesProcessor();
       Placeholder evaluator3 = new Placeholder();
       IntCounter evaluationCounter3 = new IntCounter();
       WeightedParentsQualityComparator qualityComparer2 = new WeightedParentsQualityComparator();
-      SubScopesRemover subScopesRemover = new SubScopesRemover();
+      SubScopesRemover subScopesRemover2 = new SubScopesRemover();
       OffspringSelector offspringSelector = new OffspringSelector();
-      SubScopesProcessor subScopesProcessor2 = new SubScopesProcessor();
+      SubScopesProcessor subScopesProcessor3 = new SubScopesProcessor();
       BestSelector bestSelector = new BestSelector();
       WorstSelector worstSelector = new WorstSelector();
       RightReducer rightReducer = new RightReducer();
       LeftReducer leftReducer = new LeftReducer();
-      MergingReducer mergingReducer = new MergingReducer();
+      MergingReducer mergingReducer2 = new MergingReducer();
 
       selector.Name = "Selector (placeholder)";
@@ -153,9 +165,11 @@
       childrenCreator.ParentsPerChild = new IntValue(2);
 
-      crossover.Name = "Crossover (placeholder)";
-      crossover.OperatorParameter.ActualName = CrossoverParameter.Name;
-
       osBeforeMutationBranch.Name = "Apply OS before mutation?";
       osBeforeMutationBranch.ConditionParameter.ActualName = OffspringSelectionBeforeMutationParameter.Name;
+
+      crossover1.Name = "Crossover (placeholder)";
+      crossover1.OperatorParameter.ActualName = CrossoverParameter.Name;
+
+      uniformSubScopesProcessor2.Parallel.Value = true;
 
       evaluator1.Name = "Evaluator (placeholder)";
@@ -172,4 +186,6 @@
       qualityComparer1.ResultParameter.ActualName = "SuccessfulOffspring";
 
+      subScopesRemover1.RemoveAllSubScopes = true;
+
       mutationBranch1.ProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
       mutationBranch1.RandomParameter.ActualName = RandomParameter.Name;
@@ -177,4 +193,16 @@
       mutator1.Name = "Mutator (placeholder)";
       mutator1.OperatorParameter.ActualName = MutatorParameter.Name;
+
+      variableCreator1.Name = "MutatedOffspring = true";
+      variableCreator1.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(true), false));
+
+      variableCreator2.Name = "MutatedOffspring = false";
+      variableCreator2.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(false), false));
+
+      conditionalSelector.ConditionParameter.ActualName = "MutatedOffspring";
+      conditionalSelector.ConditionParameter.Depth = 1;
+      conditionalSelector.CopySelected.Value = false;
+
+      uniformSubScopesProcessor4.Parallel.Value = true;
 
       evaluator2.Name = "Evaluator (placeholder)";
@@ -185,4 +213,7 @@
       evaluationCounter2.ValueParameter.ActualName = EvaluatedSolutionsParameter.Name;
 
+      crossover2.Name = "Crossover (placeholder)";
+      crossover2.OperatorParameter.ActualName = CrossoverParameter.Name;
+
       mutationBranch2.ProbabilityParameter.ActualName = MutationProbabilityParameter.Name;
       mutationBranch2.RandomParameter.ActualName = RandomParameter.Name;
@@ -190,4 +221,6 @@
       mutator2.Name = "Mutator (placeholder)";
       mutator2.OperatorParameter.ActualName = MutatorParameter.Name;
+
+      uniformSubScopesProcessor6.Parallel.Value = true;
 
       evaluator3.Name = "Evaluator (placeholder)";
@@ -204,5 +237,5 @@
       qualityComparer2.ResultParameter.ActualName = "SuccessfulOffspring";
 
-      subScopesRemover.RemoveAllSubScopes = true;
+      subScopesRemover2.RemoveAllSubScopes = true;
 
       offspringSelector.CurrentSuccessRatioParameter.ActualName = CurrentSuccessRatioParameter.Name;
@@ -231,37 +264,57 @@
       subScopesProcessor1.Operators.Add(childrenCreator);
       subScopesProcessor1.Successor = offspringSelector;
-      childrenCreator.Successor = uniformSubScopesProcessor;
-      uniformSubScopesProcessor.Operator = crossover;
-      uniformSubScopesProcessor.Successor = null;
-      crossover.Successor = osBeforeMutationBranch;
-      osBeforeMutationBranch.TrueBranch = evaluator1;
-      osBeforeMutationBranch.FalseBranch = mutationBranch2;
-      osBeforeMutationBranch.Successor = subScopesRemover;
+      childrenCreator.Successor = osBeforeMutationBranch;
+      osBeforeMutationBranch.TrueBranch = uniformSubScopesProcessor1;
+      osBeforeMutationBranch.FalseBranch = uniformSubScopesProcessor5;
+      osBeforeMutationBranch.Successor = null;
+      uniformSubScopesProcessor1.Operator = crossover1;
+      uniformSubScopesProcessor1.Successor = uniformSubScopesProcessor2;
+      crossover1.Successor = null;
+      uniformSubScopesProcessor2.Operator = evaluator1;
+      uniformSubScopesProcessor2.Successor = uniformSubScopesProcessor3;
       evaluator1.Successor = evaluationCounter1;
       evaluationCounter1.Successor = qualityComparer1;
-      qualityComparer1.Successor = mutationBranch1;
+      qualityComparer1.Successor = subScopesRemover1;
+      subScopesRemover1.Successor = null;
+      uniformSubScopesProcessor3.Operator = mutationBranch1;
+      uniformSubScopesProcessor3.Successor = conditionalSelector;
       mutationBranch1.FirstBranch = mutator1;
-      mutationBranch1.SecondBranch = null;
+      mutationBranch1.SecondBranch = variableCreator2;
       mutationBranch1.Successor = null;
-      mutator1.Successor = evaluator2;
+      mutator1.Successor = variableCreator1;
+      variableCreator1.Successor = null;
+      variableCreator2.Successor = null;
+      conditionalSelector.Successor = subScopesProcessor2;
+      subScopesProcessor2.Operators.Add(new EmptyOperator());
+      subScopesProcessor2.Operators.Add(uniformSubScopesProcessor4);
+      subScopesProcessor2.Successor = mergingReducer1;
+      uniformSubScopesProcessor4.Operator = evaluator2;
+      uniformSubScopesProcessor4.Successor = null;
       evaluator2.Successor = evaluationCounter2;
       evaluationCounter2.Successor = null;
+      mergingReducer1.Successor = null;
+      uniformSubScopesProcessor5.Operator = crossover2;
+      uniformSubScopesProcessor5.Successor = uniformSubScopesProcessor6;
+      crossover2.Successor = mutationBranch2;
       mutationBranch2.FirstBranch = mutator2;
       mutationBranch2.SecondBranch = null;
-      mutationBranch2.Successor = evaluator3;
+      mutationBranch2.Successor = null;
       mutator2.Successor = null;
+      uniformSubScopesProcessor6.Operator = evaluator3;
+      uniformSubScopesProcessor6.Successor = null;
       evaluator3.Successor = evaluationCounter3;
       evaluationCounter3.Successor = qualityComparer2;
-      subScopesRemover.Successor = null;
+      qualityComparer2.Successor = subScopesRemover2;
+      subScopesRemover2.Successor = null;
       offspringSelector.OffspringCreator = selector;
-      offspringSelector.Successor = subScopesProcessor2;
-      subScopesProcessor2.Operators.Add(bestSelector);
-      subScopesProcessor2.Operators.Add(worstSelector);
-      subScopesProcessor2.Successor = mergingReducer;
+      offspringSelector.Successor = subScopesProcessor3;
+      subScopesProcessor3.Operators.Add(bestSelector);
+      subScopesProcessor3.Operators.Add(worstSelector);
+      subScopesProcessor3.Successor = mergingReducer2;
       bestSelector.Successor = rightReducer;
       rightReducer.Successor = null;
       worstSelector.Successor = leftReducer;
       leftReducer.Successor = null;
-      mergingReducer.Successor = null;
+      mergingReducer2.Successor = null;
       #endregion
     }
Index: trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs	(revision 5208)
@@ -129,5 +129,5 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ValueLookupParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The results collection to store the results."));
Index: trunk/sources/HeuristicLab.Operators/3.3/IntCounter.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/IntCounter.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Operators/3.3/IntCounter.cs	(revision 5208)
@@ -33,4 +33,6 @@
   [StorableClass]
   public sealed class IntCounter : SingleSuccessorOperator {
+    private object locker = new object();
+
     public LookupParameter<IntValue> ValueParameter {
       get { return (LookupParameter<IntValue>)Parameters["Value"]; }
@@ -60,6 +62,8 @@
 
     public override IOperation Apply() {
-      if (ValueParameter.ActualValue == null) ValueParameter.ActualValue = new IntValue();
-      ValueParameter.ActualValue.Value += IncrementParameter.ActualValue.Value;
+      lock (locker) {
+        if (ValueParameter.ActualValue == null) ValueParameter.ActualValue = new IntValue();
+        ValueParameter.ActualValue.Value += IncrementParameter.ActualValue.Value;
+      }
       return base.Apply();
     }
Index: trunk/sources/HeuristicLab.Optimization.Operators/3.3/SolutionsCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Operators/3.3/SolutionsCreator.cs	(revision 5206)
+++ trunk/sources/HeuristicLab.Optimization.Operators/3.3/SolutionsCreator.cs	(revision 5208)
@@ -29,7 +29,7 @@
 namespace HeuristicLab.Optimization.Operators {
   /// <summary>
-  /// An operator which creates new solutions.
+  /// An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.
   /// </summary>
-  [Item("SolutionsCreator", "An operator which creates new solutions.")]
+  [Item("SolutionsCreator", "An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.")]
   [StorableClass]
   public sealed class SolutionsCreator : SingleSuccessorOperator {
@@ -61,5 +61,5 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSolutions", "The number of solutions that should be created."));
       Parameters.Add(new ValueLookupParameter<IOperator>("SolutionCreator", "The operator which is used to create new solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator which is used to evaluate new solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator which is used to evaluate new solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope to which the new solutions are added as sub-scopes."));
     }
@@ -78,9 +78,13 @@
         CurrentScope.SubScopes.Add(new Scope((current + i).ToString()));
 
+      OperationCollection creation = new OperationCollection();
+      OperationCollection evaluation = new OperationCollection() { Parallel = true };
+      for (int i = 0; i < count; i++) {
+        if (creator != null) creation.Add(ExecutionContext.CreateOperation(creator, CurrentScope.SubScopes[current + i]));
+        if (evaluator != null) evaluation.Add(ExecutionContext.CreateOperation(evaluator, CurrentScope.SubScopes[current + i]));
+      }
       OperationCollection next = new OperationCollection();
-      for (int i = 0; i < count; i++) {
-        if (creator != null) next.Add(ExecutionContext.CreateOperation(creator, CurrentScope.SubScopes[current + i]));
-        if (evaluator != null) next.Add(ExecutionContext.CreateOperation(evaluator, CurrentScope.SubScopes[current + i]));
-      }
+      next.Add(creation);
+      next.Add(evaluation);
       next.Add(base.Apply());
       return next;
