Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphChart.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphChart.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphChart.cs	(revision 10888)
@@ -208,4 +208,5 @@
 
         DrawLineage(visualNode, n => SimpleLineages ? n.IncomingArcs.Take(1) : n.IncomingArcs, a => a.Source);
+        ((SolidBrush)visualNode.Brush).Color = Color.Transparent;
         DrawLineage(visualNode, n => n.OutgoingArcs, a => a.Target);
       }
@@ -242,4 +243,33 @@
     }
 
+    public void HighlightHotPaths() {
+      Chart.UpdateEnabled = false;
+      ClearPrimitives();
+      var arcs = GenealogyGraph.Nodes.SelectMany(n => n.InArcs).ToList();
+      foreach (var arc in arcs) { arc.Weight = 1.0; } // reset weights
+      var rank = GenealogyGraph.Ranks.Keys.Max();
+      foreach (var ggn in GenealogyGraph.Ranks[rank]) {
+        foreach (var ancestor in ggn.Ancestors) {
+          foreach (var arc in ancestor.InArcs) {
+            arc.Weight++;
+          }
+        }
+      }
+      double max = arcs.Max(a => a.Weight);
+      double min = arcs.Min(a => a.Weight);
+
+      if (min.IsAlmost(max)) return;
+      //translate interval (min,max) to interval (0,255)
+      foreach (var arc in arcs) {
+        var vArc = GetMappedArc(arc.Source, arc.Target);
+        int colorIndex = (int)Math.Round((arc.Weight - min) * 255 / (max - min));
+        if (colorIndex > 254) colorIndex = 254;
+        vArc.Pen = new Pen(ColorGradient.Colors[colorIndex]);
+        //        vArc.Pen.Brush = new SolidBrush(ColorGradient.Colors[colorIndex]);
+      }
+      Chart.UpdateEnabled = true;
+      Chart.EnforceUpdate();
+    }
+
     void MarkSelectedNode() {
       var center = SelectedVisualNode.Center;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 10888)
@@ -113,5 +113,4 @@
     <Compile Include="VisualGenealogyGraphArc.cs" />
     <Compile Include="VisualGenealogyGraphNode.cs" />
-    <Compile Include="VisualGenealogyGraphTextLabel.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10888)
@@ -252,5 +252,5 @@
         for (int i = 0; i < population.Count; ++i) {
           var individual = population[i];
-          var vertex = new GenealogyGraphNode<T> { Content = individual, Rank = Generations.Value, };
+          var vertex = new GenealogyGraphNode<T> { Content = individual, Rank = Generations.Value };
           GenealogyGraph.AddVertex(vertex);
           // save the vertex id in the individual scope (so that we can identify graph indices)
@@ -258,29 +258,31 @@
         }
       } else {
-        // TODO: eliminate from the graph extra vertices added by the recombination operators when filling the pool of offspring with offspring selection
-
         var elite = population.FirstOrDefault(x => GenealogyGraph.Contains(x));
         if (elite != null) {
+          var prevVertex = (IGenealogyGraphNode<T>)GenealogyGraph[elite];
+          prevVertex.IsElite = true; // mark elites in the graph retroactively
+
+          var clone = (T)elite.Clone();
+
           var vertex = new GenealogyGraphNode<T> {
-            Content = (T)elite.Clone(),
+            Content = prevVertex.Content,
             Rank = Generations.Value,
-            IsElite = true
+            Quality = prevVertex.Quality,
+            IsElite = false
           };
+
+          GenealogyGraph.SetContent(prevVertex, clone);
+          // swap id
+          var id = prevVertex.Id;
+          GenealogyGraph.SetId(prevVertex, vertex.Id);
+
           // add new vertex to the graph
+          vertex.Id = id;
           GenealogyGraph.AddVertex(vertex);
-          // swap content between current vertex and previous vertex
-          var previousVertex = (IGenealogyGraphNode<T>)GenealogyGraph[elite];
-          var tmp = vertex.Content;
-          vertex.Content = previousVertex.Content;
-          previousVertex.Content = tmp;
-          // adjust graph content map
-          GenealogyGraph[vertex.Content] = vertex;
-          GenealogyGraph[previousVertex.Content] = previousVertex;
-          GenealogyGraph.AddArc(previousVertex, vertex); // connect current elite with previous elite
-          vertex.Id = previousVertex.Id; // another way would be to introduce the vertex.Id into the scope of the elite
-          vertex.Quality = previousVertex.Quality;
-
-          if (previousVertex.InArcs.Any()) {
-            vertex.InArcs.Last().Data = previousVertex.InArcs.Last().Data; // save the fragment in case there is one
+
+          GenealogyGraph.AddArc(prevVertex, vertex); // connect current elite with previous elite
+
+          if (prevVertex.InArcs.Any()) {
+            vertex.InArcs.Last().Data = prevVertex.InArcs.Last().Data; // save the fragment in case there is one
           }
         }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Arc.cs	(revision 10888)
@@ -54,4 +54,9 @@
     public Arc() { }
 
+    public Arc(IVertex source, IVertex target) {
+      Source = source;
+      Target = target;
+    }
+
     protected Arc(Arc original, Cloner cloner)
       : base(original, cloner) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10888)
@@ -32,4 +32,6 @@
   [StorableClass]
   public class DirectedGraph : Item, IDirectedGraph {
+    public bool AllowDuplicateContent { get; set; }
+
     [Storable]
     private readonly List<IVertex> nodes; // for performance reasons, maybe this should be a linked list (fast remove)
@@ -101,5 +103,5 @@
     }
     public virtual void AddVertex(IVertex vertex) {
-      if (contentMap.ContainsKey(vertex.Content)) {
+      if (!AllowDuplicateContent && contentMap.ContainsKey(vertex.Content)) {
         throw new Exception("Content already exists in the graph.");
       }
@@ -109,10 +111,32 @@
     }
 
+    public virtual IArc AddArc(IVertex source, IVertex target) {
+      var arc = new Arc(source, target);
+      source.AddForwardArc(arc);
+      target.AddReverseArc(arc);
+      return arc;
+    }
+
     public virtual void RemoveVertex(IVertex vertex) {
       nodes.Remove(vertex);
     }
+
     public override Image ItemImage {
       get { return Common.Resources.VSImageLibrary.Graph; }
     }
+
+    public void SetContent(IVertex vertex, object content) {
+      var oldContent = vertex.Content;
+      contentMap.Remove(oldContent);
+      vertex.Content = content;
+      contentMap[content] = vertex;
+    }
+
+    public void SetId(IVertex vertex, string id) {
+      var oldId = vertex.Id;
+      idMap.Remove(oldId);
+      vertex.Id = id;
+      idMap[id] = vertex;
+    }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IArc.cs	(revision 10888)
@@ -20,8 +20,17 @@
 #endregion
 
+
 namespace HeuristicLab.EvolutionTracking {
   public interface IArc {
     IVertex Source { get; set; }
     IVertex Target { get; set; }
+    string Label { get; set; }
+    double Weight { get; set; }
+    object Data { get; set; }
+  }
+
+  public interface IArc<T> : IArc where T : class,IVertex {
+    new T Source { get; set; }
+    new T Target { get; set; }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 10888)
@@ -30,4 +30,5 @@
     void Clear();
     void AddVertex(IVertex vertex);
+    IArc AddArc(IVertex source, IVertex target);
     void RemoveVertex(IVertex vertex);
     IEnumerable<IVertex> Nodes { get; }
@@ -35,4 +36,6 @@
     bool Contains(object content);
     IVertex GetVertex(string id);
+    void SetContent(IVertex vertex, object content);
+    void SetId(IVertex vertex, string id);
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10888)
@@ -25,7 +25,7 @@
 namespace HeuristicLab.EvolutionTracking {
   public interface IVertex : IItem {
-    string Id { get; }
-    IEnumerable<IArc> InArcs { get; set; }
-    IEnumerable<IArc> OutArcs { get; set; }
+    string Id { get; set; }
+    IEnumerable<IArc> InArcs { get; }
+    IEnumerable<IArc> OutArcs { get; }
 
     int InDegree { get; }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10888)
@@ -46,5 +46,4 @@
     public IEnumerable<IArc> InArcs {
       get { return inArcs ?? Enumerable.Empty<IArc>(); }
-      set { inArcs = value.ToList(); }
     }
     [Storable]
@@ -52,7 +51,5 @@
     public IEnumerable<IArc> OutArcs {
       get { return outArcs ?? Enumerable.Empty<IArc>(); }
-      set { outArcs = value.ToList(); }
     }
-
     [Storable]
     public object Content { get; set; }
@@ -69,6 +66,6 @@
       Id = Guid.NewGuid().ToString();
       Label = original.Label;
-      inArcs = new List<IArc>(original.InArcs);
-      outArcs = new List<IArc>(original.OutArcs);
+      inArcs = new List<IArc>(original.inArcs);
+      outArcs = new List<IArc>(original.outArcs);
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10888)
@@ -29,5 +29,5 @@
 namespace HeuristicLab.EvolutionTracking {
   [StorableClass]
-  [Item("GenealogyGraph", "")]
+  [Item("GenealogyGraph", "A class representing a genealogy graph")]
   public class GenealogyGraph : DirectedGraph, IGenealogyGraph {
     [Storable]
@@ -41,13 +41,7 @@
     }
 
-    public IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target) {
-      var arc = new GenealogyGraphArc(source, target);
-      source.AddForwardArc(arc);
-      target.AddReverseArc(arc);
-      return arc;
-    }
-
     protected GenealogyGraph(GenealogyGraph original, Cloner cloner)
       : base(original, cloner) {
+      Ranks = new Dictionary<double, List<IGenealogyGraphNode>>(original.Ranks);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -59,10 +53,18 @@
       Ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
     }
+
+    public override IArc AddArc(IVertex source, IVertex target) {
+      var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
+      source.AddForwardArc(arc);
+      target.AddReverseArc(arc);
+      return arc;
+    }
+
     public override void AddVertex(IVertex vertex) {
+      base.AddVertex(vertex);
       var node = (IGenealogyGraphNode)vertex;
       if (!Ranks.ContainsKey(node.Rank))
         Ranks[node.Rank] = new List<IGenealogyGraphNode>();
       Ranks[node.Rank].Add(node);
-      base.AddVertex(vertex);
     }
     public override void RemoveVertex(IVertex vertex) {
@@ -94,5 +96,5 @@
 
   [StorableClass]
-  [Item("GenealogyGraph", "")]
+  [Item("GenealogyGraph", "A class representing a genealogy graph")]
   public class GenealogyGraph<T> : DirectedGraph, IGenealogyGraph<T> where T : class, IItem {
     // members and properties
@@ -106,12 +108,4 @@
       get { return from n in base.Nodes select (IGenealogyGraphNode<T>)n; }
     }
-
-    public IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target) {
-      var arc = new GenealogyGraphArc(source, target);
-      source.AddForwardArc(arc);
-      target.AddReverseArc(arc);
-      return arc;
-    }
-
     // contructors
     protected GenealogyGraph(GenealogyGraph<T> original, Cloner cloner)
@@ -128,4 +122,5 @@
     // methods
     public override void AddVertex(IVertex vertex) {
+      base.AddVertex(vertex);
       var node = (IGenealogyGraphNode<T>)vertex;
       if (!Ranks.ContainsKey(node.Rank)) {
@@ -133,5 +128,4 @@
       }
       Ranks[node.Rank].Add(node);
-      base.AddVertex(vertex);
     }
     public override void RemoveVertex(IVertex vertex) {
@@ -142,9 +136,13 @@
       base.RemoveVertex(vertex);
     }
-
+    public override IArc AddArc(IVertex source, IVertex target) {
+      var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
+      source.AddForwardArc(arc);
+      target.AddReverseArc(arc);
+      return arc;
+    }
     IEnumerable<IGenealogyGraphNode> IGenealogyGraph.Nodes {
       get { return Nodes; }
     }
-
     public event EventHandler GraphUpdated;
     private void OnGraphUpdated(object sender, EventArgs args) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10888)
@@ -69,5 +69,5 @@
     protected GenealogyGraphArc(GenealogyGraphArc<T> original, Cloner cloner)
       : base(original, cloner) {
-      Data = (T)original.Data.Clone();
+      Data = (T)original.Data;
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10888)
@@ -42,10 +42,8 @@
 
     public new IEnumerable<IGenealogyGraphArc> InArcs {
-      get { return base.InArcs.Cast<IGenealogyGraphArc>().ToList(); }
-      set { base.InArcs = value; }
+      get { return base.InArcs.Cast<IGenealogyGraphArc>(); }
     }
     public new IEnumerable<IGenealogyGraphArc> OutArcs {
-      get { return base.OutArcs.Cast<IGenealogyGraphArc>().ToList(); }
-      set { base.InArcs = value; }
+      get { return base.OutArcs.Cast<IGenealogyGraphArc>(); }
     }
     public IEnumerable<IGenealogyGraphNode> Ancestors {
@@ -131,14 +129,14 @@
     }
     public new IEnumerable<IGenealogyGraphNode<T>> Parents {
-      get { return base.Parents.Select(p => (IGenealogyGraphNode<T>)p); }
+      get { return base.Parents.Cast<IGenealogyGraphNode<T>>(); }
     }
     public new IEnumerable<IGenealogyGraphNode<T>> Children {
-      get { return base.Children.Select(c => (IGenealogyGraphNode<T>)c); }
+      get { return base.Children.Cast<IGenealogyGraphNode<T>>(); }
     }
     public new IEnumerable<IGenealogyGraphNode<T>> Ancestors {
-      get { return base.Ancestors.Select(x => (IGenealogyGraphNode<T>)x); }
+      get { return base.Ancestors.Cast<IGenealogyGraphNode<T>>(); }
     }
     public new IEnumerable<IGenealogyGraphNode<T>> Descendants {
-      get { return base.Descendants.Select(x => (IGenealogyGraphNode<T>)x); }
+      get { return base.Descendants.Cast<IGenealogyGraphNode<T>>(); }
     }
   }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10888)
@@ -27,5 +27,4 @@
     Dictionary<double, List<IGenealogyGraphNode>> Ranks { get; }
     new IEnumerable<IGenealogyGraphNode> Nodes { get; }
-    IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target);
   }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphArc.cs	(revision 10888)
@@ -26,5 +26,4 @@
     new IGenealogyGraphNode Source { get; set; }
     new IGenealogyGraphNode Target { get; set; }
-    object Data { get; set; }
   }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10888)
@@ -33,6 +33,6 @@
     IEnumerable<IGenealogyGraphNode> Ancestors { get; }
     IEnumerable<IGenealogyGraphNode> Descendants { get; }
-    new IEnumerable<IGenealogyGraphArc> InArcs { get; set; }
-    new IEnumerable<IGenealogyGraphArc> OutArcs { get; set; }
+    new IEnumerable<IGenealogyGraphArc> InArcs { get; }
+    new IEnumerable<IGenealogyGraphArc> OutArcs { get; }
   }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10888)
@@ -43,4 +43,8 @@
     }
 
+    public IValueParameter<IntValue> ExecutionCountParameter {
+      get { return (IValueParameter<IntValue>)Parameters["ExecutionCount"]; }
+    }
+
     protected BeforeCrossoverOperator(BeforeCrossoverOperator<T> original, Cloner cloner)
       : base(original, cloner) {
@@ -53,4 +57,5 @@
       Parameters.Add(new ScopeTreeLookupParameter<T>(ParentsParameterName));
       Parameters.Add(new LookupParameter<T>(ChildParameterName));
+      Parameters.Add(new ValueParameter<IntValue>("ExecutionCount", new IntValue(0)));
     }
 
@@ -65,5 +70,6 @@
     private readonly Func<IScope, string> getScopeId = s => ((StringValue)s.Variables["Id"].Value).Value;
     public override IOperation Apply() {
-      if (CurrentGeneration == null) throw new Exception();
+      ExecutionCountParameter.Value.Value++;
+
       var subScopes = ExecutionContext.Scope.SubScopes;
       var parentVertices = subScopes.Select(x => (GenealogyGraphNode<T>)GenealogyGraph.GetVertex(getScopeId(x))).ToList();
@@ -75,7 +81,10 @@
         // 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
       };
+
       GenealogyGraph.AddVertex(childVertex);
+
       foreach (var parentVertex in parentVertices) {
         GenealogyGraph.AddArc(parentVertex, childVertex);
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10888)
@@ -20,5 +20,4 @@
 #endregion
 
-using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
@@ -50,15 +49,15 @@
 
     public override IOperation Apply() {
-      if (GenealogyGraph.Contains(ChildParameter.ActualValue)) {
+      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 child = ChildParameter.ActualValue;
-        var clone = (T)child.Clone();
-        var vChild = (IGenealogyGraphNode<T>)GenealogyGraph[child];
-        var vClone = new GenealogyGraphNode<T> { Content = clone, Rank = vChild.Rank - 0.5 };
+        var vClone = new GenealogyGraphNode<T> {
+          Content = (T)ChildParameter.ActualValue.Clone(),
+          Rank = vChild.Parents.Last().Rank + 0.5
+        };
         GenealogyGraph.AddVertex(vClone);
-        var parents = vChild.Parents; // parents of child become parents of clone
-        foreach (var p in parents) {
-          var arc = p.OutArcs.First(a => a.Target == vChild);
+
+        foreach (var arc in vChild.InArcs) {
           arc.Target = vClone;
           vClone.AddReverseArc(arc);
@@ -66,5 +65,4 @@
 
         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
         GenealogyGraph.AddArc(vClone, vChild);
 
@@ -75,7 +73,10 @@
         GenealogyGraph[parent.Content] = parent;
 
-      } else { // this needs to be checked
-        var vChild = new GenealogyGraphNode<T> { Content = ChildParameter.ActualValue, Rank = Generations.Value };
-        GenealogyGraph.AddVertex(vChild);
+      } 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);
       }
       return base.Apply();
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj	(revision 10888)
@@ -279,5 +279,7 @@
       <DependentUpon>SymboldDataAnalysisGenealogyView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Tracking\SymbolicDataAnalysisExpressionGenealogyGraphChart.cs" />
+    <Compile Include="Tracking\SymbolicDataAnalysisExpressionGenealogyGraphChart.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionGenealogyGraphChart.Designer.cs">
       <DependentUpon>SymbolicDataAnalysisExpressionGenealogyGraphChart.cs</DependentUpon>
@@ -366,5 +368,9 @@
     </Content>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <EmbeddedResource Include="Tracking\SymboldDataAnalysisGenealogyView.resx">
+      <DependentUpon>SymboldDataAnalysisGenealogyView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/FragmentGraphView.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/FragmentGraphView.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/FragmentGraphView.cs	(revision 10888)
@@ -33,5 +33,5 @@
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
   [View("FragmentGraphView")]
-  [Content(typeof(IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>>), IsDefaultView = true)]
+  [Content(typeof(FragmentGraph), IsDefaultView = true)]
   public sealed partial class FragmentGraphView : ItemView {
     private const int PreferredHorizontalSpacing = 10;
@@ -41,10 +41,10 @@
     private ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> symbolicExpressionEngine;
 
-    private Dictionary<IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>, TileLayoutNode> tileDictionary;
+    private Dictionary<FragmentNode, TileLayoutNode> tileDictionary;
 
     private SymbolicExpressionTreeTile Root { get; set; }
 
-    public new IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>> Content {
-      get { return (IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>>)base.Content; }
+    public new FragmentGraph Content {
+      get { return (FragmentGraph)base.Content; }
       set { base.Content = value; }
     }
@@ -63,5 +63,5 @@
         NodeHeight = 40
       };
-      tileDictionary = new Dictionary<IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>, TileLayoutNode>();
+      tileDictionary = new Dictionary<FragmentNode, TileLayoutNode>();
     }
 
@@ -70,15 +70,16 @@
       tileDictionary.Clear();
       foreach (var node in Content.Nodes) {
+        var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)node.Content;
         var tile = new SymbolicExpressionTreeTile(chart);
         tile.LayoutEngine = symbolicExpressionEngine;
-        tile.Label = "Generation " + node.Rank + Environment.NewLine +
-                     "Quality " + String.Format("{0:0.000}", node.Quality);
-        tile.Root = node.Content.Root;
+        tile.Label = "Generation " + node.Content.Rank + Environment.NewLine +
+                     "Quality " + String.Format("{0:0.000}", node.Content.Quality);
+        tile.Root = graphNode.Content.Root;
         var tileNode = new TileLayoutNode { Tile = tile };
         tileDictionary.Add(node, tileNode);
       }
-      foreach (var node in Content.Nodes.Where(n => n.Children.Any())) {
+      foreach (var node in Content.Nodes.Where(n => n.OutArcs.Any())) {
         var layoutNode = tileDictionary[node];
-        layoutNode.Children = new List<TileLayoutNode>(node.Children.Select(x => tileDictionary[x]));
+        layoutNode.Children = new List<TileLayoutNode>(node.OutArcs.Select(a => tileDictionary[(FragmentNode)a.Target]));
       }
     }
@@ -116,8 +117,8 @@
         var aSize = aTile.Size;
         var aPos = aTile.Position;
-
-        var fragment = node.Content;
-        if (fragment.Index1 > 0) {
-          var subtree = fragment.Root.NodeAt(fragment.Index1);
+        var graphNode = node.Content;
+
+        if (node.SubtreeIndex > 0) {
+          var subtree = graphNode.Content.Root.NodeAt(node.SubtreeIndex);
           foreach (var s in subtree.IterateNodesPrefix()) {
             var primitive = aTile.GetPrimitive(s);
@@ -130,6 +131,6 @@
           }
         }
-        if (fragment.Index2 > 0) {
-          var subtree = fragment.Root.NodeAt(fragment.Index2);
+        if (node.FragmentIndex > 0) {
+          var subtree = graphNode.Content.Root.NodeAt(node.FragmentIndex);
           foreach (var s in subtree.IterateNodesPrefix()) {
             var primitive = aTile.GetPrimitive(s);
@@ -143,16 +144,18 @@
         }
 
-        if (node.Parents.Any() && node == node.Parents.First().Children.First()) {
-          var parent = node.Parents.First();
-          var index = fragment.Index1 + (parent.Content.Index2 - parent.Content.Index1);
-          // some mutations create discontinuities which invalidate the index
-          if (index >= 0 && index < fragment.Root.GetLength()) {
-            var subtree = fragment.Root.NodeAt(index);
-            var primitive = aTile.GetPrimitive(subtree);
-            primitive.Brush = new SolidBrush(Color.LightCoral);
+        if (node.InArcs.Any()) {
+          var parent = (FragmentNode)node.InArcs.First().Source;
+          if (parent.OutArcs.First().Target == node) {
+            var index = node.SubtreeIndex + (parent.FragmentIndex - parent.SubtreeIndex);
+            // some mutations create discontinuities which invalidate the index
+            if (index >= 0 && index < graphNode.Content.Length) {
+              var subtree = graphNode.Content.NodeAt(index);
+              var primitive = aTile.GetPrimitive(subtree);
+              primitive.Brush = new SolidBrush(Color.LightCoral);
+            }
           }
         }
 
-        foreach (var child in node.Children) {
+        foreach (var child in node.OutArcs.Select(x => (FragmentNode)x.Target)) {
           var bTile = tileDictionary[child].Tile;
           var bSize = bTile.Size;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.Designer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.Designer.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.Designer.cs	(revision 10888)
@@ -51,17 +51,19 @@
       this.genealogyGraphChart = new HeuristicLab.Problems.DataAnalysis.Symbolic.Views.SymbolicDataAnalysisExpressionGenealogyGraphChart();
       this.symbolicExpressionTreeChart = new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.SymbolicExpressionTreeChart();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.simpleLineages_checkBox = new System.Windows.Forms.CheckBox();
+      this.lockGraph_checkBox = new System.Windows.Forms.CheckBox();
       this.trace_checkBox = new System.Windows.Forms.CheckBox();
-      this.lockGraph_checkBox = new System.Windows.Forms.CheckBox();
-      this.simpleLineages_checkBox = new System.Windows.Forms.CheckBox();
+      this.hotPaths_button = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
       this.splitContainer1.Panel1.SuspendLayout();
       this.splitContainer1.Panel2.SuspendLayout();
       this.splitContainer1.SuspendLayout();
+      this.groupBox1.SuspendLayout();
       this.SuspendLayout();
       // 
       // splitContainer1
       // 
-      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Bottom;
-      this.splitContainer1.Location = new System.Drawing.Point(0, 33);
+      this.splitContainer1.Location = new System.Drawing.Point(0, 57);
       this.splitContainer1.Name = "splitContainer1";
       // 
@@ -73,5 +75,5 @@
       // 
       this.splitContainer1.Panel2.Controls.Add(this.symbolicExpressionTreeChart);
-      this.splitContainer1.Size = new System.Drawing.Size(1247, 722);
+      this.splitContainer1.Size = new System.Drawing.Size(1247, 698);
       this.splitContainer1.SplitterDistance = 607;
       this.splitContainer1.TabIndex = 0;
@@ -87,5 +89,5 @@
       this.genealogyGraphChart.ScaleOnResize = true;
       this.genealogyGraphChart.SimpleLineages = false;
-      this.genealogyGraphChart.Size = new System.Drawing.Size(607, 722);
+      this.genealogyGraphChart.Size = new System.Drawing.Size(607, 698);
       this.genealogyGraphChart.TabIndex = 0;
       this.genealogyGraphChart.TraceFragments = false;
@@ -98,43 +100,66 @@
       this.symbolicExpressionTreeChart.Location = new System.Drawing.Point(0, 0);
       this.symbolicExpressionTreeChart.Name = "symbolicExpressionTreeChart";
-      this.symbolicExpressionTreeChart.Size = new System.Drawing.Size(636, 722);
+      this.symbolicExpressionTreeChart.Size = new System.Drawing.Size(636, 698);
       this.symbolicExpressionTreeChart.Spacing = 5;
       this.symbolicExpressionTreeChart.SuspendRepaint = false;
       this.symbolicExpressionTreeChart.TabIndex = 0;
-      this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font(FontFamily.GenericSansSerif, 10);
+      this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font("Microsoft Sans Serif", 10F);
       this.symbolicExpressionTreeChart.Tree = null;
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.hotPaths_button);
+      this.groupBox1.Controls.Add(this.simpleLineages_checkBox);
+      this.groupBox1.Controls.Add(this.lockGraph_checkBox);
+      this.groupBox1.Controls.Add(this.trace_checkBox);
+      this.groupBox1.Location = new System.Drawing.Point(3, 3);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(1195, 48);
+      this.groupBox1.TabIndex = 4;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Controls";
+      // 
+      // simpleLineages_checkBox
+      // 
+      this.simpleLineages_checkBox.AutoSize = true;
+      this.simpleLineages_checkBox.Location = new System.Drawing.Point(94, 19);
+      this.simpleLineages_checkBox.Name = "simpleLineages_checkBox";
+      this.simpleLineages_checkBox.Size = new System.Drawing.Size(103, 17);
+      this.simpleLineages_checkBox.TabIndex = 6;
+      this.simpleLineages_checkBox.Text = "Simple Lineages";
+      this.simpleLineages_checkBox.UseVisualStyleBackColor = true;
+      this.simpleLineages_checkBox.CheckedChanged += new System.EventHandler(this.simpleLineages_checkBox_CheckedChanged);
+      // 
+      // lockGraph_checkBox
+      // 
+      this.lockGraph_checkBox.AutoSize = true;
+      this.lockGraph_checkBox.Location = new System.Drawing.Point(6, 19);
+      this.lockGraph_checkBox.Name = "lockGraph_checkBox";
+      this.lockGraph_checkBox.Size = new System.Drawing.Size(82, 17);
+      this.lockGraph_checkBox.TabIndex = 5;
+      this.lockGraph_checkBox.Text = "Lock Graph";
+      this.lockGraph_checkBox.UseVisualStyleBackColor = true;
+      this.lockGraph_checkBox.CheckedChanged += new System.EventHandler(this.lockGraph_checkBox_CheckedChanged);
       // 
       // trace_checkBox
       // 
       this.trace_checkBox.AutoSize = true;
-      this.trace_checkBox.Location = new System.Drawing.Point(611, 10);
+      this.trace_checkBox.Location = new System.Drawing.Point(203, 19);
       this.trace_checkBox.Name = "trace_checkBox";
       this.trace_checkBox.Size = new System.Drawing.Size(54, 17);
-      this.trace_checkBox.TabIndex = 1;
+      this.trace_checkBox.TabIndex = 4;
       this.trace_checkBox.Text = "Trace";
       this.trace_checkBox.UseVisualStyleBackColor = true;
       this.trace_checkBox.CheckedChanged += new System.EventHandler(this.trace_checkBox_CheckedChanged);
       // 
-      // lockGraph_checkBox
+      // hotPaths_button
       // 
-      this.lockGraph_checkBox.AutoSize = true;
-      this.lockGraph_checkBox.Location = new System.Drawing.Point(4, 10);
-      this.lockGraph_checkBox.Name = "lockGraph_checkBox";
-      this.lockGraph_checkBox.Size = new System.Drawing.Size(82, 17);
-      this.lockGraph_checkBox.TabIndex = 2;
-      this.lockGraph_checkBox.Text = "Lock Graph";
-      this.lockGraph_checkBox.UseVisualStyleBackColor = true;
-      this.lockGraph_checkBox.CheckedChanged += new System.EventHandler(this.lockGraph_checkBox_CheckedChanged);
-      // 
-      // simpleLineages_checkBox
-      // 
-      this.simpleLineages_checkBox.AutoSize = true;
-      this.simpleLineages_checkBox.Location = new System.Drawing.Point(91, 10);
-      this.simpleLineages_checkBox.Name = "simpleLineages_checkBox";
-      this.simpleLineages_checkBox.Size = new System.Drawing.Size(103, 17);
-      this.simpleLineages_checkBox.TabIndex = 3;
-      this.simpleLineages_checkBox.Text = "Simple Lineages";
-      this.simpleLineages_checkBox.UseVisualStyleBackColor = true;
-      this.simpleLineages_checkBox.CheckedChanged += new System.EventHandler(this.simpleLineages_checkBox_CheckedChanged);
+      this.hotPaths_button.Location = new System.Drawing.Point(263, 15);
+      this.hotPaths_button.Name = "hotPaths_button";
+      this.hotPaths_button.Size = new System.Drawing.Size(75, 23);
+      this.hotPaths_button.TabIndex = 7;
+      this.hotPaths_button.Text = "Hot paths";
+      this.hotPaths_button.UseVisualStyleBackColor = true;
+      this.hotPaths_button.Click += new System.EventHandler(this.hotPaths_button_Click);
       // 
       // SymboldDataAnalysisGenealogyView
@@ -142,7 +167,5 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.simpleLineages_checkBox);
-      this.Controls.Add(this.lockGraph_checkBox);
-      this.Controls.Add(this.trace_checkBox);
+      this.Controls.Add(this.groupBox1);
       this.Controls.Add(this.splitContainer1);
       this.Name = "SymboldDataAnalysisGenealogyView";
@@ -152,6 +175,7 @@
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
       this.splitContainer1.ResumeLayout(false);
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -162,7 +186,9 @@
     private SymbolicDataAnalysisExpressionGenealogyGraphChart genealogyGraphChart;
     private Encodings.SymbolicExpressionTreeEncoding.Views.SymbolicExpressionTreeChart symbolicExpressionTreeChart;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.CheckBox simpleLineages_checkBox;
+    private System.Windows.Forms.CheckBox lockGraph_checkBox;
     private System.Windows.Forms.CheckBox trace_checkBox;
-    private System.Windows.Forms.CheckBox lockGraph_checkBox;
-    private System.Windows.Forms.CheckBox simpleLineages_checkBox;
+    private System.Windows.Forms.Button hotPaths_button;
 
   }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymboldDataAnalysisGenealogyView.cs	(revision 10888)
@@ -30,5 +30,4 @@
 using HeuristicLab.EvolutionTracking.Views;
 using HeuristicLab.MainForm;
-
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
@@ -161,4 +160,8 @@
     }
     #endregion
+
+    private void hotPaths_button_Click(object sender, System.EventArgs e) {
+      genealogyGraphChart.HighlightHotPaths();
+    }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 10888)
@@ -300,4 +300,5 @@
     <Compile Include="Symbols\VariableConditionTreeNode.cs" />
     <Compile Include="Symbols\VariableTreeNode.cs" />
+    <Compile Include="Tracking\FragmentGraph\FragmentGraph.cs" />
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs" />
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionBeforeCrossoverOperator.cs" />
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs	(revision 10888)
@@ -32,5 +32,5 @@
     [Storable]
     public Dictionary<int, List<SymbolNode>> Levels { get { return levels; } }
-    private Dictionary<int, List<SymbolNode>> levels = new Dictionary<int, List<SymbolNode>>();
+    private readonly Dictionary<int, List<SymbolNode>> levels = new Dictionary<int, List<SymbolNode>>();
 
     public void AddNode(SymbolNode node, int level) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs	(revision 10888)
@@ -73,5 +73,5 @@
     public IVertex Target { get; set; }
     public double Weight { get; set; }
-
+    public string Label { get; set; }
     public object Data { get; set; }
   }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeCrossoverOperator.cs	(revision 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeCrossoverOperator.cs	(revision 10888)
@@ -37,10 +37,4 @@
       }
 
-      //      var parentVertices = childVertex.Parents.ToList();
-      //
-      //      if (parents[0].Length != parentVertices[0].Content.Length || parents[1].Length != parentVertices[1].Content.Length) {
-      //        throw new Exception("Inconsistency detected in GenealogyGraph.");
-      //      }
-
       return result;
     }
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 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs	(revision 10888)
@@ -31,5 +31,5 @@
 
       var vChild = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[ChildParameter.ActualValue];
-      var vClone = (IGenealogyGraphNode<ISymbolicExpressionTree>)vChild.InArcs.Last().Source;
+      var vClone = vChild.Parents.Last();
       vChild.InArcs.First().Data = vClone.Content.IterateNodesPrefix().ToList();
 
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 10887)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs	(revision 10888)
@@ -26,12 +26,9 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.EvolutionTracking;
-using FragmentNode = HeuristicLab.EvolutionTracking.GenealogyGraphNode<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
-using IFragmentNode = HeuristicLab.EvolutionTracking.IGenealogyGraphNode<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
-using IGraphNode = HeuristicLab.EvolutionTracking.IGenealogyGraphNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
   public static class SymbolicDataAnalysisExpressionTracing {
-    public static IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>> TraceSubtree(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex) {
-      var graph = new GenealogyGraph<IFragment<ISymbolicExpressionTreeNode>>();
+    public static FragmentGraph TraceSubtree(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex) {
+      var graph = new FragmentGraph { AllowDuplicateContent = true };
       var nodes = Trace(graphNode, subtreeIndex);
       foreach (var n in nodes) {
@@ -40,6 +37,12 @@
       return graph;
     }
-
-    private static IEnumerable<IFragmentNode> Trace(IGraphNode graphNode, int subtreeIndex, FragmentNode parentNode = null) {
+    /// <summary>
+    /// Traces a subtree in a genealogy of individuals, tracking down it's genetic components
+    /// </summary>
+    /// <param name="graphNode">The point in the genealogy where to start the tracing from</param>
+    /// <param name="subtreeIndex">The traced subtree preorder index in the current tree</param>
+    /// <param name="parentNode">The parent node in the fragment graph if there is any</param>
+    /// <returns></returns>
+    private static IEnumerable<FragmentNode> Trace(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex, FragmentNode parentNode = null) {
       var node = graphNode; // current node
       var index = subtreeIndex; // current index
@@ -49,14 +52,9 @@
         if (!node.Parents.Any()) {
           var fragmentNode = new FragmentNode {
-            Content = new Fragment<ISymbolicExpressionTreeNode> {
-              Root = node.Content.Root,
-              //              Root = node.Content.NodeAt(index)
-              Index1 = index
-            },
-            Rank = node.Rank,
-            Quality = node.Quality
+            Content = node,
+            SubtreeIndex = index,
           };
           if (parent != null) {
-            var arc = new GenealogyGraphArc(parent, fragmentNode);
+            var arc = new Arc(parent, fragmentNode);
             parent.AddForwardArc(arc);
             fragmentNode.AddReverseArc(arc);
@@ -78,27 +76,43 @@
         var subtreeLength = subtree.GetLength();
 
+        #region mutation tracing
         if (parents.Count == 1) {
           // we are tracing a mutation operation
           var fragmentNode = new FragmentNode {
-            Content = new Fragment<ISymbolicExpressionTreeNode> {
-              Root = tree.Root,
-              //              Root = subtree
-              Index1 = index,
-              Index2 = fragment.Index1
-            },
-            Rank = node.Rank,
-            Quality = node.Quality
+            Content = node,
+            SubtreeIndex = index,
+            FragmentIndex = fragment.Index1
           };
           if (parent != null) {
-            var arc = new GenealogyGraphArc(parent, fragmentNode);
+            var arc = new Arc(parent, fragmentNode);
             parent.AddForwardArc(arc);
             fragmentNode.AddReverseArc(arc);
           }
+          node = parents[0];
+          if (subtreeIndex == fragment.Index1) {
+            // index stays the same
+          } else if (fragment.Index1 < subtreeIndex) {
+            if (subtreeIndex < fragment.Index1 + fragmentLength) {
+              // subtree contained in fragment, index stays the same
+            } else {
+              index += node.Content.NodeAt(fragment.Index1).GetLength() - fragmentLength;
+            }
+          } else if (subtreeIndex < fragment.Index1) {
+            if (fragment.Index1 < subtreeIndex + subtreeLength) {
+              // subtree contains fragment
+              index = fragment.Index1;
+            } else {
+              // index stays the same
+            }
+          }
+
           yield return fragmentNode;
-          var up = Trace(parents[0], fragment.Index1, fragmentNode);
+          var up = Trace(node, index, fragmentNode);
           foreach (var v in up) { yield return v; }
           break;
         }
+        #endregion
 
+        #region crossover tracing
         if (parents.Count == 2) {
           // we are tracing a crossover operation
@@ -125,18 +139,13 @@
               // subtree contains fragment => bifurcation point in the fragment graph
               var fragmentNode = new FragmentNode {
-                Content = new Fragment<ISymbolicExpressionTreeNode> {
-                  Root = tree.Root,
-                  Index1 = index,
-                  Index2 = fragment.Index1
-                },
-                Rank = node.Rank,
-                Quality = node.Quality
+                Content = node,
+                SubtreeIndex = index,
+                FragmentIndex = fragment.Index1
               };
               if (parent != null) {
-                var arc = new GenealogyGraphArc(parent, fragmentNode);
+                var arc = new Arc(parent, fragmentNode);
                 parent.AddForwardArc(arc);
                 fragmentNode.AddReverseArc(arc);
               }
-              //              fragmentNode.Content.Index1 = fragment.Index1 - index;
               yield return fragmentNode;
 
@@ -154,4 +163,5 @@
           }
         }
+        #endregion
       }
     }
