Index: anches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/VisualGenealogyGraphTextLabel.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/VisualGenealogyGraphTextLabel.cs	(revision 10889)
+++ 	(revision )
@@ -1,44 +1,0 @@
-﻿using System.Drawing;
-using HeuristicLab.Visualization;
-using Rectangle = HeuristicLab.Visualization.Rectangle;
-
-namespace HeuristicLab.EvolutionTracking.Views {
-  public class VisualGenealogyGraphTextLabel : Rectangle {
-    //    private string text;
-    //    public string Text { get { return text; } set { text = value; } }
-    //
-    //    private Font font;
-    //    public Font Font { get { return font; } set { font = value; } }
-
-    private Brush fontBrush;
-    public Brush FontBrush { get { return fontBrush; } set { fontBrush = value; } }
-
-    public VisualGenealogyGraphTextLabel(IChart chart, PointD lowerLeft, PointD upperRight)
-      : base(chart, lowerLeft, upperRight) {
-    }
-    public VisualGenealogyGraphTextLabel(IChart chart, double x1, double y1, double x2, double y2)
-      : this(chart, new PointD(x1, y1), new PointD(x2, y2)) {
-    }
-    public VisualGenealogyGraphTextLabel(IChart chart, PointD lowerLeft, PointD upperRight, Pen pen, Brush brush)
-      : base(chart, lowerLeft, upperRight, pen, brush) {
-    }
-    public VisualGenealogyGraphTextLabel(IChart chart, double x1, double y1, double x2, double y2, Pen pen, Brush brush)
-      : this(chart, new PointD(x1, y1), new PointD(x2, y2), pen, brush) {
-    }
-
-    public override void Draw(Graphics graphics) {
-      Point p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
-      Size s = Chart.TransformWorldToPixel(Size);
-
-      float fontSize = s.Height;
-      var font = new Font(Font.Name, fontSize, Font.Style, GraphicsUnit.Pixel);
-      graphics.DrawString(Text, font, fontBrush, p.X, p.Y);
-    }
-
-    protected override void OnUpdate() {
-      if ((UpdateEnabled)) {
-        base.OnUpdate();
-      }
-    }
-  }
-}
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10890)
@@ -46,4 +46,5 @@
     public IEnumerable<IArc> InArcs {
       get { return inArcs ?? Enumerable.Empty<IArc>(); }
+      set { inArcs = value.ToList(); }
     }
     [Storable]
@@ -51,4 +52,5 @@
     public IEnumerable<IArc> OutArcs {
       get { return outArcs ?? Enumerable.Empty<IArc>(); }
+      set { outArcs = value.ToList(); }
     }
     [Storable]
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10890)
@@ -43,7 +43,9 @@
     public new IEnumerable<IGenealogyGraphArc> InArcs {
       get { return base.InArcs.Cast<IGenealogyGraphArc>(); }
+      set { base.InArcs = value; }
     }
     public new IEnumerable<IGenealogyGraphArc> OutArcs {
       get { return base.OutArcs.Cast<IGenealogyGraphArc>(); }
+      set { base.OutArcs = value; }
     }
     public IEnumerable<IGenealogyGraphNode> Ancestors {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10890)
@@ -33,6 +33,6 @@
     IEnumerable<IGenealogyGraphNode> Ancestors { get; }
     IEnumerable<IGenealogyGraphNode> Descendants { get; }
-    new IEnumerable<IGenealogyGraphArc> InArcs { get; }
-    new IEnumerable<IGenealogyGraphArc> OutArcs { get; }
+    new IEnumerable<IGenealogyGraphArc> InArcs { get; set; }
+    new IEnumerable<IGenealogyGraphArc> OutArcs { get; set; }
   }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10890)
@@ -81,5 +81,4 @@
         // but the first parent is actually the future child so we use this
         Content = parents[0],
-        //        Rank = Generations.Value + 1
         Rank = parentVertices[0].Rank + 1
       };
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10890)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Linq;
 using HeuristicLab.Common;
@@ -49,35 +50,27 @@
 
     public override IOperation Apply() {
-      var vChild = (IGenealogyGraphNode<T>)GenealogyGraph[ChildParameter.ActualValue];
-      if (vChild.Rank.IsAlmost(Generations.Value + 1)) {
-        // if the graph already contains a vertex representing the child, it means that the child is a product of crossover
-        // when mutation follows after crossover, some changes need to be made to the graph to maintain consistency
-        var vClone = new GenealogyGraphNode<T> {
-          Content = (T)ChildParameter.ActualValue.Clone(),
-          Rank = vChild.Parents.Last().Rank + 0.5
-        };
-        GenealogyGraph.AddVertex(vClone);
+      // since mutation always takes place after crossover, the vertex for the current child is already in the tree
+      var v = (IGenealogyGraphNode<T>)GenealogyGraph[ChildParameter.ActualValue];
 
-        foreach (var arc in vChild.InArcs) {
-          arc.Target = vClone;
-          vClone.AddReverseArc(arc);
-        }
+      if (!v.Rank.IsAlmost(Generations.Value + 1)) {
+        throw new Exception("Child rank should be generations.value + 1");
+      }
+      var clone = (T)ChildParameter.ActualValue.Clone();
 
-        vClone.InArcs.Last().Data = vChild.InArcs.Last().Data; // fragment of child becomes fragment of clone
-        GenealogyGraph.AddArc(vClone, vChild);
+      var c = new GenealogyGraphNode<T> {
+        Rank = v.Rank - 0.5,
+        Content = clone
+      };
 
-        // 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;
+      foreach (var a in v.InArcs) {
+        a.Target = c;
+        c.AddReverseArc(a);
+      }
 
-      } else if (vChild.Rank.IsAlmost(Generations.Value)) {
-        var clone = (T)ChildParameter.ActualValue.Clone();
-        GenealogyGraph.SetContent(vChild, clone);
-        var xx = new GenealogyGraphNode<T> { Content = ChildParameter.ActualValue, Rank = Generations.Value + 1 };
-        GenealogyGraph.AddVertex(xx);
-        GenealogyGraph.AddArc(vChild, xx);
-      }
+      v.InArcs = Enumerable.Empty<IGenealogyGraphArc>();
+
+      GenealogyGraph.AddVertex(c);
+      GenealogyGraph.AddArc(c, v);
+
       return base.Apply();
     }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs	(revision 10889)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs	(revision 10890)
@@ -30,10 +30,9 @@
   public class SymbolicDataAnalysisExpressionAfterCrossoverOperator : AfterCrossoverOperator<ISymbolicExpressionTree> {
     public override IOperation Apply() {
-      var child = ChildParameter.ActualValue;
-      var childVertex = (IGenealogyGraphNode)GenealogyGraph[child];
+      var childVertex = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[ChildParameter.ActualValue];
       var arcs = childVertex.InArcs.ToList();
       var nodes0 = (List<ISymbolicExpressionTreeNode>)arcs[0].Data;
       var nodes1 = (List<ISymbolicExpressionTreeNode>)arcs[1].Data;
-      var childNodes = child.IterateNodesPrefix().ToList();
+      var childNodes = childVertex.Content.IterateNodesPrefix().ToList();
       IFragment<ISymbolicExpressionTreeNode> fragment = null;
       for (int i = 0; i < Math.Min(nodes0.Count, childNodes.Count); ++i) {
