Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.Designer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.Designer.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.Designer.cs	(revision 10501)
@@ -19,4 +19,6 @@
  */
 #endregion
+
+using System.Drawing;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
@@ -59,5 +61,5 @@
       this.symbolicExpressionTreeChart.Spacing = 5;
       this.symbolicExpressionTreeChart.TabIndex = 0;
-      this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font("Times New Roman", 6F);
+      this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font(FontFamily.GenericSerif, 8F);
       // 
       // FunctionTreeView
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.cs	(revision 10501)
@@ -20,5 +20,4 @@
 #endregion
 
-using System.Drawing;
 using System.Windows.Forms;
 using HeuristicLab.Core.Views;
@@ -53,12 +52,4 @@
       symbolicExpressionTreeChart.Enabled = Content != null;
     }
-
-    public void HighlightNode(ISymbolicExpressionTreeNode node, Color color) {
-      symbolicExpressionTreeChart.HighlightNode(node, color);
-    }
-
-    public void HighlightSubtree(ISymbolicExpressionTreeNode subtree, Color color) {
-      symbolicExpressionTreeChart.HighlightSubtree(subtree, color);
-    }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.Designer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.Designer.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.Designer.cs	(revision 10501)
@@ -50,5 +50,5 @@
       this.saveImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
-      this.exportLatexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.exportPgfLaTeXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.contextMenuStrip.SuspendLayout();
       this.SuspendLayout();
@@ -58,12 +58,12 @@
       this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.saveImageToolStripMenuItem,
-            this.exportLatexToolStripMenuItem});
+            this.exportPgfLaTeXToolStripMenuItem});
       this.contextMenuStrip.Name = "contextMenuStrip";
-      this.contextMenuStrip.Size = new System.Drawing.Size(161, 70);
+      this.contextMenuStrip.Size = new System.Drawing.Size(166, 70);
       // 
       // saveImageToolStripMenuItem
       // 
       this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem";
-      this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+      this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
       this.saveImageToolStripMenuItem.Text = "Save Image";
       this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click);
@@ -73,10 +73,10 @@
       this.saveFileDialog.Filter = "Bitmap (*.bmp)|*.bmp|EMF (*.emf)|*.emf";
       // 
-      // exportLatexToolStripMenuItem
+      // exportPgfLaTeXToolStripMenuItem
       // 
-      this.exportLatexToolStripMenuItem.Name = "exportLatexToolStripMenuItem";
-      this.exportLatexToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
-      this.exportLatexToolStripMenuItem.Text = "Export Pgf/Latex";
-      this.exportLatexToolStripMenuItem.Click += new System.EventHandler(this.exportLatexToolStripMenuItem_Click);
+      this.exportPgfLaTeXToolStripMenuItem.Name = "exportPgfLaTeXToolStripMenuItem";
+      this.exportPgfLaTeXToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
+      this.exportPgfLaTeXToolStripMenuItem.Text = "Export Pgf/LaTeX";
+      this.exportPgfLaTeXToolStripMenuItem.Click += new System.EventHandler(this.exportLatexToolStripMenuItem_Click);
       // 
       // SymbolicExpressionTreeChart
@@ -102,5 +102,5 @@
     protected System.Windows.Forms.ToolStripMenuItem saveImageToolStripMenuItem;
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
-    private System.Windows.Forms.ToolStripMenuItem exportLatexToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem exportPgfLaTeXToolStripMenuItem;
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 10501)
@@ -32,5 +32,5 @@
   public partial class SymbolicExpressionTreeChart : UserControl {
     private Image image;
-    private StringFormat stringFormat;
+    private readonly StringFormat stringFormat;
     private Dictionary<ISymbolicExpressionTreeNode, VisualSymbolicExpressionTreeNode> visualTreeNodes;
     private Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection> visualLines;
@@ -51,5 +51,5 @@
       this.lineColor = Color.Black;
       this.backgroundColor = Color.White;
-      this.textFont = new Font(FontFamily.GenericSerif, 14, GraphicsUnit.Pixel);
+      this.textFont = new Font(FontFamily.GenericSansSerif, 12);
       layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
       layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
@@ -108,5 +108,8 @@
         visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection>();
         if (tree != null) {
-          foreach (ISymbolicExpressionTreeNode node in tree.IterateNodesPrefix()) {
+          IEnumerable<ISymbolicExpressionTreeNode> nodes;
+          if (tree.Root.SubtreeCount == 1) nodes = tree.Root.GetSubtree(0).IterateNodesPrefix();
+          else nodes = tree.Root.IterateNodesPrefix();
+          foreach (ISymbolicExpressionTreeNode node in nodes) {
             visualTreeNodes[node] = new VisualSymbolicExpressionTreeNode(node);
             if (node.Parent != null) visualLines[Tuple.Create(node.Parent, node)] = new VisualSymbolicExpressionTreeNodeConnection();
@@ -166,16 +169,4 @@
         this.Refresh();
       }
-    }
-
-    public void HighlightNode(ISymbolicExpressionTreeNode node, Color color) {
-      var visualNode = GetVisualSymbolicExpressionTreeNode(node);
-      if (visualNode == null) return;
-      visualNode.LineColor = color;
-      RepaintNode(visualNode);
-    }
-
-    public void HighlightSubtree(ISymbolicExpressionTreeNode subtree, Color color) {
-      foreach (var node in subtree.IterateNodesBreadth())
-        HighlightNode(node, color);
     }
 
@@ -280,43 +271,54 @@
     private void DrawFunctionTree(ISymbolicExpressionTree symbolicExpressionTree, Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) {
       var layoutNodes = layoutAdapter.Convert(symbolicExpressionTree).ToList();
+      if (symbolicExpressionTree.Root.SubtreeCount == 1) layoutNodes.RemoveAt(0);
       layoutEngine.Reset();
       layoutEngine.Root = layoutNodes[0];
-      foreach (var ln in layoutNodes)
-        layoutEngine.AddNode(ln.Content, ln);
-      layoutEngine.MinHorizontalSpacing = (preferredNodeWidth + minHDistance);
-      layoutEngine.MinVerticalSpacing = (preferredNodeHeight + minVDistance);
+      layoutEngine.AddNodes(layoutNodes);
+      layoutEngine.MinHorizontalSpacing = (preferredWidth + minHDistance);
+      layoutEngine.MinVerticalSpacing = (preferredHeight + minVDistance);
       layoutEngine.CalculateLayout();
       var bounds = layoutEngine.Bounds();
-      double sx = this.Width / (bounds.Width + preferredWidth);
-      if (sx > 1) sx = 1;
-      double sy = this.Height / bounds.Height;
-      if (sy > 1) sy = 1;
-      double dx = (this.Width - bounds.Width) / 2;
-      if (dx < 0) dx = 0;
-      double dy = (this.Height - bounds.Height) / 2;
-      if (dy < 0) dy = 0;
-
-      var levels = layoutNodes.GroupBy(n => n.Level, n => n);
-
-      foreach (var level in levels) {
-        var nodes = level.ToList();
-        double min = 0;
-        for (int i = 0; i < nodes.Count - 1; ++i) {
-          var w = (nodes[i + 1].X - nodes[i].X) * sx - preferredWidth;
-          if (w < min) min = w;
-        }
-        if (min > 0) min = 0;
-
-        foreach (var layoutNode in level) {
+
+      double verticalScalingFactor = 1.0;
+      double layoutHeight = (bounds.Height + preferredHeight);
+      if (this.Height < layoutHeight)
+        verticalScalingFactor = this.Height / layoutHeight;
+
+      double horizontalScalingFactor = 1.0;
+      double layoutWidth = (bounds.Width + preferredWidth);
+      if (this.Width < layoutWidth)
+        horizontalScalingFactor = this.Width / layoutWidth;
+
+      double horizontalOffset;
+      if (this.Width > layoutWidth)
+        horizontalOffset = (this.Width - layoutWidth) / 2.0;
+      else
+        horizontalOffset = preferredWidth / 2.0;
+
+      var levels = layoutNodes.GroupBy(n => n.Level, n => n).ToList();
+      for (int i = levels.Count - 1; i >= 0; --i) {
+        var nodes = levels[i].ToList();
+
+        double minSpacing = double.MaxValue;
+        if (nodes.Count > 1) {
+          for (int j = 1; j < nodes.Count() - 1; ++j) {
+            var distance = nodes[j].X - nodes[j - 1].X; // guaranteed to be > 0
+            if (minSpacing > distance) minSpacing = distance;
+          }
+        }
+        minSpacing *= horizontalScalingFactor;
+
+        int minWidth = (int)Math.Round(preferredWidth * horizontalScalingFactor);
+        int width = (int)Math.Min(minSpacing, preferredWidth) - 2; // leave some pixels so that node margins don't overlap
+
+        foreach (var layoutNode in nodes) {
           var visualNode = visualTreeNodes[layoutNode.Content];
-          visualNode.Width = (int)Math.Round(preferredWidth + min) - 2; // -2 to allow enough padding (1px on each side) for the node contour to be drawn
-          visualNode.Height = (int)Math.Round(preferredHeight * sy);
-          visualNode.X = (int)(Math.Round(layoutNode.X * sx + dx));
-          visualNode.Y = (int)(Math.Round(layoutNode.Y * sy + dy));
+          visualNode.Width = width;
+          visualNode.Height = (int)Math.Round(preferredHeight * verticalScalingFactor);
+          visualNode.X = (int)Math.Round((layoutNode.X + horizontalOffset) * horizontalScalingFactor + (minWidth - width) / 2.0);
+          visualNode.Y = (int)Math.Round(layoutNode.Y * verticalScalingFactor);
           DrawTreeNode(graphics, visualNode);
         }
       }
-
-      graphics.ResetClip(); // reset clip region
       // draw node connections
       foreach (var visualNode in visualTreeNodes.Values) {
@@ -327,4 +329,5 @@
           var origin = new Point(visualNode.X + visualNode.Width / 2, visualNode.Y + visualNode.Height);
           var target = new Point(visualSubtree.X + visualSubtree.Width / 2, visualSubtree.Y);
+          graphics.Clip = new Region(new Rectangle(Math.Min(origin.X, target.X), origin.Y, Math.Max(origin.X, target.X), target.Y));
           using (var linePen = new Pen(visualLine.LineColor)) {
             linePen.DashStyle = visualLine.DashStyle;
@@ -378,6 +381,5 @@
       Image image = new Bitmap(Width, Height);
       using (Graphics g = Graphics.FromImage(image)) {
-        int height = this.Height / tree.Depth;
-        DrawFunctionTree(tree, g, 0, 0, Width, height);
+        DrawFunctionTree(tree, g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
       }
       image.Save(filename);
@@ -386,12 +388,11 @@
     public void SaveImageAsEmf(string filename) {
       if (tree == null) return;
-      using (var graphics = Graphics.FromImage(image)) {
-        var rectangle = new Rectangle(0, 0, image.Width, image.Height);
-        using (var metafile = new Metafile(filename, graphics.GetHdc(), rectangle, MetafileFrameUnit.Pixel, EmfType.EmfPlusDual)) {
-          graphics.ReleaseHdc();
-          using (var g = Graphics.FromImage(metafile)) {
-            DrawFunctionTree(tree, g, 0, 0, image.Width, image.Height);
+      using (Graphics g = CreateGraphics()) {
+        using (Metafile file = new Metafile(filename, g.GetHdc())) {
+          using (Graphics emfFile = Graphics.FromImage(file)) {
+            DrawFunctionTree(tree, emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
           }
         }
+        g.ReleaseHdc();
       }
     }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeHierarchicalFormatter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeHierarchicalFormatter.cs	(revision 10501)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeHierarchicalFormatter.cs	(revision 10501)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.IO;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  [Item("Hierarchical Formatter", "Formatter for symbolic expression trees that uses special characters for drawing a tree in text-mode.")]
+  public sealed class SymbolicExpressionTreeHierarchicalFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
+    private SymbolicExpressionTreeHierarchicalFormatter(SymbolicExpressionTreeHierarchicalFormatter original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeHierarchicalFormatter(this, cloner);
+    }
+
+    public SymbolicExpressionTreeHierarchicalFormatter() :
+      base("Hierarchical Formatter", "Formatter for symbolic expression trees that uses special characters for drawing a tree in text-mode.") { }
+
+    public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
+      var sw = new StringWriter();
+      RenderTree(sw, symbolicExpressionTree);
+      return sw.ToString();
+    }
+
+    private static void RenderTree(TextWriter writer, ISymbolicExpressionTree tree) {
+      RenderNode(writer, tree.Root, string.Empty);
+    }
+
+    public static void RenderNode(TextWriter writer, ISymbolicExpressionTreeNode node, string prefix) {
+      string label = node.ToString();
+      writer.Write(label);
+      if (node.SubtreeCount > 0) {
+        var padding = prefix + new string(' ', label.Length);
+        for (int i = 0; i != node.SubtreeCount; ++i) {
+          char connector, extender = ' ';
+          if (i == 0) {
+            if (node.SubtreeCount > 1) {
+              connector = RenderChars.JunctionDown;
+              extender = RenderChars.VerticalLine;
+            } else {
+              connector = RenderChars.HorizontalLine;
+              extender = ' ';
+            }
+          } else {
+            writer.Write(padding);
+            if (i == node.SubtreeCount - 1) {
+              connector = RenderChars.CornerRight;
+              extender = ' ';
+            } else {
+              connector = RenderChars.JunctionRight;
+              extender = RenderChars.VerticalLine;
+            }
+          }
+          writer.Write(string.Concat(connector, RenderChars.HorizontalLine));
+          var newPrefix = string.Concat(padding, extender, ' ');
+          RenderNode(writer, node.GetSubtree(i), newPrefix);
+        }
+      } else
+        writer.WriteLine();
+    }
+
+    // helper class providing characters for displaying a tree in the console
+    public static class RenderChars {
+      public const char JunctionDown = '┬';
+      public const char HorizontalLine = '─';
+      public const char VerticalLine = '│';
+      public const char JunctionRight = '├';
+      public const char CornerRight = '└';
+    }
+  }
+}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs	(revision 10501)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -8,29 +29,21 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [Item("LaTeX/PDF Formatter", "Formatter for symbolic expression trees for use with latex.")]
+  [Item("LaTeX/PDF Formatter", "Formatter for symbolic expression trees for use with latex package tikz.")]
   public class SymbolicExpressionTreeLatexFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
-    private readonly static Dictionary<string, string> SymbolNamesMap = new Dictionary<string, string>
+    private readonly static Dictionary<string, string> symbolNameMap = new Dictionary<string, string>
     {
       {"ProgramRootSymbol", "Prog"},
-      {"StartSymbol","RPB"},
-      {"Addition", "$+$"},
-      {"Subtraction", "$-$"},
-      {"Multiplication", "$\\times$"},
-      {"Division", "$\\div$"},
-      {"Logarithm", "$\\log$"},
-      {"Exponential", "$\\exp$"}
+      {"StartSymbol","RPB"}
     };
-    private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> layoutEngine;
-    private readonly SymbolicExpressionTreeLayoutAdapter layoutAdapter;
+    private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
+    private readonly SymbolicExpressionTreeLayoutAdapter layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
 
-    public SymbolicExpressionTreeLatexFormatter() {
+    public SymbolicExpressionTreeLatexFormatter()
+      : base("LaTeX/PDF Formatter", "Formatter for symbolic expression trees for use with latex package tikz.") {
       layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-      layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
     }
 
     protected SymbolicExpressionTreeLatexFormatter(SymbolicExpressionTreeLatexFormatter original, Cloner cloner)
       : base(original, cloner) {
-      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-      layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
     }
 
@@ -40,13 +53,15 @@
 
     public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
+      layoutEngine.Reset();
       var layoutNodes = layoutAdapter.Convert(symbolicExpressionTree).ToList();
-      layoutEngine.Reset();
       layoutEngine.Root = layoutNodes[0];
-      foreach (var ln in layoutNodes)
-        layoutEngine.AddNode(ln.Content, ln);
+      layoutEngine.AddNodes(layoutNodes);
       layoutEngine.CalculateLayout();
       var nodeCoordinates = layoutEngine.GetNodeCoordinates();
       var sb = new StringBuilder();
       var nl = Environment.NewLine;
+      double ws = 1;
+      double hs = 0.7;
+
       sb.Append("\\documentclass[class=minimal,border=0pt]{standalone}" + nl +
                 "\\usepackage{tikz}" + nl +
@@ -56,14 +71,11 @@
                 "\\def\\hs{0.7}" + nl);
 
-      const double ws = 1.0, hs = 0.7; // some scaling factors useful for fine-tuning document appearance before latex compilation
+      var nodeIndices = new Dictionary<ISymbolicExpressionTreeNode, int>();
       var nodes = symbolicExpressionTree.IterateNodesBreadth().ToList();
-      var nodeIndices = new Dictionary<ISymbolicExpressionTreeNode, int>();
       for (int i = 0; i < nodes.Count; ++i) {
         var node = nodes[i];
         nodeIndices.Add(node, i);
-        var symbolName = node.Symbol.Name;
-        var nodeName = SymbolNamesMap.ContainsKey(symbolName) ? SymbolNamesMap[symbolName] : symbolName;
         var coord = nodeCoordinates[node];
-
+        var nodeName = symbolNameMap.ContainsKey(node.Symbol.Name) ? symbolNameMap[node.Symbol.Name] : node.ToString();
         sb.AppendLine(string.Format(CultureInfo.InvariantCulture, "\\node ({0}) at (\\ws*{1},\\hs*{2}) {{{3}}};", i, ws * coord.X, -hs * coord.Y, EscapeLatexString(nodeName)));
       }
@@ -75,6 +87,6 @@
       }
 
-      sb.AppendLine("\\end{tikzpicture}" + nl + "\\end{document}" + nl);
-
+      sb.Append("\\end{tikzpicture}" + nl +
+                "\\end{document}" + nl);
       return sb.ToString();
     }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ILayoutAdapter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ILayoutAdapter.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ILayoutAdapter.cs	(revision 10501)
@@ -4,5 +4,5 @@
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   public interface ILayoutAdapter<T> where T : class {
-    IEnumerable<ILayoutNode<T>> Convert(T root, Func<T, ILayoutNode<T>> convertFunc);
+    IEnumerable<LayoutNode<T>> Convert(T root, Func<T, LayoutNode<T>> convertFunc);
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/LayoutNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/LayoutNode.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/LayoutNode.cs	(revision 10501)
@@ -20,20 +20,21 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
-namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.LayoutEngines {
-  public class LayoutNode<T> : ILayoutNode<T> where T : class {
-    public ILayoutNode<T> NextLeft {
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  public class LayoutNode<T> where T : class {
+    public LayoutNode<T> NextLeft {
       get {
         return Children == null ? Thread : Children.First();
       }
     }
-    public ILayoutNode<T> NextRight {
+    public LayoutNode<T> NextRight {
       get {
         return Children == null ? Thread : Children.Last();
       }
     }
-    public ILayoutNode<T> LeftSibling {
+    public LayoutNode<T> LeftSibling {
       get {
         if (Parent == null) return null;
@@ -41,5 +42,5 @@
       }
     }
-    public ILayoutNode<T> LeftmostSibling {
+    public LayoutNode<T> LeftmostSibling {
       get {
         if (Parent == null) return null;
@@ -48,8 +49,8 @@
     }
 
-    public ILayoutNode<T> Thread { get; set; }
-    public ILayoutNode<T> Ancestor { get; set; }
-    public ILayoutNode<T> Parent { get; set; }
-    public List<ILayoutNode<T>> Children { get; set; }
+    public LayoutNode<T> Thread { get; set; }
+    public LayoutNode<T> Ancestor { get; set; }
+    public LayoutNode<T> Parent { get; set; }
+    public List<LayoutNode<T>> Children { get; set; }
     public float Mod { get; set; }
     public float Prelim { get; set; }
@@ -65,5 +66,13 @@
     }
 
-    public T Content { get; set; }
+    private T content;
+    public T Content {
+      get { return content; }
+      set {
+        if (value == null)
+          throw new ArgumentNullException("LayoutNode: Content cannot be null.");
+        content = value;
+      }
+    }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs	(revision 10501)
@@ -7,23 +7,37 @@
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   public class ReingoldTilfordLayoutEngine<T> where T : class {
-    private readonly Dictionary<T, ILayoutNode<T>> nodes; // provides a reverse mapping T => ILayoutNode
+    private readonly Dictionary<T, LayoutNode<T>> nodeMap; // provides a reverse mapping T => LayoutNode
 
     public ReingoldTilfordLayoutEngine() {
-      nodes = new Dictionary<T, ILayoutNode<T>>();
-    }
-
-    public Dictionary<T, ILayoutNode<T>> Nodes { get { return nodes; } }
-
-    public void AddNode(T content, ILayoutNode<T> node) {
-      if (nodes.ContainsKey(content)) {
+      nodeMap = new Dictionary<T, LayoutNode<T>>();
+    }
+
+    public Dictionary<T, LayoutNode<T>> NodeMap { get { return nodeMap; } }
+
+    public void AddNode(T content) {
+      if (nodeMap.ContainsKey(content)) {
         throw new ArgumentException("Content already present in the dictionary.");
       }
-      nodes.Add(content, node);
-    }
-
-    public ILayoutNode<T> GetNode(T content) {
-      ILayoutNode<T> ILayoutNode;
-      nodes.TryGetValue(content, out ILayoutNode);
-      return ILayoutNode;
+      var node = new LayoutNode<T> { Content = content };
+      nodeMap.Add(content, node);
+    }
+
+    public void AddNode(LayoutNode<T> node) {
+      var content = node.Content;
+      if (nodeMap.ContainsKey(content)) {
+        throw new ArgumentException("Content already present in the dictionary.");
+      }
+      nodeMap.Add(content, node);
+    }
+
+    public void AddNodes(IEnumerable<LayoutNode<T>> nodes) {
+      foreach (var node in nodes)
+        nodeMap.Add(node.Content, node);
+    }
+
+    public LayoutNode<T> GetNode(T content) {
+      LayoutNode<T> layoutNode;
+      nodeMap.TryGetValue(content, out layoutNode);
+      return layoutNode;
     }
 
@@ -40,6 +54,6 @@
     }
 
-    private ILayoutNode<T> root;
-    public ILayoutNode<T> Root {
+    private LayoutNode<T> root;
+    public LayoutNode<T> Root {
       get { return root; }
       set {
@@ -49,5 +63,5 @@
 
     public void ResetCoordinates() {
-      foreach (var node in nodes.Values) {
+      foreach (var node in nodeMap.Values) {
         node.X = 0;
         node.Y = 0;
@@ -56,14 +70,14 @@
 
     /// <summary>
-    /// Transform ILayoutNode coordinates so that all coordinates are positive and start from 0.
+    /// Transform LayoutNode coordinates so that all coordinates are positive and start from 0.
     /// </summary>
     private void NormalizeCoordinates() {
-      var list = nodes.Values.ToList();
+      var list = nodeMap.Values.ToList();
       float xmin = 0, ymin = 0;
-      for (int i = 0; i != list.Count; ++i) {
+      for (int i = 0; i < list.Count; ++i) {
         if (xmin > list[i].X) xmin = list[i].X;
         if (ymin > list[i].Y) ymin = list[i].Y;
       }
-      for (int i = 0; i != list.Count; ++i) {
+      for (int i = 0; i < list.Count; ++i) {
         list[i].X -= xmin;
         list[i].Y -= ymin;
@@ -73,9 +87,9 @@
     public void Reset() {
       root = null;
-      nodes.Clear();
+      nodeMap.Clear();
     }
 
     public void ResetParameters() {
-      foreach (var layoutNode in nodes.Values) {
+      foreach (var layoutNode in nodeMap.Values) {
         // reset layout-related parameters 
         layoutNode.Ancestor = layoutNode;
@@ -99,9 +113,9 @@
 
     /// <summary>
-    /// Returns a map of coordinates for each ILayoutNode in the symbolic expression tree.
+    /// Returns a map of coordinates for each LayoutNode in the symbolic expression tree.
     /// </summary>
     /// <returns></returns>
     public Dictionary<T, PointF> GetNodeCoordinates() {
-      return nodes.ToDictionary(x => x.Key, x => new PointF(x.Value.X, x.Value.Y));
+      return nodeMap.ToDictionary(x => x.Key, x => new PointF(x.Value.X, x.Value.Y));
     }
 
@@ -112,6 +126,6 @@
     public RectangleF Bounds() {
       float xmin, xmax, ymin, ymax; xmin = xmax = ymin = ymax = 0;
-      var list = nodes.Values.ToList();
-      for (int i = 0; i != list.Count; ++i) {
+      var list = nodeMap.Values.ToList();
+      for (int i = 0; i < list.Count; ++i) {
         float x = list[i].X, y = list[i].Y;
         if (xmin > x) xmin = x;
@@ -123,6 +137,6 @@
     }
 
-    private void FirstWalk(ILayoutNode<T> v) {
-      ILayoutNode<T> w;
+    private void FirstWalk(LayoutNode<T> v) {
+      LayoutNode<T> w;
       if (v.IsLeaf) {
         w = v.LeftSibling;
@@ -151,5 +165,5 @@
     }
 
-    private void SecondWalk(ILayoutNode<T> v, float m) {
+    private void SecondWalk(LayoutNode<T> v, float m) {
       v.X = v.Prelim + m;
       v.Y = v.Level * minVerticalSpacing;
@@ -160,11 +174,11 @@
     }
 
-    private void Apportion(ILayoutNode<T> v, ref ILayoutNode<T> defaultAncestor) {
+    private void Apportion(LayoutNode<T> v, ref LayoutNode<T> defaultAncestor) {
       var w = v.LeftSibling;
       if (w == null) return;
-      ILayoutNode<T> vip = v;
-      ILayoutNode<T> vop = v;
-      ILayoutNode<T> vim = w;
-      ILayoutNode<T> vom = vip.LeftmostSibling;
+      LayoutNode<T> vip = v;
+      LayoutNode<T> vop = v;
+      LayoutNode<T> vim = w;
+      LayoutNode<T> vom = vip.LeftmostSibling;
 
       float sip = vip.Mod;
@@ -202,7 +216,7 @@
     }
 
-    private void MoveSubtree(ILayoutNode<T> wm, ILayoutNode<T> wp, float shift) {
-      int subtrees = wp.Number - wm.Number; // TODO: Investigate possible bug (if the value ever happens to be zero) - happens when the tree is actually a graph
-      if (subtrees == 0) throw new Exception();
+    private void MoveSubtree(LayoutNode<T> wm, LayoutNode<T> wp, float shift) {
+      int subtrees = wp.Number - wm.Number; // TODO: Investigate possible bug (if the value ever happens to be zero) - happens when the tree is actually a graph (but that's outside the use case of this algorithm which only works with trees)
+      if (subtrees == 0) throw new Exception("MoveSubtree failed: check if object is really a tree (no cycles)");
       wp.Change -= shift / subtrees;
       wp.Shift += shift;
@@ -212,5 +226,5 @@
     }
 
-    private void ExecuteShifts(ILayoutNode<T> v) {
+    private void ExecuteShifts(LayoutNode<T> v) {
       if (v.IsLeaf) return;
       float shift = 0;
@@ -225,5 +239,5 @@
     }
 
-    private ILayoutNode<T> Ancestor(ILayoutNode<T> u, ILayoutNode<T> v) {
+    private LayoutNode<T> Ancestor(LayoutNode<T> u, LayoutNode<T> v) {
       var ancestor = u.Ancestor;
       if (ancestor == null) return null;
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/SymbolicExpressionTreeLayoutAdapter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/SymbolicExpressionTreeLayoutAdapter.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/LayoutEngines/SymbolicExpressionTreeLayoutAdapter.cs	(revision 10501)
@@ -22,11 +22,10 @@
 using System;
 using System.Collections.Generic;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.LayoutEngines;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   // adapter class that provides some conversion methods from symbolic expression trees to layout nodes (preserving the tree structure)
   public class SymbolicExpressionTreeLayoutAdapter : ILayoutAdapter<ISymbolicExpressionTreeNode> {
-    // default conversion function between ISymbolicExpressionTreeNode and ILayoutNode<ISymbolicExpressionTree>
-    static ILayoutNode<ISymbolicExpressionTreeNode> DefaultConvert(ISymbolicExpressionTreeNode node) {
+    // default conversion function between ISymbolicExpressionTreeNode and LayoutNode<ISymbolicExpressionTree>
+    LayoutNode<ISymbolicExpressionTreeNode> defaultConvert(ISymbolicExpressionTreeNode node) {
       var layoutNode = new LayoutNode<ISymbolicExpressionTreeNode> { Content = node };
       layoutNode.Ancestor = layoutNode;
@@ -34,24 +33,22 @@
     }
 
-    public IEnumerable<ILayoutNode<ISymbolicExpressionTreeNode>> Convert(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, ILayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
+    public IEnumerable<LayoutNode<ISymbolicExpressionTreeNode>> Convert(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, LayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
       return Convert(tree.Root, convertFunc);
     }
     // translate the symbolic expression tree structure to a layout node tree structure
     // return an enumerable containing all the layout nodes
-    public IEnumerable<ILayoutNode<ISymbolicExpressionTreeNode>> Convert(ISymbolicExpressionTreeNode root, Func<ISymbolicExpressionTreeNode, ILayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
-      var rootLayoutNode = convertFunc == null ? DefaultConvert(root) : convertFunc(root);
+    public IEnumerable<LayoutNode<ISymbolicExpressionTreeNode>> Convert(ISymbolicExpressionTreeNode root, Func<ISymbolicExpressionTreeNode, LayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
+      var rootLayoutNode = convertFunc == null ? defaultConvert(root) : convertFunc(root);
       rootLayoutNode.Ancestor = rootLayoutNode;
 
       if (root.SubtreeCount > 0) {
-        rootLayoutNode.Children = new List<ILayoutNode<ISymbolicExpressionTreeNode>>(root.SubtreeCount);
+        rootLayoutNode.Children = new List<LayoutNode<ISymbolicExpressionTreeNode>>(root.SubtreeCount);
         Expand(rootLayoutNode, convertFunc);
       }
 
-      var list = new List<ILayoutNode<ISymbolicExpressionTreeNode>> { rootLayoutNode };
+      var list = new List<LayoutNode<ISymbolicExpressionTreeNode>> { rootLayoutNode };
       int i = 0;
       while (i < list.Count) {
-        if (list[i].Children != null)
-          foreach (ILayoutNode<ISymbolicExpressionTreeNode> child in list[i].Children)
-            list.Add(child);
+        if (list[i].Children != null) list.AddRange(list[i].Children);
         ++i;
       }
@@ -59,14 +56,14 @@
     }
 
-    private void Expand(ILayoutNode<ISymbolicExpressionTreeNode> layoutNode, Func<ISymbolicExpressionTreeNode, ILayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
+    private void Expand(LayoutNode<ISymbolicExpressionTreeNode> layoutNode, Func<ISymbolicExpressionTreeNode, LayoutNode<ISymbolicExpressionTreeNode>> convertFunc = null) {
       if (layoutNode.Children == null) return;
       for (int i = 0; i < layoutNode.Content.SubtreeCount; ++i) {
         var subtree = layoutNode.Content.GetSubtree(i);
-        var childLayoutNode = convertFunc == null ? DefaultConvert(subtree) : convertFunc(subtree);
+        var childLayoutNode = convertFunc == null ? defaultConvert(subtree) : convertFunc(subtree);
         childLayoutNode.Parent = layoutNode;
         childLayoutNode.Number = i;
         childLayoutNode.Level = layoutNode.Level + 1;
         childLayoutNode.Ancestor = childLayoutNode;
-        childLayoutNode.Children = subtree.SubtreeCount > 0 ? new List<ILayoutNode<ISymbolicExpressionTreeNode>>(subtree.SubtreeCount) : null;
+        childLayoutNode.Children = subtree.SubtreeCount > 0 ? new List<LayoutNode<ISymbolicExpressionTreeNode>>(subtree.SubtreeCount) : null;
         layoutNode.Children.Add(childLayoutNode);
         Expand(childLayoutNode, convertFunc);
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphView.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphView.cs	(revision 10501)
@@ -15,10 +15,9 @@
     public GenealogyGraphView() {
       InitializeComponent();
-
-      genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked;
     }
 
     protected override void DeregisterContentEvents() {
       // TODO: Deregister your event handlers here
+      genealogyGraphChart.GenealogyGraphNodeClicked -= graphChart_GenealogyGraphNodeClicked;
       base.DeregisterContentEvents();
     }
@@ -27,24 +26,14 @@
       base.RegisterContentEvents();
       // TODO: Register your event handlers here
+      genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked;
     }
 
     #region Event Handlers (Content)
-
-    public virtual void graphChart_GenealogyGraphNodeClicked(object sender, MouseEventArgs args) {
-      var content = ((VisualGenealogyGraphNode)sender).Data.Content;
-      if (content != null) {
-        viewHost.Content = (IContent)content;
-      }
-    }
     // TODO: Put event handlers of the content here
-    #endregion
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null) {
-      } else {
-        genealogyGraphChart.GenealogyGraph = Content;
-      }
+      if (Content != null) { genealogyGraphChart.GenealogyGraph = Content; }
     }
+    #endregion
 
     protected override void SetEnabledStateOfControls() {
@@ -55,4 +44,10 @@
     #region Event Handlers (child controls)
     // TODO: Put event handlers of child controls here.
+    public virtual void graphChart_GenealogyGraphNodeClicked(object sender, MouseEventArgs args) {
+      var content = ((VisualGenealogyGraphNode)sender).Data.Content;
+      if (content != null) {
+        viewHost.Content = (IContent)content;
+      }
+    }
     #endregion
   }
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 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/HeuristicLab.EvolutionTracking.Views-3.4.csproj	(revision 10501)
@@ -105,9 +105,4 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Properties\Resources.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DesignTime>True</DesignTime>
-      <DependentUpon>Resources.resx</DependentUpon>
-    </Compile>
     <Compile Include="GenealogyGraphView.cs">
       <SubType>UserControl</SubType>
@@ -130,10 +125,4 @@
     <None Include="HeuristicLab.snk" />
   </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Properties\Resources.resx">
-      <Generator>ResXFileCodeGenerator</Generator>
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
-    </EmbeddedResource>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 10501)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 10501)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.EvolutionTracking.Views")]
+[assembly: AssemblyDescription("Provides views for evolution tracking objects.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1E69A973-89E0-45C9-AB3F-E48C1AFEDD34")]
+
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.5.$WCREV$")]
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/Properties/Resources.resx
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/Properties/Resources.resx	(revision 10464)
+++ 	(revision )
@@ -1,120 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Fragment.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Fragment.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Fragment.cs	(revision 10501)
@@ -5,13 +5,11 @@
 namespace HeuristicLab.EvolutionTracking {
   [StorableClass]
-  [Item("Fragment", "An object that stores a ")]
+  [Item("Fragment", "A fragment is an object that represents a piece of genetic information that was transferred from parent to child.")]
   public class Fragment : Item, IFragment {
     [Storable]
-    private int newPos;
-    public int NewPos { get { return newPos; } set { newPos = value; } }
+    public int NewPos { get; set; }
 
     [Storable]
-    private int oldPos;
-    public int OldPos { get { return oldPos; } set { oldPos = value; } }
+    public int OldPos { get; set; }
 
     [Storable]
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Properties/AssemblyInfo.cs.frame	(revision 10501)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/Properties/AssemblyInfo.cs.frame	(revision 10501)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.EvolutionTracking")]
+[assembly: AssemblyDescription("Provides operators and related classes for the tracking of genetic inheritance.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3539BCEC-1C7D-4828-898C-850B2DFE1526")]
+
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.5.$WCREV$")]
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 10501)
@@ -75,10 +75,10 @@
       treeChart.Tree = tree.Root.SubtreeCount > 1 ? new SymbolicExpressionTree(tree.Root) : new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0));
 
-      var replacementValues = CalculateReplacementValues(tree);
+      var impactAndReplacementValues = CalculateImpactAndReplacementValues(tree);
+      nodeImpacts = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item1);
+      var replacementValues = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item2);
       foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
         foldedNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
       }
-
-      nodeImpacts = CalculateImpactValues(tree);
       PaintNodeImpacts();
     }
@@ -86,4 +86,5 @@
     protected abstract Dictionary<ISymbolicExpressionTreeNode, double> CalculateReplacementValues(ISymbolicExpressionTree tree);
     protected abstract Dictionary<ISymbolicExpressionTreeNode, double> CalculateImpactValues(ISymbolicExpressionTree tree);
+    protected abstract Dictionary<ISymbolicExpressionTreeNode, Tuple<double, double>> CalculateImpactAndReplacementValues(ISymbolicExpressionTree tree);
     protected abstract void UpdateModel(ISymbolicExpressionTree tree);
 
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs	(revision 10501)
@@ -90,8 +90,12 @@
     protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer(SymbolicDataAnalysisSingleObjectivePruningAnalyzer original, Cloner cloner)
       : base(original, cloner) {
-      this.prunedSubtreesReducer = (DataReducer)original.prunedSubtreesReducer.Clone();
-      this.prunedTreesReducer = (DataReducer)original.prunedTreesReducer.Clone();
-      this.valuesCollector = (DataTableValuesCollector)original.valuesCollector.Clone();
-      this.resultsCollector = (ResultsCollector)original.resultsCollector.Clone();
+      if (original.prunedSubtreesReducer != null)
+        this.prunedSubtreesReducer = (DataReducer)original.prunedSubtreesReducer.Clone();
+      if (original.prunedTreesReducer != null)
+        this.prunedTreesReducer = (DataReducer)original.prunedTreesReducer.Clone();
+      if (original.valuesCollector != null)
+        this.valuesCollector = (DataTableValuesCollector)original.valuesCollector.Clone();
+      if (original.resultsCollector != null)
+        this.resultsCollector = (ResultsCollector)original.resultsCollector.Clone();
     }
     protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer() {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 10501)
@@ -38,4 +38,5 @@
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 10464)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 10501)
@@ -125,5 +125,5 @@
       var prunedTrees = 0;
 
-      double quality = Evaluate((IRegressionModel)model);
+      double quality = Evaluate(model);
 
       for (int i = 0; i < nodes.Count; ++i) {
