Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs	(revision 10677)
@@ -58,21 +58,23 @@
     }
     public ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> LayoutEngine { get; set; }
-    private Dictionary<IPrimitive, ISymbolicExpressionTreeNode> primitiveMap;
+    private readonly Dictionary<IPrimitive, ISymbolicExpressionTreeNode> primitiveMap;
 
     public SymbolicExpressionTreeTile(IChart chart)
       : base(chart) {
       primitiveMap = new Dictionary<IPrimitive, ISymbolicExpressionTreeNode>();
+
+      Group = new Group(chart);
     }
     public SymbolicExpressionTreeTile(IChart chart, ISymbolicExpressionTree tree)
       : this(chart) {
-      SymbolicExpressionTree = tree;
       PreferredNodeWidth = 80;
       PreferredNodeHeight = 40;
+      SymbolicExpressionTree = tree;
     }
     private void GeneratePrimitives(double preferredNodeWidth, double preferredNodeHeight) {
       Clear();
-      ISymbolicExpressionTreeNode root = Root;
-      if (root.Symbol is ProgramRootSymbol && root.SubtreeCount == 1) { root = root.GetSubtree(0); }
-      var visualNodes = LayoutEngine.CalculateLayout(root);
+      var actualRoot = Root;
+      if (Root.Symbol is ProgramRootSymbol && Root.SubtreeCount == 1) { actualRoot = Root.GetSubtree(0); }
+      var visualNodes = LayoutEngine.CalculateLayout(actualRoot);
 
       var font = new Font(FontFamily.GenericSansSerif, 10, GraphicsUnit.Pixel);
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10677)
@@ -230,6 +230,8 @@
           previousVertex.AddForwardArc(vertex);
           vertex.AddReverseArc(previousVertex);
-          vertex.InArcs.Last().Data = previousVertex.InArcs.Last().Data; // save the fragment in case there is one
-          vertex.Id = previousVertex.Id;
+          vertex.Id = previousVertex.Id; // another way would be to introduce the vertex.Id into the scope of the elite
+          if (previousVertex.InArcs.Any()) {
+            vertex.InArcs.Last().Data = previousVertex.InArcs.Last().Data; // save the fragment in case there is one
+          }
         }
       }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/DirectedGraph.cs	(revision 10677)
@@ -77,4 +77,5 @@
     public virtual void Clear() {
       nodes.Clear();
+      contentMap.Clear();
     }
     public virtual void AddVertex(IVertex vertex) {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10677)
@@ -26,6 +26,6 @@
   public interface IVertex : IItem {
     string Id { get; }
-    List<IArc> InArcs { get; }
-    List<IArc> OutArcs { get; }
+    IEnumerable<IArc> InArcs { get; set; }
+    IEnumerable<IArc> OutArcs { get; set; }
 
     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 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10677)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -43,8 +44,14 @@
     [Storable]
     private List<IArc> inArcs;
-    public List<IArc> InArcs { get { return inArcs; } protected set { inArcs = value; } }
+    public IEnumerable<IArc> InArcs {
+      get { return inArcs ?? Enumerable.Empty<IArc>(); }
+      set { inArcs = value.ToList(); }
+    }
     [Storable]
     private List<IArc> outArcs;
-    public List<IArc> OutArcs { get { return outArcs; } protected set { outArcs = value; } }
+    public IEnumerable<IArc> OutArcs {
+      get { return outArcs ?? Enumerable.Empty<IArc>(); }
+      set { outArcs = value.ToList(); }
+    }
 
     [StorableConstructor]
@@ -61,6 +68,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);
     }
 
@@ -81,28 +88,27 @@
     public void AddForwardArc(IVertex target, double w = 0.0, object data = null) {
       var arc = new Arc { Source = this, Target = target, Data = data, Weight = w };
-      if (OutArcs == null) OutArcs = new List<IArc> { arc };
-      else OutArcs.Add(arc);
+      if (outArcs == null) outArcs = new List<IArc> { arc };
+      else outArcs.Add(arc);
     }
     public void AddForwardArc(IArc arc) {
       if (arc.Source == null) { arc.Source = this; }
       if (arc.Source != this) { throw new Exception("AddForwardArc: Source should be equal to this."); }
-      if (OutArcs == null) { OutArcs = new List<IArc> { arc }; } else { OutArcs.Add(arc); }
+      if (outArcs == null) { outArcs = new List<IArc> { arc }; } else { outArcs.Add(arc); }
+    }
+    public void AddReverseArc(IVertex source, double w = 0.0, object data = null) {
+      var arc = new Arc { Source = source, Target = this, Data = data, Weight = w };
+      if (inArcs == null) inArcs = new List<IArc> { arc };
+      else inArcs.Add(arc);
     }
     public void AddReverseArc(IArc arc) {
       if (arc.Target == null) { arc.Target = this; }
       if (arc.Target != this) { throw new Exception("AddReverseArc: Target should be equal to this."); };
-      if (InArcs == null) { InArcs = new List<IArc> { arc }; } else { InArcs.Add(arc); }
-    }
-    public void AddReverseArc(IVertex source, double w = 0.0, object data = null) {
-      var arc = new Arc { Source = source, Target = this, Data = data, Weight = w };
-      if (InArcs == null) InArcs = new List<IArc> { arc };
-      else InArcs.Add(arc);
+      if (inArcs == null) { inArcs = new List<IArc> { arc }; } else { inArcs.Add(arc); }
     }
 
-    public int InDegree { get { return InArcs == null ? 0 : InArcs.Count; } }
-    public int OutDegree { get { return OutArcs == null ? 0 : OutArcs.Count; } }
+    public int InDegree { get { return InArcs.Count(); } }
+    public int OutDegree { get { return OutArcs.Count(); } }
     public int Degree { get { return InDegree + OutDegree; } }
   }
-
 
   [StorableClass]
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10677)
@@ -37,4 +37,7 @@
       set { ranks = value; }
     }
+    public new IEnumerable<IGenealogyGraphNode> Nodes {
+      get { return from n in base.Nodes select (IGenealogyGraphNode)n; }
+    }
     protected GenealogyGraph(GenealogyGraph original, Cloner cloner)
       : base(original, cloner) {
@@ -74,4 +77,9 @@
       }
     }
+
+    public override void Clear() {
+      base.Clear();
+      ranks.Clear();
+    }
   }
 
@@ -79,4 +87,5 @@
   [Item("GenealogyGraph", "")]
   public class GenealogyGraph<T> : DirectedGraph, IGenealogyGraph<T> where T : class, IItem {
+    // members and properties
     [Storable]
     private Dictionary<double, LinkedList<IGenealogyGraphNode>> ranks;
@@ -85,4 +94,8 @@
       set { ranks = value; }
     }
+    public new IEnumerable<IGenealogyGraphNode<T>> Nodes {
+      get { return from n in base.Nodes select (IGenealogyGraphNode<T>)n; }
+    }
+    // contructors
     protected GenealogyGraph(GenealogyGraph<T> original, Cloner cloner)
       : base(original, cloner) {
@@ -96,4 +109,5 @@
       Ranks = new Dictionary<double, LinkedList<IGenealogyGraphNode>>();
     }
+    // methods
     public override void AddVertex(IVertex vertex) {
       var node = (IGenealogyGraphNode<T>)vertex;
@@ -110,4 +124,9 @@
       base.RemoveVertex(vertex);
     }
+
+    IEnumerable<IGenealogyGraphNode> IGenealogyGraph.Nodes {
+      get { return Nodes; }
+    }
+
     public event EventHandler GraphUpdated;
     private void OnGraphUpdated(object sender, EventArgs args) {
@@ -115,5 +134,4 @@
       if (updated != null) updated(sender, args);
     }
-
     public new List<IGenealogyGraphNode<T>> this[object content] {
       get {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10677)
@@ -41,21 +41,23 @@
     public GenealogyGraphNode() { }
 
-    public new List<IGenealogyGraphArc> InArcs {
+    public new IEnumerable<IGenealogyGraphArc> InArcs {
       get {
-        return base.InArcs == null ? null : base.InArcs.Cast<IGenealogyGraphArc>().ToList();
+        return base.InArcs.Cast<IGenealogyGraphArc>().ToList();
       }
+      set { base.InArcs = value; }
     }
-    public new List<IGenealogyGraphArc> OutArcs {
+    public new IEnumerable<IGenealogyGraphArc> OutArcs {
       get {
-        return base.OutArcs == null ? null : base.OutArcs.Cast<IGenealogyGraphArc>().ToList();
+        return base.OutArcs.Cast<IGenealogyGraphArc>().ToList();
       }
+      set { base.InArcs = value; }
     }
-    public IEnumerable<IGenealogyGraphNode> Ancestors() {
-      // for performance, we use a hashset for lookup and a list for iteration
-      var nodes = new HashSet<IGenealogyGraphNode> { this };
-      var list = new List<IGenealogyGraphNode> { this };
-      int i = 0;
-      while (i != list.Count) {
-        if (list[i].InArcs != null) {
+    public IEnumerable<IGenealogyGraphNode> Ancestors {
+      get {
+        // for performance, we use a hashset for lookup and a list for iteration
+        var nodes = new HashSet<IGenealogyGraphNode> { this };
+        var list = new List<IGenealogyGraphNode> { this };
+        int i = 0;
+        while (i != list.Count) {
           foreach (var e in list[i].InArcs) {
             if (nodes.Contains(e.Source)) continue;
@@ -63,8 +65,8 @@
             list.Add(e.Source);
           }
+          ++i;
         }
-        ++i;
+        return list;
       }
-      return list;
     }
     /// <summary>
@@ -72,10 +74,10 @@
     /// </summary>
     /// <returns>All the descendants of the current node</returns>
-    public IEnumerable<IGenealogyGraphNode> Descendants() {
-      var nodes = new HashSet<IGenealogyGraphNode> { this };
-      var list = new List<IGenealogyGraphNode> { this };
-      int i = 0;
-      while (i != list.Count) {
-        if (list[i].OutArcs != null) {
+    public IEnumerable<IGenealogyGraphNode> Descendants {
+      get {
+        var nodes = new HashSet<IGenealogyGraphNode> { this };
+        var list = new List<IGenealogyGraphNode> { this };
+        int i = 0;
+        while (i != list.Count) {
           foreach (var e in list[i].OutArcs) {
             if (nodes.Contains(e.Target)) continue;
@@ -83,8 +85,8 @@
             list.Add(e.Target);
           }
+          ++i;
         }
-        ++i;
+        return list;
       }
-      return list;
     }
     [Storable]
@@ -118,4 +120,14 @@
       base.AddReverseArc(arc);
     }
+
+    public IEnumerable<IGenealogyGraphNode> Parents {
+      get {
+        return InArcs == null ? Enumerable.Empty<IGenealogyGraphNode>() : InArcs.Select(a => a.Source);
+      }
+    }
+
+    public IEnumerable<IGenealogyGraphNode> Children {
+      get { return OutArcs == null ? Enumerable.Empty<IGenealogyGraphNode>() : OutArcs.Select(a => a.Source); }
+    }
   }
 
@@ -135,4 +147,24 @@
       return new GenealogyGraphNode<T>(this, cloner);
     }
+
+    public new IEnumerable<IGenealogyGraphNode<T>> Parents {
+      get {
+        return base.Parents.Select(p => (IGenealogyGraphNode<T>)p);
+      }
+    }
+
+    public new IEnumerable<IGenealogyGraphNode<T>> Children {
+      get {
+        return base.Children.Select(c => (IGenealogyGraphNode<T>)c);
+      }
+    }
+
+    public new IEnumerable<IGenealogyGraphNode<T>> Ancestors {
+      get { return base.Ancestors.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
+
+    public new IEnumerable<IGenealogyGraphNode<T>> Descendants {
+      get { return base.Descendants.Select(x => (IGenealogyGraphNode<T>)x); }
+    }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10677)
@@ -26,6 +26,9 @@
   public interface IGenealogyGraph : IDirectedGraph {
     Dictionary<double, LinkedList<IGenealogyGraphNode>> Ranks { get; }
+    new IEnumerable<IGenealogyGraphNode> Nodes { get; }
   }
 
-  public interface IGenealogyGraph<T> : IGenealogyGraph where T : class,IItem { }
+  public interface IGenealogyGraph<T> : IGenealogyGraph where T : class, IItem {
+    new IEnumerable<IGenealogyGraphNode<T>> Nodes { get; }
+  }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraphNode.cs	(revision 10677)
@@ -22,18 +22,25 @@
 using System;
 using System.Collections.Generic;
-using HeuristicLab.Core;
 
 namespace HeuristicLab.EvolutionTracking {
   public interface IGenealogyGraphNode : IVertex, IComparable<IGenealogyGraphNode> {
-    IEnumerable<IGenealogyGraphNode> Ancestors();
-    IEnumerable<IGenealogyGraphNode> Descendants();
-    new List<IGenealogyGraphArc> InArcs { get; }
-    new List<IGenealogyGraphArc> OutArcs { get; }
-
     double Rank { get; set; }
     double Quality { get; set; }
     bool IsElite { get; set; }
+
+    IEnumerable<IGenealogyGraphNode> Parents { get; }
+    IEnumerable<IGenealogyGraphNode> Children { get; }
+    IEnumerable<IGenealogyGraphNode> Ancestors { get; }
+    IEnumerable<IGenealogyGraphNode> Descendants { get; }
+    new IEnumerable<IGenealogyGraphArc> InArcs { get; set; }
+    new IEnumerable<IGenealogyGraphArc> OutArcs { get; set; }
   }
 
-  public interface IGenealogyGraphNode<T> : IGenealogyGraphNode, IVertex<T> where T : class { }
+  public interface IGenealogyGraphNode<T> : IGenealogyGraphNode, IVertex<T> where T : class {
+    new IEnumerable<IGenealogyGraphNode<T>> Parents { get; }
+    new IEnumerable<IGenealogyGraphNode<T>> Children { get; }
+
+    new IEnumerable<IGenealogyGraphNode<T>> Ancestors { get; }
+    new IEnumerable<IGenealogyGraphNode<T>> Descendants { get; }
+  }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10677)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
@@ -55,5 +56,5 @@
         // adjust parent-child(clone) relationship in the graph
         var parents = vChild.InArcs.Select(a => a.Source);
-        vChild.InArcs.Clear();
+        vChild.InArcs = new List<IGenealogyGraphArc>();
         foreach (var p in parents) {
           foreach (var a in p.OutArcs) {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/FragmentGraphView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/FragmentGraphView.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/FragmentGraphView.cs	(revision 10677)
@@ -20,9 +20,5 @@
     public new IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>> Content {
       get { return (IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>>)base.Content; }
-      set {
-        base.Content = value;
-        MakeTiles();
-        Draw();
-      }
+      set { base.Content = value; }
     }
 
@@ -38,5 +34,5 @@
       var chart = symbolicExpressionChartControl.Chart;
       tileDictionary.Clear();
-      foreach (var node in Content.Nodes.Cast<IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>>()) {
+      foreach (var node in Content.Nodes) {
         var tile = new SymbolicExpressionTreeTile(chart);
         tile.LayoutEngine = symbolicExpressionEngine;
@@ -48,10 +44,10 @@
       }
 
-      foreach (var node in Content.Nodes.Where(n => n.InArcs != null && n.InArcs.Count > 0)) {
-        var graphNode = (IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>)node;
-        var layoutNode = tileDictionary[graphNode];
+
+      foreach (var node in Content.Nodes.Where(n => n.Children.Any())) {
+        var layoutNode = tileDictionary[node];
         layoutNode.Children = new List<TileLayoutNode>();
-        foreach (var c in node.InArcs.Select(x => x.Source as IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>)) {
-          layoutNode.Children.Add(tileDictionary[c]);
+        foreach (var child in node.Children) {
+          layoutNode.Children.Add(tileDictionary[child]);
         }
       }
@@ -59,6 +55,8 @@
 
     private void Draw() {
-      var root = tileDictionary[(IGenealogyGraphNode<IFragment<ISymbolicExpressionTreeNode>>)Content.Nodes[0]];
-      var visualNodes = layoutEngine.CalculateLayout(root);
+      var root = Content.Nodes.First();
+
+      var fragmentRoot = tileDictionary[root];
+      var visualNodes = layoutEngine.CalculateLayout(fragmentRoot);
 
       symbolicExpressionChartControl.UpdateEnabled = false;
@@ -82,18 +80,13 @@
 
     #region Event Handlers (Content)
-
     // TODO: Put event handlers of the content here
-
-    #endregion
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null) {
-        // TODO: Add code when content has been changed and is null
-      } else {
-        // TODO: Add code when content has been changed and is not null
+      if (Content != null) {
+        MakeTiles();
+        Draw();
       }
     }
-
+    #endregion
 
     protected override void SetEnabledStateOfControls() {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymboldDataAnalysisGenealogyView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymboldDataAnalysisGenealogyView.cs	(revision 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymboldDataAnalysisGenealogyView.cs	(revision 10677)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.IO;
 using System.Linq;
 using System.Windows.Forms;
@@ -34,5 +35,4 @@
 using FragmentGraph = HeuristicLab.EvolutionTracking.IGenealogyGraph<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
 
-
 using FragmentNode = HeuristicLab.EvolutionTracking.GenealogyGraphNode<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
 
@@ -102,7 +102,8 @@
         // perform fragment tracing
         var fragmentGraph = TraceSubtree(subtree);
-        var fragmentGraphView = MainFormManager.CreateView(typeof(FragmentGraphView));
-        fragmentGraphView.Content = fragmentGraph;
-        fragmentGraphView.Show();
+        MainFormManager.MainForm.ShowContent(fragmentGraph);
+        //        var fragmentGraphView = MainFormManager.MainForm.ShowContent(fragmentGraph);
+        //        fragmentGraphView.Content = fragmentGraph;
+        //        fragmentGraphView.Show();
 
         // open a FragmentGraphView displaying this fragmentGraph
@@ -166,4 +167,8 @@
 
     #region fragment tracing
+    #region helper methods to shorten the code
+
+    #endregion
+
     private FragmentGraph TraceSubtree(ISymbolicExpressionTreeNode subtree) {
       var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)genealogyGraphChart.SelectedGraphNode;
@@ -174,60 +179,70 @@
 
     private void Trace(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, ISymbolicExpressionTreeNode subtree, FragmentGraph fragmentGraph, FragmentNode parentNode = null) {
-      if (graphNode.InArcs == null) return;
-      // the subtree must belong to the currently displayed tree which in turn must belong to the currently selected graph node
-      var tree = graphNode.Content;
-      var subtreeIndex = tree.IterateNodesPrefix().ToList().IndexOf(subtree);
-      var subtreeLength = subtree.GetLength();
-
-      var fragment = (IFragment<ISymbolicExpressionTreeNode>)graphNode.InArcs.Last().Data;
-      if (fragment == null) return;
-      var fragmentLength = fragment.Root.GetLength();
-
-      FragmentNode node = new FragmentNode { Content = new Fragment<ISymbolicExpressionTreeNode> { Root = subtree }, Rank = graphNode.Rank };
-      if (parentNode != null) {
-        AddChild(parentNode, node);
-      }
-      fragmentGraph.AddVertex(node);
-
-      // below, we consider three cases:
-      // 1) the selected subtree is the same as the fragment
-      // 2) the fragment contains the selected subtree
-      // 3) the fragment is contained by the selected subtree
-      // In each case, the idea is to isolate and individually track the fragment and the rest of the subtree (for cases 2 and 3)
-      if (fragment.Index == subtreeIndex) {
-        // the selected subtree is the actual fragment
-        if (fragmentLength != subtreeLength) throw new Exception("Fragment and subtree lengths should be the same!");
-
-        var g = (IGenealogyGraphNode<ISymbolicExpressionTree>)graphNode.InArcs.Last().Source;
-        var s = g.Content.IterateNodesPrefix().ToList()[fragment.OldIndex];
-        Trace(g, s, fragmentGraph, node);
-
-      } else if (fragment.Index < subtreeIndex && subtreeIndex < fragment.Index + fragmentLength) {
-        // the fragment contains the selected subtree 
-        if (subtreeLength >= fragmentLength) throw new Exception("Fragment contains subtree, so subtree length should be less than the fragment length.");
-
-        var g = (IGenealogyGraphNode<ISymbolicExpressionTree>)graphNode.InArcs.Last().Source;
-        var i = fragment.Root.IterateNodesPrefix().ToList().IndexOf(subtree); // get the index of the selected subtree, relative to the fragment root
-        var s = g.Content.IterateNodesPrefix().ToList()[fragment.OldIndex + i];
-        Trace(g, s, fragmentGraph, node);
-
-      } else if (subtreeIndex < fragment.Index && fragment.Index < subtreeIndex + subtreeLength) {
-        // the selected subtree contains the fragment
-        if (fragmentLength >= subtreeLength) throw new Exception("Subtree contains fragment, so fragment length should be less than the subtree length.");
-
-        var g0 = (IGenealogyGraphNode<ISymbolicExpressionTree>)graphNode.InArcs[0].Source;
-        var s0 = g0.Content.IterateNodesPrefix().ToList()[subtreeIndex];
-        Trace(g0, s0, fragmentGraph, node);
-
-        if (graphNode.InArcs.Count > 1) {
-          var g1 = (IGenealogyGraphNode<ISymbolicExpressionTree>)graphNode.InArcs[1].Source;
-          var s1 = g1.Content.IterateNodesPrefix().ToList()[fragment.OldIndex];
-          Trace(g1, s1, fragmentGraph, node);
-        }
-      } else {
-        // fragment and subtree are completely distinct, therefore we will track the subtree
-        var g = (IGenealogyGraphNode<ISymbolicExpressionTree>)graphNode.InArcs[0].Source;
-        var s = graphNode.Content.IterateNodesPrefix().ToList()[subtreeIndex];
-        Trace(g, s, fragmentGraph, node);
+      while (true) {
+        if (!graphNode.InArcs.Any()) return;
+
+        var parentVertices = graphNode.Parents.ToList();
+        // the subtree must belong to the currently displayed tree which in turn must belong to the currently selected graph node
+        var tree = graphNode.Content;
+        var subtreeIndex = tree.IndexOf(subtree);
+        var subtreeLength = subtree.GetLength();
+
+        var fragment = (IFragment<ISymbolicExpressionTreeNode>)graphNode.InArcs.Last().Data;
+        if (fragment == null) return;
+        var fragmentLength = fragment.Root.GetLength();
+
+        FragmentNode node = new FragmentNode { Content = new Fragment<ISymbolicExpressionTreeNode> { Root = subtree }, Rank = graphNode.Rank };
+        if (parentNode != null) {
+          AddChild(parentNode, node);
+        }
+        fragmentGraph.AddVertex(node);
+
+        // if the selected subtree is the actual fragment
+        if (fragment.Index == subtreeIndex) {
+          if (fragmentLength != subtreeLength) throw new Exception("Fragment and subtree lengths should be the same!");
+          graphNode = parentVertices.Last();
+          tree = graphNode.Content;
+          subtree = tree.NodeAt(fragment.OldIndex);
+          parentNode = node;
+          continue;
+        }
+        // if the fragment contains the selected subtree => track fragment, then track subtree
+        if (fragment.Index < subtreeIndex && subtreeIndex < fragment.Index + fragmentLength) {
+          if (subtreeLength >= fragmentLength) throw new Exception("Fragment contains subtree, so subtree length should be less than the fragment length.");
+
+          graphNode = parentVertices.Last();
+          tree = graphNode.Content;
+          var i = fragment.Root.IndexOf(subtree); // get the index of the selected subtree, relative to the fragment root
+          subtree = tree.NodeAt(fragment.OldIndex + i);
+          parentNode = node;
+          continue;
+        }
+        // if the selected subtree contains the fragment => track fragment and subtree
+        if (subtreeIndex < fragment.Index && fragment.Index < subtreeIndex + subtreeLength) {
+          if (fragmentLength >= subtreeLength) throw new Exception("Subtree contains fragment, so fragment length should be less than the subtree length.");
+
+          graphNode = parentVertices[0];
+          tree = graphNode.Content;
+          subtree = tree.NodeAt(subtreeIndex);
+          // track subtree
+          Trace(graphNode, subtree, fragmentGraph, node);
+
+          // track fragment
+          if (parentVertices.Count > 1) {
+            graphNode = parentVertices[1];
+            tree = graphNode.Content;
+            subtree = tree.NodeAt(fragment.OldIndex);
+            parentNode = node;
+            continue;
+          }
+        } else {
+          // fragment and subtree are completely distinct => we only track the subtree
+          graphNode = parentVertices[0];
+          tree = graphNode.Content;
+          subtree = tree.NodeAt(subtreeIndex);
+          parentNode = node;
+          continue;
+        }
+        break;
       }
     }
@@ -240,3 +255,23 @@
     #endregion
   }
+
+  internal static class Util {
+    private static string ViewAsText(this ISymbolicExpressionTreeNode root) {
+      var writer = new StringWriter();
+      SymbolicExpressionTreeHierarchicalFormatter.RenderNode(writer, root, string.Empty);
+      return writer.ToString();
+    }
+    internal static ISymbolicExpressionTreeNode NodeAt(this ISymbolicExpressionTree tree, int position) {
+      return NodeAt(tree.Root, position);
+    }
+    internal static ISymbolicExpressionTreeNode NodeAt(this ISymbolicExpressionTreeNode root, int position) {
+      return root.IterateNodesPrefix().ElementAt(position);
+    }
+    internal static int IndexOf(this ISymbolicExpressionTree tree, ISymbolicExpressionTreeNode node) {
+      return IndexOf(tree.Root, node);
+    }
+    internal static int IndexOf(this ISymbolicExpressionTreeNode root, ISymbolicExpressionTreeNode node) {
+      return root.IterateNodesPrefix().ToList().IndexOf(node); // not too worried about efficiency here
+    }
+  }
 }
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 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs	(revision 10677)
@@ -10,9 +10,8 @@
     public override IOperation Apply() {
       var child = ChildParameter.ActualValue;
-      var childVertex = GenealogyGraph[child].Last();
-      var arc0 = (IGenealogyGraphArc)childVertex.InArcs[0];
-      var arc1 = (IGenealogyGraphArc)childVertex.InArcs[1];
-      var nodes0 = (List<ISymbolicExpressionTreeNode>)arc0.Data;
-      var nodes1 = (List<ISymbolicExpressionTreeNode>)arc1.Data;
+      var childVertex = (IGenealogyGraphNode)GenealogyGraph[child].Last();
+      var arcs = childVertex.InArcs.ToList();
+      var nodes0 = (List<ISymbolicExpressionTreeNode>)arcs[0].Data;
+      var nodes1 = (List<ISymbolicExpressionTreeNode>)arcs[1].Data;
       var childNodes = child.IterateNodesPrefix().ToList();
       IFragment<ISymbolicExpressionTreeNode> fragment = null;
@@ -28,6 +27,6 @@
       if (fragment == null) throw new Exception("Could not determine fragment!");
 
-      arc0.Data = null;
-      arc1.Data = fragment;
+      arcs[0].Data = null;
+      arcs[1].Data = fragment;
 
       return base.Apply();
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 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterManipulatorOperator.cs	(revision 10677)
@@ -20,5 +20,5 @@
     public override IOperation Apply() {
       var vChild = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[ChildParameter.ActualValue].First();
-      var nodesBefore = (List<ISymbolicExpressionTreeNode>)vChild.InArcs[0].Data;
+      var nodesBefore = (List<ISymbolicExpressionTreeNode>)vChild.InArcs.First().Data;
       var nodesAfter = ChildParameter.ActualValue.IterateNodesBreadth().ToList();
       IFragment<ISymbolicExpressionTreeNode> fragment = null;
@@ -32,5 +32,5 @@
       }
 
-      vChild.InArcs[0].Data = fragment;
+      vChild.InArcs.First().Data = fragment;
       return base.Apply();
     }
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 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeCrossoverOperator.cs	(revision 10677)
@@ -32,9 +32,9 @@
       var parents = ParentsParameter.ActualValue.ToList();
       var childVertex = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[parents[0]].Last(); // use the parent since it is actually the child before crossover (and the ChildParameter doesn't have a value yet)
+      var arcs = childVertex.InArcs.ToList();
 
       for (int i = 0; i < parents.Count; ++i) {
         var nodes = parents[i].IterateNodesPrefix().ToList();
-        var arc = childVertex.InArcs[i];
-        arc.Data = nodes;
+        arcs[i].Data = nodes;
       }
       var parentVertices = childVertex.InArcs.Select(x => (IGenealogyGraphNode<ISymbolicExpressionTree>)x.Source).ToList();
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 10675)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionBeforeManipulatorOperator.cs	(revision 10677)
@@ -10,5 +10,5 @@
 
       var vChild = (IGenealogyGraphNode<ISymbolicExpressionTree>)GenealogyGraph[ChildParameter.ActualValue].Last();
-      vChild.InArcs[0].Data = vChild.Content.IterateNodesBreadth().ToList();
+      vChild.InArcs.First().Data = vChild.Content.IterateNodesBreadth().ToList();
 
       return result;
