Index: branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveEvaluator.cs
===================================================================
--- branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveEvaluator.cs	(revision 8206)
+++ branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveEvaluator.cs	(revision 8207)
@@ -78,5 +78,6 @@
     public override IOperation Apply() {
       var evaluator = EvaluatorParameter.ActualValue;
-      var move = (ReplaceBranchMove)MoveParameter.ActualValue.Clone();
+
+      var move = MoveParameter.ActualValue;
 
       // calculate linear scaling
@@ -88,6 +89,12 @@
       move.Beta = beta;
 
-      move.Parent.RemoveSubtree(move.SubtreeIndex);
-      move.Parent.InsertSubtree(move.SubtreeIndex, Scale(move.NewBranch, alpha, beta));
+      // clone tree and parent
+      var cloner = new Cloner();
+      var clonedTree = cloner.Clone(move.Tree);
+      var clonedParent = cloner.Clone(move.Parent);
+      var clonedBranch = cloner.Clone(move.NewBranch);
+
+      clonedParent.RemoveSubtree(move.SubtreeIndex);
+      clonedParent.InsertSubtree(move.SubtreeIndex, Scale(clonedBranch, alpha, beta));
 
       var problemData = ProblemDataParameter.ActualValue;
@@ -96,5 +103,5 @@
       var fitnessPartition = FitnessCalculationPartitionParameter.ActualValue;
       var rows = Enumerable.Range(fitnessPartition.Start, fitnessPartition.End - fitnessPartition.Start);
-      var quality = evaluator.Evaluate(childContext, move.Tree, problemData, rows);
+      var quality = evaluator.Evaluate(childContext, clonedTree, problemData, rows);
 
       MoveQualityParameter.ActualValue = new DoubleValue(quality);
Index: branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveMaker.cs
===================================================================
--- branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveMaker.cs	(revision 8206)
+++ branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMoveMaker.cs	(revision 8207)
@@ -74,4 +74,6 @@
 
       quality.Value = moveQuality.Value;
+      // update solution
+      SymbolicExpressionTreeParameter.ActualValue = move.Tree;
 
       return base.Apply();
Index: branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMultiMoveGenerator.cs
===================================================================
--- branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMultiMoveGenerator.cs	(revision 8206)
+++ branches/GP-MoveOperators/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ReplaceBranchMultiMoveGenerator.cs	(revision 8207)
@@ -112,4 +112,9 @@
       base.ClearState();
     }
+    public override void InitializeState() {
+      trees = null;
+      treeOutput = null;
+      base.InitializeState();
+    }
 
     public override IOperation Apply() {
@@ -149,5 +154,5 @@
       var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
       var ds = ProblemDataParameter.ActualValue.Dataset;
-      var rows = ProblemDataParameter.ActualValue.TrainingIndizes;
+      var rows = ProblemDataParameter.ActualValue.TrainingIndices;
 
       while (count < n) {
@@ -160,5 +165,5 @@
 
         var bestTrees = new SortedList<double, Tuple<ISymbolicExpressionTree, double[]>>();
-        double bestSimilarity = 0.0;
+        double bestSimilarity = 0;
         // iterate over the whole pool of branches for replacement
         for (int i = 0; i < trees.Count; i++) {
@@ -175,5 +180,6 @@
               bestTrees.Add(similarity, Tuple.Create(trees[i], treeOutput[i]));
               if (bestTrees.Count > 30)
-                bestTrees.RemoveAt(bestTrees.Count - 1);
+                bestTrees.RemoveAt(0); // remove moves with small R² at the beginning
+
             }
           }
@@ -206,5 +212,5 @@
       var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
       var ds = ProblemDataParameter.ActualValue.Dataset;
-      var rows = ProblemDataParameter.ActualValue.TrainingIndizes;
+      var rows = ProblemDataParameter.ActualValue.TrainingIndices;
       // create pool of random branches for replacement (no constants)
       // and evaluate the output
