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 10886)
+++ 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 10886)
+++ 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 10886)
+++ 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 10886)
+++ 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 10886)
+++ 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 10886)
+++ 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
       }
     }
