Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10836)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10837)
@@ -58,6 +58,5 @@
         var vClone = new GenealogyGraphNode<T> { Content = clone, Rank = vChild.Rank - 0.5 };
         GenealogyGraph.AddVertex(vClone);
-        // adjust parent-child(clone) relationship in the graph
-        var parents = vChild.Parents;
+        var parents = vChild.Parents; // parents of child become parents of clone
         foreach (var p in parents) {
           foreach (var a in p.OutArcs.Where(a => a.Target == vChild)) {
@@ -66,8 +65,16 @@
           vClone.AddReverseArc(p);
         }
-        vClone.InArcs.Last().Data = vChild.InArcs.Last().Data;
-        vChild.InArcs = new List<IGenealogyGraphArc>();
+
+        vClone.InArcs.Last().Data = vChild.InArcs.Last().Data; // fragment of child becomes fragment of clone
+        vChild.InArcs = new List<IGenealogyGraphArc>(); // child will be connected to clone
         vChild.AddReverseArc(vClone);
         vClone.AddForwardArc(vChild);
+
+        // the following step in necessary because some mutation operators change values while the reference stays the same
+        // so we clone in order to prevent mutations to be "shadowed" in the parent
+        var parent = vClone.Parents.First();
+        parent.Content = (T)parent.Content.Clone();
+        GenealogyGraph[parent.Content] = parent;
+
       } else { // this needs to be checked
         var vChild = new GenealogyGraphNode<T> { Content = ChildParameter.ActualValue, Rank = Generations.Value };
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs	(revision 10836)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs	(revision 10837)
@@ -48,5 +48,21 @@
         var a = nodesAfter[i];
         var b = nodesBefore[i];
-        if (ReferenceEquals(a, b) && comparer.Equals(a, b)) continue;
+
+        bool found = false;
+        if (comparer.Equals(a, b)) {
+          int m = 0;
+          for (int j = 0; j < a.SubtreeCount; ++j) {
+            if (!AreSimilar(a.GetSubtree(j), b.GetSubtree(j), comparer)) { ++m; }
+            if (m > 1) {
+              found = true;
+              break;
+            }
+          }
+          if (m == 0) {
+            // everything is similar so we skip the whole subtree
+            i += a.GetLength();
+          }
+          if (!found) continue;
+        }
         fragment = new Fragment<ISymbolicExpressionTreeNode> {
           Root = a,
@@ -60,4 +76,9 @@
       return base.Apply();
     }
+
+    private bool AreSimilar(ISymbolicExpressionTreeNode a, ISymbolicExpressionTreeNode b, SymbolicExpressionTreeNodeSimilarityComparer comp) {
+      int length = a.GetLength();
+      return comparer.Equals(a, b) && length.Equals(b.GetLength()) && SymbolicExpressionTreeMatching.Match(a, b, comp) == length;
+    }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs	(revision 10836)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs	(revision 10837)
@@ -31,7 +31,7 @@
 
       var vChild = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[ChildParameter.ActualValue];
-      vChild.InArcs.First().Data = vChild.Content.IterateNodesPrefix().ToList();
+      var vClone = (IGenealogyGraphNode<ISymbolicExpressionTree>)vChild.InArcs.Last().Source;
+      vChild.InArcs.First().Data = vClone.Content.IterateNodesPrefix().ToList();
 
-      var vClone = (IGenealogyGraphNode<ISymbolicExpressionTree>)vChild.InArcs.Last().Source;
       var fragment = (IFragment<ISymbolicExpressionTreeNode>)vClone.InArcs.Last().Data;
       if (fragment != null) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs	(revision 10836)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs	(revision 10837)
@@ -36,5 +36,4 @@
             var arc = new GenealogyGraphArc { Source = parent, Target = fragmentNode };
             parent.AddForwardArc(arc);
-            //            fragmentNode.Content.Index1 = parent.Content.Index1;
           }
           yield return fragmentNode; // no tracing if there are no parents
@@ -62,5 +61,6 @@
           var fragmentNode = new FragmentNode {
             Content = new Fragment<ISymbolicExpressionTreeNode> { Root = subtree },
-            Rank = node.Rank
+            Rank = node.Rank,
+            Quality = node.Quality
           };
           if (parent != null) {
