Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11318)
@@ -272,32 +272,14 @@
           var prevVertex = (IGenealogyGraphNode<T>)GenealogyGraph.GetByContent(elite);
           prevVertex.IsElite = true; // mark elites in the graph retroactively
-          var w = (IGenealogyGraphNode<T>)prevVertex.Clone();
-          var v = new GenealogyGraphNode<T>(prevVertex.Data) {
+          var v = new GenealogyGraphNode<T>((IDeepCloneable)prevVertex.Data.Clone()) {
             Rank = generation,
             Quality = prevVertex.Quality,
             IsElite = false
           };
-
-          object data = null;
-          if (prevVertex.InArcs.Any())
-            data = prevVertex.InArcs.Last().Data;
-          var children = prevVertex.Children.ToList();
-          var parents = prevVertex.Parents.ToList();
-
-          GenealogyGraph.RemoveVertex(prevVertex);
-          GenealogyGraph.AddVertex(w);
           GenealogyGraph.AddVertex(v);
-          GenealogyGraph.AddArc(w, v); // connect current elite with previous elite
-
-          // recreate connections after prevVertex was replaced with w
-          foreach (var c in children) GenealogyGraph.AddArc(w, c);
-          foreach (var p in parents) GenealogyGraph.AddArc(p, w);
-
-          v.InArcs.Last().Data = data;
-
-          if (w.InArcs.Any())
-            w.InArcs.Last().Data = data;
+          GenealogyGraph.AddArc(prevVertex, v);
 
           // inject the graph node unique id to the scope
+          ExecutionContext.Scope.SubScopes[index].Variables[BeforeManipulatorOperator.ChildParameter.ActualName].Value = v.Data;
           ExecutionContext.Scope.SubScopes[index].Variables["Id"].Value = new StringValue(v.Id);
         }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 11318)
@@ -38,5 +38,6 @@
 
     [Storable]
-    private Dictionary<double, List<IGenealogyGraphNode>> ranks; // use a linked list for fast insertion/removal
+    private Dictionary<double, List<IGenealogyGraphNode>> ranks;
+
     public Dictionary<double, List<IGenealogyGraphNode>> Ranks {
       get { return ranks; }
@@ -56,5 +57,8 @@
 
     [StorableConstructor]
-    protected GenealogyGraph(bool deserializing) : base(deserializing) { }
+    protected GenealogyGraph(bool deserializing)
+      : base(deserializing) {
+    }
+
     public GenealogyGraph() {
       Ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
@@ -85,5 +89,5 @@
 
       if (idMap.ContainsKey(node.Id))
-        throw new InvalidOperationException("Duplicate content is not allowed in the genealogy graph.");
+        throw new InvalidOperationException("Duplicate ids are not allowed in the genealogy graph.");
       idMap[node.Id] = node;
     }
@@ -118,4 +122,5 @@
 
     public event EventHandler GraphUpdated;
+
     private void OnGraphUpdated(object sender, EventArgs args) {
       var updated = GraphUpdated;
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 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/FragmentGraphView.cs	(revision 11318)
@@ -27,5 +27,4 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
-using HeuristicLab.EvolutionTracking;
 using HeuristicLab.MainForm;
 using HeuristicLab.Visualization;
@@ -38,8 +37,8 @@
     private const int PreferredVerticalSpacing = 25;
 
-    private ReingoldTilfordLayoutEngine<TileLayoutNode> layoutEngine;
-    private ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> symbolicExpressionEngine;
-
-    private Dictionary<FragmentNode, TileLayoutNode> tileDictionary;
+    private readonly ReingoldTilfordLayoutEngine<TileLayoutNode> layoutEngine;
+    private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> symbolicExpressionEngine;
+
+    private readonly Dictionary<FragmentNode, TileLayoutNode> nodeToTileMap;
 
     private SymbolicExpressionTreeTile Root { get; set; }
@@ -63,23 +62,22 @@
         NodeHeight = 40
       };
-      tileDictionary = new Dictionary<FragmentNode, TileLayoutNode>();
+      nodeToTileMap = new Dictionary<FragmentNode, TileLayoutNode>();
     }
 
     private void MakeTiles() {
       var chart = symbolicExpressionChartControl.Chart;
-      tileDictionary.Clear();
+      nodeToTileMap.Clear();
       foreach (var node in Content.Vertices) {
-        var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)node.Data;
         var tile = new SymbolicExpressionTreeTile(chart);
         tile.LayoutEngine = symbolicExpressionEngine;
         tile.Label = "Generation " + node.Data.Rank + Environment.NewLine +
                      "Quality " + String.Format("{0:0.000}", node.Data.Quality);
-        tile.Root = graphNode.Data.Root;
+        tile.Root = node.Data.Data.Root;
         var tileNode = new TileLayoutNode { Tile = tile };
-        tileDictionary.Add(node, tileNode);
+        nodeToTileMap.Add(node, tileNode);
       }
       foreach (var node in Content.Vertices.Where(n => n.OutArcs.Any())) {
-        var layoutNode = tileDictionary[node];
-        layoutNode.Children = new List<TileLayoutNode>(node.OutArcs.Select(a => tileDictionary[(FragmentNode)a.Target]));
+        var layoutNode = nodeToTileMap[node];
+        layoutNode.Children = new List<TileLayoutNode>(node.OutArcs.Select(a => nodeToTileMap[(FragmentNode)a.Target]));
       }
     }
@@ -89,7 +87,7 @@
       var nodes = Content.Vertices.ToList();
       var root = nodes[0];
-      var fragmentRoot = tileDictionary[root];
+      var fragmentRoot = nodeToTileMap[root];
       int maxTileWidth = 0, maxTileHeight = 0;
-      var tiles = nodes.Select(x => tileDictionary[x].Tile).ToList();
+      var tiles = nodes.Select(x => nodeToTileMap[x].Tile).ToList();
 
       foreach (var tile in tiles) {
@@ -114,5 +112,5 @@
       // add connections between the tiles
       foreach (var node in nodes) {
-        var aTile = tileDictionary[node].Tile;
+        var aTile = nodeToTileMap[node].Tile;
         var aSize = aTile.Size;
         var aPos = aTile.Position;
@@ -158,5 +156,5 @@
 
         foreach (var child in node.OutArcs.Select(x => (FragmentNode)x.Target)) {
-          var bTile = tileDictionary[child].Tile;
+          var bTile = nodeToTileMap[child].Tile;
           var bSize = bTile.Size;
           var bPos = bTile.Position;
@@ -169,5 +167,5 @@
       }
       // center display on the root of the fragment graph
-      symbolicExpressionChartControl.Chart.Move(tileDictionary[root].Tile.Position.X, tileDictionary[root].Tile.Position.Y);
+      symbolicExpressionChartControl.Chart.Move(nodeToTileMap[root].Tile.Position.X, nodeToTileMap[root].Tile.Position.Y);
       symbolicExpressionChartControl.UpdateEnabled = true;
       symbolicExpressionChartControl.EnforceUpdate();
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 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 11318)
@@ -173,4 +173,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzers\SymbolicDataAnalysisBottomUpDiversityAnalyzer.cs" />
+    <Compile Include="Analyzers\SymbolicDataAnalysisPhenotypicDiversityAnalyzer.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs" />
     <Compile Include="Analyzers\SymbolicDataAnalysisGenealogyAnalyzer.cs" />
@@ -198,4 +200,5 @@
     <Compile Include="SimilarityCalculators\BottomUpSimilarityCalculator.cs" />
     <Compile Include="SimilarityCalculators\MaxCommonSubtreeSimilarityCalculator.cs" />
+    <Compile Include="SimilarityCalculators\PhenotypicSimilarityCalculator.cs" />
     <Compile Include="SymbolicExpressionTreeBacktransformator.cs" />
     <Compile Include="SlidingWindow\GenerationalSlidingWindowAnalyzer.cs" />
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 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionAfterCrossoverOperator.cs	(revision 11318)
@@ -46,4 +46,7 @@
       }
 
+      if (fragment == null)
+        throw new InvalidOperationException("Could not identify crossover fragment.");
+
       arcs[0].Data = null;
       arcs[1].Data = fragment;
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 11316)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs	(revision 11318)
@@ -32,8 +32,6 @@
     public static FragmentGraph TraceSubtree(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex) {
       var graph = new FragmentGraph();
-      var nodes = Trace(graphNode, subtreeIndex);
-      foreach (var n in nodes) {
-        graph.AddVertex(n);
-      }
+      var vertices = Trace(graphNode, subtreeIndex).ToList();
+      graph.AddVertices(vertices);
       return graph;
     }
@@ -52,26 +50,25 @@
       while (true) {
         if (!node.Parents.Any()) {
-          var fragmentNode = new FragmentNode(node) {
-            SubtreeIndex = index,
-          };
+          // no tracing if there are no parents, return a fragment node representing the current trace
+          var fragmentNode = new FragmentNode(node) { SubtreeIndex = index };
           if (parent != null) {
             var arc = new Arc(parent, fragmentNode);
             parent.AddArc(arc);
             fragmentNode.AddArc(arc);
-
-            //            parent.AddForwardArc(arc);
-            //            fragmentNode.AddReverseArc(arc);
           }
-          yield return fragmentNode; // no tracing if there are no parents
+          yield return fragmentNode;
           break;
         }
         var parents = node.Parents.ToList();
-        var fragment = (IFragment<ISymbolicExpressionTreeNode>)node.InArcs.Last().Data;
-
-        if (node.IsElite || fragment == null) {
+        if (node.IsElite) {
           // skip elite, go up the graph to original individual
           node = parents[0];
           continue;
         }
+        var fragment = (IFragment<ISymbolicExpressionTreeNode>)node.InArcs.Last().Data;
+
+        if (node.Rank > 1 && fragment == null)
+          throw new ArgumentNullException("Fragment cannot be null");
+
         var fragmentLength = fragment.Root.GetLength();
         var tree = node.Data;
@@ -139,5 +136,5 @@
           if (fragment.Index1 > index) {
             if (fragment.Index1 < index + subtreeLength) {
-              // subtree contains fragment => bifurcation point in the fragment graph
+              // subtree contains fragment => branching point in the fragment graph
               var fragmentNode = new FragmentNode(node) {
                 SubtreeIndex = index,
