Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 10886)
@@ -97,5 +97,7 @@
       <DependentUpon>FrequentFragmentsDialog.cs</DependentUpon>
     </Compile>
-    <Compile Include="GenealogyGraphChart.cs" />
+    <Compile Include="GenealogyGraphChart.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="GenealogyGraphChart.Designer.cs">
       <DependentUpon>GenealogyGraphChart.cs</DependentUpon>
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Analyzers/GenealogyAnalyzer.cs	(revision 10886)
@@ -54,16 +54,11 @@
     private const string EnableSolutionCreatorTrackingParameterName = "EnableSolutionCreatorTracking"; // should always be enabled. maybe superfluous
 
-    public string CrossoverParentsParameterName { get; set; }
-    public string CrossoverChildParameterName { get; set; }
-    public string ManipulatorChildParameterName { get; set; }
-
+    #region parameter properties
     public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
       get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
     }
-
     public IScopeTreeLookupParameter<T> PopulationParameter {
       get { return (IScopeTreeLookupParameter<T>)Parameters[PopulationParameterName]; }
     }
-
     public IValueParameter<ICrossoverOperator<T>> BeforeCrossoverOperatorParameter {
       get { return (IValueParameter<ICrossoverOperator<T>>)Parameters[BeforeCrossoverOperatorParameterName]; }
@@ -78,6 +73,4 @@
       get { return (IValueParameter<IManipulatorOperator<T>>)Parameters[AfterManipulatorOperatorParameterName]; }
     }
-
-    #region parameter properties
     public ILookupParameter<ResultCollection> ResultsParameter {
       get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
@@ -265,4 +258,6 @@
         }
       } else {
+        // TODO: eliminate from the graph extra vertices added by the recombination operators when filling the pool of offspring with offspring selection
+
         var elite = population.FirstOrDefault(x => GenealogyGraph.Contains(x));
         if (elite != null) {
@@ -282,7 +277,5 @@
           GenealogyGraph[vertex.Content] = vertex;
           GenealogyGraph[previousVertex.Content] = previousVertex;
-          // connect current elite with previous elite
-          previousVertex.AddForwardArc(vertex);
-          vertex.AddReverseArc(previousVertex);
+          GenealogyGraph.AddArc(previousVertex, vertex); // connect current elite with previous elite
           vertex.Id = previousVertex.Id; // another way would be to introduce the vertex.Id into the scope of the elite
           vertex.Quality = previousVertex.Quality;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 10886)
@@ -36,7 +36,5 @@
     double Weight { get; set; }
 
-    void AddForwardArc(IVertex target, double weight = 0.0, object content = null);
     void AddForwardArc(IArc arc);
-    void AddReverseArc(IVertex target, double weight = 0.0, object content = null);
     void AddReverseArc(IArc arc);
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/DirectedGraph/Vertex.cs	(revision 10886)
@@ -87,25 +87,16 @@
     // (they do not appear in the nodes Dictionary). It is the programmers responsibility to 
     // enforce the correct and desired behavior.
-    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);
-    }
     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); }
-    }
-    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 (outArcs == null)
+        outArcs = new List<IArc>();
+      outArcs.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); }
+      if (inArcs == null)
+        inArcs = new List<IArc>();
+      inArcs.Add(arc);
     }
-
     public int InDegree { get { return InArcs.Count(); } }
     public int OutDegree { get { return OutArcs.Count(); } }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs	(revision 10886)
@@ -40,4 +40,12 @@
       get { return from n in base.Nodes select (IGenealogyGraphNode)n; }
     }
+
+    public IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target) {
+      var arc = new GenealogyGraphArc(source, target);
+      source.AddForwardArc(arc);
+      target.AddReverseArc(arc);
+      return arc;
+    }
+
     protected GenealogyGraph(GenealogyGraph original, Cloner cloner)
       : base(original, cloner) {
@@ -98,4 +106,12 @@
       get { return from n in base.Nodes select (IGenealogyGraphNode<T>)n; }
     }
+
+    public IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target) {
+      var arc = new GenealogyGraphArc(source, target);
+      source.AddForwardArc(arc);
+      target.AddReverseArc(arc);
+      return arc;
+    }
+
     // contructors
     protected GenealogyGraph(GenealogyGraph<T> original, Cloner cloner)
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphArc.cs	(revision 10886)
@@ -32,7 +32,18 @@
     protected GenealogyGraphArc(GenealogyGraphArc original, Cloner cloner)
       : base(original, cloner) {
+      this.Target = original.Target;
+      this.Source = original.Source;
+      this.Label = original.Label;
+      this.Weight = original.Weight;
+      this.Data = original.Data;
     }
 
-    public GenealogyGraphArc() { }
+    protected GenealogyGraphArc() { }
+
+    public GenealogyGraphArc(IGenealogyGraphNode source, IGenealogyGraphNode target, object data = null) {
+      Source = source;
+      Target = target;
+      Data = data;
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -60,5 +71,4 @@
       Data = (T)original.Data.Clone();
     }
-    public GenealogyGraphArc() { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraphNode.cs	(revision 10886)
@@ -107,12 +107,4 @@
       return Quality.CompareTo(other.Quality);
     }
-    public new void AddForwardArc(IVertex target, double w = 0.0, object data = null) {
-      var arc = new GenealogyGraphArc { Source = this, Target = (IGenealogyGraphNode)target, Data = data, Weight = w };
-      base.AddForwardArc(arc);
-    }
-    public new void AddReverseArc(IVertex source, double w = 0.0, object data = null) {
-      var arc = new GenealogyGraphArc { Source = (IGenealogyGraphNode)source, Target = this, Data = data, Weight = w };
-      base.AddReverseArc(arc);
-    }
     public IEnumerable<IGenealogyGraphNode> Parents {
       get { return InArcs.Select(a => a.Source); }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/Interfaces/IGenealogyGraph.cs	(revision 10886)
@@ -27,4 +27,5 @@
     Dictionary<double, List<IGenealogyGraphNode>> Ranks { get; }
     new IEnumerable<IGenealogyGraphNode> Nodes { get; }
+    IGenealogyGraphArc AddArc(IGenealogyGraphNode source, IGenealogyGraphNode target);
   }
 
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeCrossoverOperator.cs	(revision 10886)
@@ -78,7 +78,6 @@
       };
       GenealogyGraph.AddVertex(childVertex);
-      foreach (var v in parentVertices) {
-        childVertex.AddReverseArc(v);
-        v.AddForwardArc(childVertex);
+      foreach (var parentVertex in parentVertices) {
+        GenealogyGraph.AddArc(parentVertex, childVertex);
       }
       ExecutionContext.Scope.Variables.Add(new Variable("Id", new StringValue(childVertex.Id)));
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Operators/BeforeManipulatorOperator.cs	(revision 10886)
@@ -60,14 +60,12 @@
         var parents = vChild.Parents; // parents of child become parents of clone
         foreach (var p in parents) {
-          foreach (var a in p.OutArcs.Where(a => a.Target == vChild)) {
-            a.Target = vClone;
-          }
-          vClone.AddReverseArc(p);
+          var arc = p.OutArcs.First(a => a.Target == vChild);
+          arc.Target = vClone;
+          vClone.AddReverseArc(arc);
         }
 
         vClone.InArcs.Last().Data = vChild.InArcs.Last().Data; // fragment of child becomes fragment of clone
         vChild.InArcs = new List<IGenealogyGraphArc>(); // child will be connected to clone
-        vChild.AddReverseArc(vClone);
-        vClone.AddForwardArc(vChild);
+        GenealogyGraph.AddArc(vClone, vChild);
 
         // the following step in necessary because some mutation operators change values while the reference stays the same
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/FPGraph.cs	(revision 10886)
@@ -56,8 +56,4 @@
       return node;
     }
-
-    void AddArc(SymbolNode source, SymbolNode target, double weight, object data = null) {
-      source.AddForwardArc(target, weight, data);
-    }
   }
 }
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolGraph/SymbolGraph.cs	(revision 10886)
@@ -49,8 +49,4 @@
       return node;
     }
-
-    void AddArc(SymbolNode source, SymbolNode target, double weight, object data = null) {
-      source.AddForwardArc(target, weight, data);
-    }
   }
 
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 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SymbolicDataAnalysisExpressionTracing.cs	(revision 10886)
@@ -58,7 +58,7 @@
           };
           if (parent != null) {
-            var arc = new GenealogyGraphArc { Source = parent, Target = fragmentNode };
+            var arc = new GenealogyGraphArc(parent, fragmentNode);
             parent.AddForwardArc(arc);
-            fragmentNode.AddReverseArc(parent);
+            fragmentNode.AddReverseArc(arc);
           }
           yield return fragmentNode; // no tracing if there are no parents
@@ -91,7 +91,7 @@
           };
           if (parent != null) {
-            var arc = new GenealogyGraphArc { Source = parent, Target = fragmentNode };
+            var arc = new GenealogyGraphArc(parent, fragmentNode);
             parent.AddForwardArc(arc);
-            fragmentNode.AddReverseArc(parent);
+            fragmentNode.AddReverseArc(arc);
           }
           yield return fragmentNode;
@@ -134,7 +134,7 @@
               };
               if (parent != null) {
-                var arc = new GenealogyGraphArc { Source = parent, Target = fragmentNode };
+                var arc = new GenealogyGraphArc(parent, fragmentNode);
                 parent.AddForwardArc(arc);
-                fragmentNode.AddReverseArc(parent);
+                fragmentNode.AddReverseArc(arc);
               }
               //              fragmentNode.Content.Index1 = fragment.Index1 - index;
Index: /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 10885)
+++ /branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 10886)
@@ -388,12 +388,15 @@
         if (TSPCrossover != null) {
           TSPGenealogyAnalyzer.BeforeCrossoverOperatorParameter.ActualValue = new BeforeCrossoverOperator<Permutation>();
+          TSPGenealogyAnalyzer.BeforeCrossoverOperator.ParentsParameter.ActualName = TSPCrossover.ParentsParameter.Name;
+          TSPGenealogyAnalyzer.BeforeCrossoverOperator.ChildParameter.ActualName = TSPCrossover.ChildParameter.Name;
           TSPGenealogyAnalyzer.AfterCrossoverOperatorParameter.ActualValue = new AfterCrossoverOperator<Permutation>();
-          TSPGenealogyAnalyzer.CrossoverParentsParameterName = TSPCrossover.ParentsParameter.Name;
-          TSPGenealogyAnalyzer.CrossoverChildParameterName = TSPCrossover.ChildParameter.Name;
+          TSPGenealogyAnalyzer.AfterCrossoverOperator.ParentsParameter.ActualName = TSPCrossover.ParentsParameter.Name;
+          TSPGenealogyAnalyzer.AfterCrossoverOperator.ChildParameter.ActualName = TSPCrossover.ChildParameter.Name;
         }
         if (TSPManipulator != null) {
           TSPGenealogyAnalyzer.BeforeManipulatorOperatorParameter.ActualValue = new BeforeManipulatorOperator<Permutation>();
+          TSPGenealogyAnalyzer.BeforeManipulatorOperator.ChildParameter.ActualName = TSPManipulator.PermutationParameter.Name;
           TSPGenealogyAnalyzer.AfterManipulatorOperatorParameter.ActualValue = new AfterManipulatorOperator<Permutation>();
-          TSPGenealogyAnalyzer.ManipulatorChildParameterName = TSPManipulator.PermutationParameter.Name;
+          TSPGenealogyAnalyzer.AfterManipulatorOperator.ChildParameter.ActualName = TSPManipulator.PermutationParameter.Name;
         }
         TSPGenealogyAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
