Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11255)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 11257)
@@ -260,6 +260,4 @@
         T elite = null;
 
-        int psum1 = GenealogyGraph.Ranks[generation].Sum(x => x.Parents.Count());
-
         for (int i = 0; i < population.Length; ++i) {
           if (GenealogyGraph.GetByContent(population[i]).Rank.Equals(generation - 1)) {
@@ -305,8 +303,4 @@
         }
         #endregion
-        int psum2 = GenealogyGraph.Ranks[generation].Sum(x => x.Parents.Count());
-
-        if (psum1 != psum2 - 1) // -1 because we have added an additional arc from the previous elite to the current one
-          throw new InvalidOperationException("Parent sum should remain the same.");
 
         ComputeSuccessRatios();
@@ -319,13 +313,28 @@
 
       // remove extra graph nodes (added by the instrumented operators in the case of offspring selection)
-      var discardedOffspring = GenealogyGraph.Ranks[generation].Select(x => (T)x.Data).Except(population).ToList();
+      RemoveUnsuccessfulOffspring();
+
+      return base.Apply();
+    }
+
+    private void RemoveUnsuccessfulOffspring() {
+      int generation = GenerationsParameter.ActualValue.Value;
+      var population = PopulationParameter.ActualValue;
+      var discardedOffspring = GenealogyGraph.Ranks[generation].Select(x => (T)x.Data).Except(population);
       foreach (var vertex in discardedOffspring.Select(individual => GenealogyGraph.GetByContent(individual))) {
+        if (vertex.InDegree == 1) {
+          var p = vertex.Parents.First();
+          if (p.Rank.Equals(generation - 1))
+            throw new InvalidOperationException("Parent must be an intermediate vertex");
+          GenealogyGraph.RemoveVertex(p);
+        }
         GenealogyGraph.RemoveVertex(vertex);
       }
-
-      return base.Apply();
     }
 
     private void ComputeSuccessRatios() {
+      const string successfulOffspringRatioTableHistoryName = "Successful offspring ratio";
+      const string successfulOffspringRatioHeatMapName = "Successful offspring ratio heatmap";
+
       var population = PopulationParameter.ActualValue;
       var generation = GenerationsParameter.ActualValue.Value;
@@ -342,14 +351,34 @@
 
       var results = ResultsParameter.ActualValue;
-      DataTable table;
-      if (!results.ContainsKey("Successful offspring ratio")) {
-        table = new DataTable("Successful offspring ratio");
-        results.Add(new Result("Successful offspring ratio", table));
-        table.Rows.Add(new DataRow("Successful offspring ratio") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true } });
+
+      DataTableHistory history;
+      if (!results.ContainsKey(successfulOffspringRatioTableHistoryName)) {
+        history = new DataTableHistory();
+        results.Add(new Result(successfulOffspringRatioTableHistoryName, history));
       } else {
-        table = (DataTable)results["Successful offspring ratio"].Value;
-      }
-      var row = table.Rows["Successful offspring ratio"];
+        history = (DataTableHistory)results[successfulOffspringRatioTableHistoryName].Value;
+      }
+      var table = new DataTable();
+      var row = new DataRow("Successful Offspring") {
+        VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true }
+      };
       row.Values.Replace(GenealogyGraph.Ranks[generation - 1].OrderByDescending(x => x.Quality).Select(x => x.Weight));
+      table.Rows.Add(row);
+      history.Add(table);
+      double[,] elements = new double[population.Length, history.Count];
+      var col = history.AsReadOnly().ToList();
+      for (int i = 0; i < col.Count; ++i) {
+        var values = col[i].Rows.First().Values;
+        for (int j = 0; j < values.Count; ++j) {
+          elements[j, i] = values[j];
+        }
+      }
+
+      var heatmap = new HeatMap(elements);
+      if (!results.ContainsKey(successfulOffspringRatioHeatMapName)) {
+        results.Add(new Result(successfulOffspringRatioHeatMapName, heatmap));
+      } else {
+        results[successfulOffspringRatioHeatMapName].Value = heatmap;
+      }
     }
   }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 11255)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 11257)
@@ -95,4 +95,6 @@
       if (Ranks.ContainsKey(node.Rank)) {
         Ranks[node.Rank].Remove(node);
+        if (!Ranks[node.Rank].Any())
+          Ranks.Remove(node.Rank);
       }
       base.RemoveVertex(vertex);
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11255)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 11257)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -57,5 +58,5 @@
       GenealogyGraph.AddVertex(c);
 
-      var arcs = v.InArcs;
+      var arcs = v.InArcs.ToList();
       foreach (var arc in arcs) {
         var p = arc.Source;
