Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10459)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10462)
@@ -1,4 +1,3 @@
-﻿using System.Collections.Generic;
-using System.Linq;
+﻿using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -167,19 +166,15 @@
     }
 
-    public override IOperation Apply() {
-      if (Generations.Value == 0) {
-        foreach (var individual in PopulationParameter.ActualValue) {
-          var vertex = new GenealogyGraphNode<T> {
-            Content = individual,
-            Rank = Generations.Value
-          };
-          GenealogyGraph.AddVertex(vertex);
-        }
-        // at the beginning we add the before/after operators to the instrumented operators
+    private void ConfigureTrackingOperators() {
+      // at the beginning we add the before/after operators to the instrumented operators
+      if (Crossover != null) {
+        var instrumentedCrossover = (InstrumentedOperator)Crossover;
+        instrumentedCrossover.AfterExecutionOperators.Clear();
+        instrumentedCrossover.BeforeExecutionOperators.Clear();
+
         if (EnableCrossoverTracking.Value) {
           if (BeforeCrossoverOperator != null) {
             BeforeCrossoverOperator.ParentsParameter.ActualName = CrossoverParentsParameterName;
             BeforeCrossoverOperator.ChildParameter.ActualName = CrossoverChildParameterName;
-            var instrumentedCrossover = (InstrumentedOperator)Crossover;
             instrumentedCrossover.BeforeExecutionOperators.Add(BeforeCrossoverOperator);
           }
@@ -187,44 +182,56 @@
             AfterCrossoverOperator.ParentsParameter.ActualName = CrossoverParentsParameterName;
             AfterCrossoverOperator.ChildParameter.ActualName = CrossoverChildParameterName;
-            var instrumentedCrossover = (InstrumentedOperator)Crossover;
             instrumentedCrossover.AfterExecutionOperators.Add(AfterCrossoverOperator);
           }
         }
-
+      }
+
+      if (Manipulator != null) {
+        var instrumentedManipulator = (InstrumentedOperator)Manipulator;
+        instrumentedManipulator.AfterExecutionOperators.Clear();
+        instrumentedManipulator.BeforeExecutionOperators.Clear();
         if (EnableManipulatorTracking.Value && Manipulator != null) {
-          if (BeforeManipulatorOperator == null) {
-            BeforeManipulatorOperator = new BeforeManipulatorOperator<T>();
+          if (BeforeManipulatorOperator != null) {
             BeforeManipulatorOperator.ChildParameter.ActualName = ManipulatorChildParameterName;
-            var instrumentedManipulator = (InstrumentedOperator)Manipulator;
             instrumentedManipulator.BeforeExecutionOperators.Add(BeforeManipulatorOperator);
           }
-          if (AfterManipulatorOperator == null) {
-            AfterManipulatorOperator = new AfterManipulatorOperator<T>();
+          if (AfterManipulatorOperator != null) {
             AfterManipulatorOperator.ChildParameter.ActualName = ManipulatorChildParameterName;
-            var instrumentedManipulator = (InstrumentedOperator)Manipulator;
             instrumentedManipulator.AfterExecutionOperators.Add(AfterManipulatorOperator);
           }
         }
+      }
+    }
+
+    public override IOperation Apply() {
+      var population = PopulationParameter.ActualValue.ToList();
+      var qualities = QualityParameter.ActualValue.ToList();
+
+      if (Generations.Value == 0) {
+        ConfigureTrackingOperators();
+
+        foreach (var individual in population) {
+          var vertex = new GenealogyGraphNode<T> { Content = individual, Rank = Generations.Value, };
+          GenealogyGraph.AddVertex(vertex);
+        }
       } else {
-        // add missing elite individuals in the current generation 
-        // TODO: optimize for speed
-        var currGen = new HashSet<T>(GenealogyGraph.Ranks[Generations.Value].Cast<IGenealogyGraphNode<T>>().Select(x => x.Content));
-        foreach (var individual in PopulationParameter.ActualValue) {
-          if (currGen.Contains(individual)) continue;
-          // it is an elite which was already added to the graph in the previous generation
+        var elite = population.FirstOrDefault(x => GenealogyGraph.Contains(x));
+        if (elite != null) {
           var vertex = new GenealogyGraphNode<T> {
-            Content = individual,
+            Content = elite,
             Rank = Generations.Value,
             IsElite = true
           };
+          var previousVertex = GenealogyGraph[elite].Last();
           GenealogyGraph.AddVertex(vertex);
-        }
-      }
-      // update qualities for the nodes in the graph
-      var population = PopulationParameter.ActualValue.ToList();
-      var qualities = QualityParameter.ActualValue.ToList();
+          previousVertex.AddForwardArc(vertex);
+          vertex.AddReverseArc(previousVertex);
+        }
+      }
+      // update qualities
       for (int i = 0; i < population.Count; ++i) {
-        foreach (var v in GenealogyGraph[population[i]].Cast<IGenealogyGraphNode<T>>()) {
-          v.Quality = qualities[i].Value;
+        var individual = population[i];
+        foreach (var vertex in GenealogyGraph[individual].Cast<IGenealogyGraphNode<T>>()) {
+          vertex.Quality = qualities[i].Value;
         }
       }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 10459)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/AfterCrossoverOperator.cs	(revision 10462)
@@ -29,6 +29,6 @@
   [Item("AfterCrossoverOperator", "A generic operator that can record genealogical relationships between crossover parents and children.")]
   public class AfterCrossoverOperator<T> : EvolutionTrackingOperator, ICrossoverOperator<T> where T : class,IItem {
-    private const string defaultParentsParameterName = "Parents";
-    private const string defaultChildParameterName = "Child";
+    private const string DefaultParentsParameterName = "Parents";
+    private const string DefaultChildParameterName = "Child";
     public IScopeTreeLookupParameter<T> ParentsParameter { get; set; }
     public ILookupParameter<T> ChildParameter { get; set; }
@@ -42,6 +42,6 @@
 
     public AfterCrossoverOperator() {
-      ParentsParameter = new ScopeTreeLookupParameter<T>(defaultParentsParameterName);
-      ChildParameter = new LookupParameter<T>(defaultChildParameterName);
+      ParentsParameter = new ScopeTreeLookupParameter<T>(DefaultParentsParameterName);
+      ChildParameter = new LookupParameter<T>(DefaultChildParameterName);
       Parameters.Add(ParentsParameter);
       Parameters.Add(ChildParameter);
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisGenealogyGraphView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisGenealogyGraphView.cs	(revision 10459)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisGenealogyGraphView.cs	(revision 10462)
@@ -17,7 +17,11 @@
       var visualNode = (VisualGenealogyGraphNode)sender;
       var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)visualNode.Data;
-      var fragment = (IFragment<ISymbolicExpressionTreeNode>)graphNode.InArcs.Last().Data;
-      var treeView = (GraphicalSymbolicExpressionTreeView)viewHost.ActiveView;
-      treeView.HighlightSubtree(fragment.Root, Color.RoyalBlue);
+      IFragment<ISymbolicExpressionTreeNode> fragment = null;
+      if (graphNode.InArcs != null)
+        fragment = (IFragment<ISymbolicExpressionTreeNode>)graphNode.InArcs.Last().Data;
+      if (fragment != null) {
+        var treeView = (GraphicalSymbolicExpressionTreeView)viewHost.ActiveView;
+        treeView.HighlightSubtree(fragment.Root, Color.RoyalBlue);
+      }
     }
   }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs	(revision 10459)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs	(revision 10462)
@@ -356,8 +356,6 @@
       // add tracking analyzer
       foreach (var op in operators.OfType<SymbolicDataAnalysisGenealogyAnalyzer>()) {
-        //        op.BeforeCrossoverOperator = new SymbolicDataAnalysisExpressionBeforeCrossoverOperator();
-        //        op.AfterCrossoverOperator = new SymbolicDataAnalysisExpressionAfterCrossoverOperator();
-        op.BeforeCrossoverOperator = new BeforeCrossoverOperator<ISymbolicExpressionTree>();
-        op.AfterCrossoverOperator = new AfterCrossoverOperator<ISymbolicExpressionTree>();
+        op.BeforeCrossoverOperator = new SymbolicDataAnalysisExpressionBeforeCrossoverOperator();
+        op.AfterCrossoverOperator = new SymbolicDataAnalysisExpressionAfterCrossoverOperator();
         op.BeforeManipulatorOperator = new BeforeManipulatorOperator<ISymbolicExpressionTree>();
         op.AfterManipulatorOperator = new AfterManipulatorOperator<ISymbolicExpressionTree>();
@@ -373,5 +371,8 @@
           op.ManipulatorChildParameterName = manipulator.SymbolicExpressionTreeParameter.Name;
         }
-        op.PopulationParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
+        var creator = operators.OfType<ISymbolicExpressionTreeCreator>().FirstOrDefault();
+        if (creator != null) {
+          op.PopulationParameter.ActualName = creator.SymbolicExpressionTreeParameter.ActualName;
+        }
       }
     }
