Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 11857)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 11858)
@@ -60,9 +60,9 @@
 
     public IEnumerable<IGenealogyGraphNode> Parents {
-      get { return InArcs.Select(a => a.Source); }
+      get { return base.InArcs.Select(x => (IGenealogyGraphNode)x.Source); }
     }
 
     public IEnumerable<IGenealogyGraphNode> Children {
-      get { return OutArcs.Select(a => a.Target); }
+      get { return base.OutArcs.Select(x => (IGenealogyGraphNode)x.Target); }
     }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 11857)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 11858)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.EvolutionTracking {
   [StorableClass]
-  [Item("AfterCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
+  [Item("BeforeCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
   public class BeforeCrossoverOperator<T> : EvolutionTrackingOperator<T>, ICrossoverOperator<T> where T : class,IItem {
     private const string ParentsParameterName = "Parents";
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11857)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11858)
@@ -53,20 +53,20 @@
     public override IOperation Apply() {
       // since mutation always takes place after crossover, the vertex for the current child is already in the tree
-      var childVertex = GenealogyGraph.GetByContent(ChildParameter.ActualValue);
-      var clonedVertex = (IGenealogyGraphNode<T>)childVertex.Clone();
-      clonedVertex.Rank = childVertex.Rank - 0.5;
-      GenealogyGraph.AddVertex(clonedVertex);
+      var vChild = GenealogyGraph.GetByContent(ChildParameter.ActualValue);
+      var vClone = (IGenealogyGraphNode<T>)vChild.Clone();
+      vClone.Rank = vChild.Rank - 0.5;
+      GenealogyGraph.AddVertex(vClone);
 
-      var arcs = childVertex.InArcs.ToList();
+      var arcs = vChild.InArcs.ToList();
       foreach (var arc in arcs) {
         var p = arc.Source;
         GenealogyGraph.RemoveArc(arc);
-        GenealogyGraph.AddArc(new GenealogyGraphArc(p, clonedVertex));
+        GenealogyGraph.AddArc(new GenealogyGraphArc(p, vClone));
       }
       // by convention, the arc connecting child with parent (non-root parent in case of crossover)
       // holds fragment data when applicable. the following line of code preserves this data 
       // the graph arcs are now connecting parent (rank n) --> clone (rank n+0.5) --> child (rank n+1)
-      clonedVertex.InArcs.Last().Data = arcs.Last().Data;
-      GenealogyGraph.AddArc(new GenealogyGraphArc(clonedVertex, childVertex));
+      vClone.InArcs.Last().Data = arcs.Last().Data;
+      GenealogyGraph.AddArc(new GenealogyGraphArc(vClone, vChild));
 
       return base.Apply();
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 11857)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 11858)
@@ -326,5 +326,4 @@
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs" />
     <Compile Include="Tracking\SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs" />
-    <Compile Include="Tracking\SymbolicDataAnalysisExpressionTracing.cs" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/TraceCalculator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/TraceCalculator.cs	(revision 11857)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/TraceCalculator.cs	(revision 11858)
@@ -100,10 +100,10 @@
       while (g.Parents.Any()) {
         Debug.Assert(si < g.Data.Length);
-        var parents = g.Parents.ToList();
-        var fragment = (IFragment<ISymbolicExpressionTreeNode>)g.InArcs.Last().Data;
+        var inArcs = (List<IArc>)((IVertex)g).InArcs;
+        var fragment = (IFragment<ISymbolicExpressionTreeNode>)inArcs.Last().Data;
         if (fragment == null) {
           // TODO: think about what the correct behavior should be here (seems good so far)
           // the node is either an elite node or (in rare cases) no fragment was transferred
-          g = parents[0];
+          g = (IGenealogyGraphNode<ISymbolicExpressionTree>)inArcs[0].Source;
           continue;
         }
@@ -114,7 +114,9 @@
 
         #region trace crossover
-        if (parents.Count == 2) {
+        if (inArcs.Count == 2) {
+          var parent0 = (IGenealogyGraphNode<ISymbolicExpressionTree>)inArcs[0].Source;
+          var parent1 = (IGenealogyGraphNode<ISymbolicExpressionTree>)inArcs[1].Source;
           if (fi == si) {
-            g = parents[1];
+            g = parent1;
             si = fragment.Index2;
             continue;
@@ -123,9 +125,9 @@
             if (fi + fl > si) {
               // fragment contains subtree
-              g = parents[1];
+              g = parent1;
               si += fragment.Index2 - fi;
             } else {
               // fragment distinct from subtree
-              g = parents[0];
+              g = parent0;
               si += NodeAt(g.Data, fi).GetLength() - fl;
             }
@@ -136,10 +138,10 @@
               // subtree contains fragment => branching point in the fragment graph
               var n = GetTraceNode(g, si, fi);
-              TraceRecursive(parents[0], si, n);
-              TraceRecursive(parents[1], fragment.Index2, n);
+              TraceRecursive(parent0, si, n);
+              TraceRecursive(parent1, fragment.Index2, n);
               break;
             } else {
               // subtree and fragment are distinct. 
-              g = parents[0];
+              g = parent0;
               continue;
             }
@@ -150,5 +152,6 @@
         // mutation is handled in a simple way: we branch every time there is an overlap between the subtree and the fragment
         // (since mutation effects can be quite unpredictable: replace branch, change node, shake tree, etc)
-        if (parents.Count == 1) {
+        if (inArcs.Count == 1) {
+          var parent0 = (IGenealogyGraphNode<ISymbolicExpressionTree>)inArcs[0].Source;
           Debug.Assert(fragment.Index1 == fragment.Index2);
           // check if the subtree and the fragment overlap => branch out
@@ -156,9 +159,9 @@
             var n = GetTraceNode(g, si, fi);
             int i = si < fi ? si : fi;
-            TraceRecursive(parents[0], i, n);
+            TraceRecursive(parent0, i, n);
             break;
           } else {
             // if they don't overlap, go up
-            g = parents[0];
+            g = parent0;
             if (fi < si)
               si += NodeAt(g.Data, fi).GetLength() - fl;
@@ -212,5 +215,6 @@
     /// <param name="last">The last added node in the trace graph</param>
     private void ConnectLast(IGenealogyGraphNode<ISymbolicExpressionTree> g, int si, IGenealogyGraphNode<ISymbolicExpressionTree> last) {
-      IFragment<ISymbolicExpressionTreeNode> fragment = g.Parents.Any() ? (IFragment<ISymbolicExpressionTreeNode>)g.InArcs.Last().Data : null;
+      var inArcs = (List<IArc>)((IVertex)g).InArcs;
+      var fragment = g.Parents.Any() ? (IFragment<ISymbolicExpressionTreeNode>)inArcs.Last().Data : null;
       int fi = fragment == null ? 0 : fragment.Index1; // fragment index
       var n = GetTraceNode(g, si, fi); // will append n to the trace graph if it does not exist
