Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/ChildrenCopyCreator.cs
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/ChildrenCopyCreator.cs	(revision 14029)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/ChildrenCopyCreator.cs	(revision 14029)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.Operators {
+  /// <summary>
+  /// Creates a copy of every sub-scope in the current scope and adds it as a child to the sub-scope.
+  /// </summary>
+  /// <remarks>
+  /// Creates a copy of every sub-scope in the current scope and adds it as a child to the sub-scope.
+  /// </remarks>
+  [Item("ChildrenCopyCreator", "Creates a copy of every sub-scope in the current scope and adds it as a child to the sub-scope.")]
+  [StorableClass]
+  public sealed class ChildrenCopyCreator : SingleSuccessorOperator {
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+
+    [StorableConstructor]
+    private ChildrenCopyCreator(bool deserializing) : base(deserializing) { }
+    private ChildrenCopyCreator(ChildrenCopyCreator original, Cloner cloner) : base(original, cloner) { }
+    public ChildrenCopyCreator()
+      : base() {
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes should be copied."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChildrenCopyCreator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      int nChildren = CurrentScope.SubScopes.Count;
+
+      for (int i = 0; i < nChildren; i++) {
+        IScope child = CurrentScope.SubScopes[i];
+        if (child.SubScopes.Count > 0) throw new ArgumentException("The sub-scope that should be cloned has further sub-scopes.");
+
+        IScope childCopy = new Scope(i.ToString());
+        var cloner = new Cloner();
+        foreach (IVariable var in child.Variables)
+          childCopy.Variables.Add(cloner.Clone(var));
+
+        child.SubScopes.Add(childCopy);
+      }
+      return base.Apply();
+    }
+  }
+}
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj	(revision 14029)
@@ -115,4 +115,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ChildrenCopyCreator.cs" />
     <Compile Include="ExpressionCalculator.cs" />
     <Compile Include="NoSimilarityCalculator.cs" />
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 14029)
@@ -29,4 +29,5 @@
 
 namespace HeuristicLab.Optimization.Operators {
+  [StorableClass]
   public class RankAndCrowdingSorter : AlgorithmOperator, IMultiObjectiveOperator {
     #region Parameter properties
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Plugin.cs.frame
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Plugin.cs.frame	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Plugin.cs.frame	(revision 14029)
@@ -26,5 +26,5 @@
   /// Plugin class for HeuristicLab.Optimization.Operators plugin.
   /// </summary>
-  [Plugin("HeuristicLab.Optimization.Operators", "3.3.12.$WCREV$")]
+  [Plugin("HeuristicLab.Optimization.Operators", "3.3.13.$WCREV$")]
   [PluginFile("HeuristicLab.Optimization.Operators-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Properties/AssemblyInfo.cs.frame	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/Properties/AssemblyInfo.cs.frame	(revision 14029)
@@ -54,3 +54,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.13.$WCREV$")]
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs	(revision 14029)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using System.Threading.Tasks;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -41,4 +42,8 @@
     [Storable]
     public string QualityVariableName { get; set; }
+    [Storable]
+    public bool ExecuteInParallel { get; set; }
+    [Storable]
+    public int MaxDegreeOfParallelism { get; set; }
     #endregion
 
@@ -48,8 +53,22 @@
     protected SolutionSimilarityCalculator(SolutionSimilarityCalculator original, Cloner cloner)
       : base(original, cloner) {
-      this.SolutionVariableName = original.SolutionVariableName;
-      this.QualityVariableName = original.QualityVariableName;
-    }
-    protected SolutionSimilarityCalculator() : base() { }
+      SolutionVariableName = original.SolutionVariableName;
+      QualityVariableName = original.QualityVariableName;
+      ExecuteInParallel = original.ExecuteInParallel;
+      MaxDegreeOfParallelism = original.MaxDegreeOfParallelism;
+    }
+
+    protected SolutionSimilarityCalculator() : base() {
+      ExecuteInParallel = false;
+      MaxDegreeOfParallelism = -1;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (MaxDegreeOfParallelism == 0) {
+        ExecuteInParallel = false;
+        MaxDegreeOfParallelism = -1;
+      }
+    }
 
     public double[][] CalculateSolutionCrowdSimilarity(IScope leftSolutionCrowd, IScope rightSolutionCrowd) {
@@ -75,27 +94,51 @@
 
     public double[][] CalculateSolutionCrowdSimilarity(IScope solutionCrowd) {
-      if (solutionCrowd == null)
+      if (solutionCrowd == null) {
         throw new ArgumentException("Cannot calculate similarity because the provided crowd is null.");
-
+      }
       var individuals = solutionCrowd.SubScopes;
 
-      if (!individuals.Any())
+      if (!individuals.Any()) {
         throw new ArgumentException("Cannot calculate similarity because the provided crowd is empty.");
+      }
 
       var similarityMatrix = new double[individuals.Count][];
-      for (int i = 0; i < individuals.Count; i++) similarityMatrix[i] = new double[individuals.Count];
-
-      if (IsCommutative) {
-        for (int i = 0; i < individuals.Count; i++) {
-          for (int j = i; j < individuals.Count; j++) {
-            similarityMatrix[i][j] = similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
+      for (int i = 0; i < individuals.Count; i++) {
+        similarityMatrix[i] = new double[individuals.Count];
+      }
+
+      if (ExecuteInParallel) {
+        var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = MaxDegreeOfParallelism };
+        if (IsCommutative) {
+          Parallel.For(0, individuals.Count, parallelOptions, i => {
+            for (int j = i; j < individuals.Count; j++) {
+              similarityMatrix[i][j] =
+                similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
+            }
+          });
+        } else {
+          Parallel.For(0, individuals.Count, parallelOptions, i => {
+            for (int j = i; j < individuals.Count; j++) {
+              similarityMatrix[i][j] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
+              if (i == j) continue;
+              similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[j], individuals[i]);
+            }
+          });
+        }
+      } else {
+        if (IsCommutative) {
+          for (int i = 0; i < individuals.Count; i++) {
+            for (int j = i; j < individuals.Count; j++) {
+              similarityMatrix[i][j] =
+                similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
+            }
           }
-        }
-      } else {
-        for (int i = 0; i < individuals.Count; i++) {
-          for (int j = i; j < individuals.Count; j++) {
-            similarityMatrix[i][j] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
-            if (i == j) continue;
-            similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[j], individuals[i]);
+        } else {
+          for (int i = 0; i < individuals.Count; i++) {
+            for (int j = i; j < individuals.Count; j++) {
+              similarityMatrix[i][j] = CalculateSolutionSimilarity(individuals[i], individuals[j]);
+              if (i == j) continue;
+              similarityMatrix[j][i] = CalculateSolutionSimilarity(individuals[j], individuals[i]);
+            }
           }
         }
Index: branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/UnidirectionalRingMigrator.cs
===================================================================
--- branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/UnidirectionalRingMigrator.cs	(revision 13401)
+++ branches/crossvalidation-2434/HeuristicLab.Optimization.Operators/3.3/UnidirectionalRingMigrator.cs	(revision 14029)
@@ -23,5 +23,7 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -33,9 +35,26 @@
   [StorableClass]
   public class UnidirectionalRingMigrator : SingleSuccessorOperator, IMigrator {
+    public IValueLookupParameter<BoolValue> ClockwiseMigrationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["ClockwiseMigration"]; }
+    }
+
     [StorableConstructor]
     protected UnidirectionalRingMigrator(bool deserializing) : base(deserializing) { }
     protected UnidirectionalRingMigrator(UnidirectionalRingMigrator original, Cloner cloner) : base(original, cloner) { }
-    public UnidirectionalRingMigrator() : base() { }
 
+    public UnidirectionalRingMigrator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<BoolValue>("ClockwiseMigration", "True to migrate individuals clockwise, false to migrate individuals counterclockwise.", new BoolValue(true)));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code (remove with 3.4)
+      if (!Parameters.ContainsKey("ClockwiseMigration")) {
+        Parameters.Add(new ValueLookupParameter<BoolValue>("ClockwiseMigration", "True to migrate individuals clockwise, false to migrate individuals counterclockwise.", new BoolValue(false)));
+      }
+      #endregion
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new UnidirectionalRingMigrator(this, cloner);
@@ -43,6 +62,7 @@
 
     /// <summary>
-    /// Migrates every first sub scope of each child to its left neighbour (like a ring).
-    /// <pre>                                                               
+    /// Migrates every first sub scope of each child to its right or left neighbour (like a ring).
+    /// If clockwise migration (default) is used the selected scopes A D G becomes G A D, contrary to counterclockwise where A D G becomes D G A.
+    /// <pre>
     ///          __ scope __              __ scope __
     ///         /     |     \            /     |     \
@@ -56,4 +76,5 @@
     /// <returns>The next operation.</returns>
     public override IOperation Apply() {
+      bool clockwise = ClockwiseMigrationParameter.ActualValue.Value;
       IScope scope = ExecutionContext.Scope;
       List<IScope> emigrantsList = new List<IScope>();
@@ -65,7 +86,13 @@
       }
 
-      // shift first emigrants to end of list
-      emigrantsList.Add(emigrantsList[0]);
-      emigrantsList.RemoveAt(0);
+      if (clockwise) {
+        // shift last emigrants to start of list
+        emigrantsList.Insert(0, emigrantsList[emigrantsList.Count - 1]);
+        emigrantsList.RemoveAt(emigrantsList.Count - 1);
+      } else {
+        // shift first emigrants to end of list
+        emigrantsList.Add(emigrantsList[0]);
+        emigrantsList.RemoveAt(0);
+      }
 
       for (int i = 0; i < scope.SubScopes.Count; i++)
