Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs	(revision 10524)
@@ -37,9 +37,13 @@
     };
     private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-    private readonly SymbolicExpressionTreeLayoutAdapter layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
 
     public SymbolicExpressionTreeLatexFormatter()
       : base("LaTeX/PDF Formatter", "Formatter for symbolic expression trees for use with latex package tikz.") {
-      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
+      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
+        HorizontalSpacing = 2,
+        VerticalSpacing = 2,
+        NodeWidth = 8,
+        NodeHeight = 4
+      };
     }
 
@@ -54,9 +58,9 @@
     public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
       layoutEngine.Reset();
-      var layoutNodes = layoutAdapter.Convert(symbolicExpressionTree).ToList();
-      layoutEngine.Root = layoutNodes[0];
-      layoutEngine.AddNodes(layoutNodes);
+      var root = symbolicExpressionTree.Root;
+      var actualRoot = root.SubtreeCount == 0 ? root.GetSubtree(0) : root;
+      layoutEngine.Initialize(actualRoot, x => x.Subtrees);
       layoutEngine.CalculateLayout();
-      var nodeCoordinates = layoutEngine.GetNodeCoordinates();
+      var nodeCoordinates = layoutEngine.GetCoordinates();
       var sb = new StringBuilder();
       var nl = Environment.NewLine;
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.csproj
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.csproj	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.csproj	(revision 10524)
@@ -174,4 +174,9 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Formatters\SymbolicExpressionTreeLatexFormatter.cs" />
+    <Compile Include="LayoutEngines\BoxesLayoutEngine.cs" />
+    <Compile Include="LayoutEngines\ILayoutEngine.cs" />
+    <Compile Include="LayoutEngines\LayoutNode.cs" />
+    <Compile Include="LayoutEngines\ReingoldTilfordLayoutEngine.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="SymbolicExpressionGrammarAllowedChildSymbolsControl.cs">
@@ -225,6 +230,6 @@
       <DependentUpon>SymbolicExpressionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="VisualSymbolicExpressionTreeNode.cs" />
-    <Compile Include="VisualSymbolicExpressionTreeNodeConnection.cs" />
+    <Compile Include="VisualTreeNode.cs" />
+    <Compile Include="VisualTreeNodeConnection.cs" />
   </ItemGroup>
   <ItemGroup>
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/BoxesLayoutEngine.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/BoxesLayoutEngine.cs	(revision 10524)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/BoxesLayoutEngine.cs	(revision 10524)
@@ -0,0 +1,137 @@
+﻿
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
+  public class BoxesLayoutEngine<T> : ILayoutEngine<T> where T : class {
+    private readonly Dictionary<T, VisualTreeNode<T>> nodeMap;
+
+    public int NodeWidth { get; set; }
+    public int NodeHeight { get; set; }
+    public int HorizontalSpacing { get; set; }
+    public int VerticalSpacing { get; set; }
+    private VisualTreeNode<T> layoutRoot;
+
+    public int Width { get; private set; }
+    public int Height { get; private set; }
+
+    public Func<T, IEnumerable<T>> GetChildren { get; set; }
+    public Func<T, int> GetLength { get; set; }
+    public Func<T, int> GetDepth { get; set; }
+
+    public BoxesLayoutEngine() {
+      nodeMap = new Dictionary<T, VisualTreeNode<T>>();
+    }
+
+    public void CalculateLayout() {
+      throw new Exception("The BoxesLayoutEngine does not support arbitrary bounds. Please use method CalculateLayout(Width, Height)");
+    }
+
+    public void CalculateLayout(float width, float height) {
+      Width = (int)Math.Round(width);
+      Height = (int)Math.Round(height);
+      Reset();
+      RecursiveLayout(layoutRoot, 0, 0, Width, Height / GetDepth(layoutRoot.Content));
+    }
+
+    public void Initialize(T root, Func<T, IEnumerable<T>> getChildren, Func<T, int> getLength, Func<T, int> getDepth) {
+      if (getChildren == null || getLength == null || getDepth == null)
+        throw new ArgumentNullException("The BoxesLayoutEngine requires all of the lambdas: (getChildren, getLength and getDepth) to be defined.");
+      GetChildren = getChildren;
+      GetLength = getLength;
+      GetDepth = getDepth;
+      Clear();
+      Expand(root); // produce the nodeMap
+      layoutRoot = nodeMap[root];
+    }
+
+    private void Expand(T root) {
+      var node = new VisualTreeNode<T>(root) {
+        PreferredWidth = NodeWidth,
+        PreferredHeight = NodeHeight
+      };
+      nodeMap.Add(root, node);
+      var children = GetChildren(root).ToList();
+      if (children.Any()) {
+        foreach (var child in children) {
+          Expand(child);
+        }
+      }
+    }
+
+    public void Center(float width, float height) {
+      // does nothing because the BoxesLayout centers the tree by default
+    }
+
+    public void Clear() {
+      nodeMap.Clear();
+      layoutRoot = null;
+    }
+
+    public void Reset() {
+      foreach (var node in nodeMap.Values) {
+        node.X = 0;
+        node.Y = 0;
+      }
+    }
+
+    public Dictionary<T, PointF> GetCoordinates() {
+      return nodeMap.ToDictionary(x => x.Key, x => new PointF(x.Value.X, x.Value.Y));
+    }
+
+    public void FitToBounds(float width, float height) {
+      // does nothing because the BoxesLayout is by default stretched on the whole drawing area
+    }
+
+    private void RecursiveLayout(VisualTreeNode<T> visualTreeNode, int x, int y, int width, int height) {
+      float center_x = x + width / 2;
+      float center_y = y + height / 2;
+      int actualWidth = width - VerticalSpacing;
+      int actualHeight = height - VerticalSpacing;
+
+      //calculate size of node
+      if (actualWidth >= visualTreeNode.PreferredWidth && actualHeight >= visualTreeNode.PreferredHeight) {
+        visualTreeNode.Width = visualTreeNode.PreferredWidth;
+        visualTreeNode.Height = visualTreeNode.PreferredHeight;
+        visualTreeNode.X = (int)center_x - visualTreeNode.Width / 2;
+        visualTreeNode.Y = (int)center_y - visualTreeNode.Height / 2;
+      }
+        //width too small to draw in desired sized
+      else if (actualWidth < visualTreeNode.PreferredWidth && actualHeight >= visualTreeNode.PreferredHeight) {
+        visualTreeNode.Width = actualWidth;
+        visualTreeNode.Height = visualTreeNode.PreferredHeight;
+        visualTreeNode.X = x;
+        visualTreeNode.Y = (int)center_y - visualTreeNode.Height / 2;
+      }
+        //height too small to draw in desired sized
+      else if (actualWidth >= visualTreeNode.PreferredWidth && actualHeight < visualTreeNode.PreferredHeight) {
+        visualTreeNode.Width = visualTreeNode.PreferredWidth;
+        visualTreeNode.Height = actualHeight;
+        visualTreeNode.X = (int)center_x - visualTreeNode.Width / 2;
+        visualTreeNode.Y = y;
+      }
+        //width and height too small to draw in desired size
+      else {
+        visualTreeNode.Width = actualWidth;
+        visualTreeNode.Height = actualHeight;
+        visualTreeNode.X = x;
+        visualTreeNode.Y = y;
+      }
+      //calculate areas for the subtrees according to their tree size and call drawFunctionTree
+      var node = visualTreeNode.Content;
+      var children = GetChildren(node).ToList();
+      int[] xBoundaries = new int[children.Count + 1];
+      xBoundaries[0] = x;
+      for (int i = 0; i < children.Count; i++) {
+        xBoundaries[i + 1] = (int)(xBoundaries[i] + (width * (double)GetLength(children[i])) / (GetLength(node) - 1));
+        RecursiveLayout(nodeMap[children[i]], xBoundaries[i], y + height, xBoundaries[i + 1] - xBoundaries[i], height);
+      }
+    }
+
+    public IEnumerable<VisualTreeNode<T>> GetVisualNodes() {
+      return nodeMap.Values;
+    }
+  }
+}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ILayoutEngine.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ILayoutEngine.cs	(revision 10524)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ILayoutEngine.cs	(revision 10524)
@@ -0,0 +1,27 @@
+﻿
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
+  interface ILayoutEngine<T> where T : class {
+    int NodeWidth { get; set; }
+    int NodeHeight { get; set; }
+    int HorizontalSpacing { get; set; }
+    int VerticalSpacing { get; set; }
+
+    void CalculateLayout();
+    void CalculateLayout(float width, float height);
+    void Initialize(T root, Func<T, IEnumerable<T>> getChildren, Func<T, int> getLength = null, Func<T, int> getDepth = null);
+    void Clear();
+    void Reset();
+
+    // function members necessary to navigate the tree structure
+    Func<T, IEnumerable<T>> GetChildren { get; set; }
+    Func<T, int> GetLength { get; set; }
+    Func<T, int> GetDepth { get; set; }
+
+    IEnumerable<VisualTreeNode<T>> GetVisualNodes();
+    Dictionary<T, PointF> GetCoordinates();
+  }
+}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/LayoutNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/LayoutNode.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/LayoutNode.cs	(revision 10524)
@@ -25,5 +25,5 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
-  public class LayoutNode<T> where T : class {
+  public class LayoutNode<T> : object where T : class {
     public float Width { get; set; }
     public float Height { get; set; }
@@ -78,4 +78,31 @@
       }
     }
+    /// <summary>
+    /// Translate the position of the layout node according to the given offsets
+    /// </summary>
+    /// <param name="dx"></param>
+    /// <param name="dy"></param>
+    public void Translate(float dx, float dy) {
+      X += dx;
+      Y += dy;
+    }
+
+    public void ResetCoordinates() {
+      X = 0;
+      Y = 0;
+    }
+
+    /// <summary>
+    /// Reset layout-related parameters
+    /// </summary>
+    public void Reset() {
+      Ancestor = this;
+      Thread = null;
+      Change = 0;
+      Shift = 0;
+      Prelim = 0;
+      Mod = 0;
+      ResetCoordinates();
+    }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/LayoutEngines/ReingoldTilfordLayoutEngine.cs	(revision 10524)
@@ -6,8 +6,24 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
-  public class ReingoldTilfordLayoutEngine<T> where T : class {
+  public class ReingoldTilfordLayoutEngine<T> : ILayoutEngine<T> where T : class {
     private readonly Dictionary<T, LayoutNode<T>> nodeMap; // provides a reverse mapping T => LayoutNode
     public int NodeWidth { get; set; }
     public int NodeHeight { get; set; }
+    private int minHorizontalSpacing = 5;
+    public int HorizontalSpacing {
+      get { return minHorizontalSpacing; }
+      set { minHorizontalSpacing = value; }
+    }
+
+    private int minVerticalSpacing = 5;
+    public int VerticalSpacing {
+      get { return minVerticalSpacing; }
+      set { minVerticalSpacing = value; }
+    }
+
+    public Func<T, IEnumerable<T>> GetChildren { get; set; }
+    public Func<T, int> GetLength { get; set; }
+    public Func<T, int> GetDepth { get; set; }
+    private LayoutNode<T> layoutRoot;
 
     public ReingoldTilfordLayoutEngine() {
@@ -15,10 +31,49 @@
     }
 
-    public Dictionary<T, LayoutNode<T>> NodeMap { get { return nodeMap; } }
+    public ReingoldTilfordLayoutEngine(T root, Func<T, IEnumerable<T>> childrenFunc)
+      : this() {
+      Initialize(root, childrenFunc);
+    }
+
+    public void Initialize(T root, Func<T, IEnumerable<T>> getChildren, Func<T, int> getLength = null, Func<T, int> getDepth = null) {
+      GetChildren = getChildren;
+      Clear();
+      var node = new LayoutNode<T> { Content = root, Width = NodeWidth, Height = NodeHeight };
+      node.Ancestor = node;
+      layoutRoot = node;
+      Expand(node);
+    }
+
+    private void Expand(LayoutNode<T> lRoot) {
+      nodeMap.Add(lRoot.Content, lRoot);
+      var children = GetChildren(lRoot.Content).ToList();
+      if (!children.Any()) return;
+      lRoot.Children = new List<LayoutNode<T>>(children.Count);
+      for (int i = 0; i < children.Count; ++i) {
+        var node = new LayoutNode<T> {
+          Content = children[i],
+          Number = i,
+          Parent = lRoot,
+          Level = lRoot.Level + 1,
+          Width = NodeWidth,
+          Height = NodeHeight
+        };
+        node.Ancestor = node;
+        lRoot.Children.Add(node);
+        Expand(node);
+      }
+    }
+
+    public IEnumerable<VisualTreeNode<T>> GetVisualNodes() {
+      return nodeMap.Values.Select(x => new VisualTreeNode<T>(x.Content) {
+        Width = (int)Math.Round(x.Width),
+        Height = (int)Math.Round(x.Height),
+        X = (int)Math.Round(x.X),
+        Y = (int)Math.Round(x.Y)
+      });
+    }
 
     public void AddNode(T content) {
-      if (nodeMap.ContainsKey(content)) {
-        throw new ArgumentException("Content already present in the dictionary.");
-      }
+      if (nodeMap.ContainsKey(content)) { throw new ArgumentException("Content already present in the dictionary."); }
       var node = new LayoutNode<T> { Content = content };
       nodeMap.Add(content, node);
@@ -27,7 +82,5 @@
     public void AddNode(LayoutNode<T> node) {
       var content = node.Content;
-      if (nodeMap.ContainsKey(content)) {
-        throw new ArgumentException("Content already present in the dictionary.");
-      }
+      if (nodeMap.ContainsKey(content)) { throw new ArgumentException("Content already present in the dictionary."); }
       nodeMap.Add(content, node);
     }
@@ -44,27 +97,12 @@
     }
 
-    private float minHorizontalSpacing = 5;
-    public float MinHorizontalSpacing {
-      get { return minHorizontalSpacing; }
-      set { minHorizontalSpacing = value; }
-    }
-
-    private float minVerticalSpacing = 5;
-    public float MinVerticalSpacing {
-      get { return minVerticalSpacing; }
-      set { minVerticalSpacing = value; }
-    }
-
-    private LayoutNode<T> root;
-    public LayoutNode<T> Root {
-      get { return root; }
-      set { root = value; }
-    }
-
     public void ResetCoordinates() {
       foreach (var node in nodeMap.Values) {
-        node.X = 0;
-        node.Y = 0;
-      }
+        node.ResetCoordinates();
+      }
+    }
+
+    public Dictionary<T, PointF> GetCoordinates() {
+      return nodeMap.ToDictionary(x => x.Key, x => new PointF(x.Value.X, x.Value.Y));
     }
 
@@ -73,17 +111,26 @@
     /// </summary>
     private void NormalizeCoordinates() {
-      var list = nodeMap.Values.ToList();
+      var nodes = nodeMap.Values.ToList();
       float xmin = 0, ymin = 0;
-      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) {
-        list[i].X -= xmin;
-        list[i].Y -= ymin;
-      }
-    }
-
-    public void FitToBounds(int width, int height) {
+      foreach (var node in nodes) {
+        if (xmin > node.X) xmin = node.X;
+        if (ymin > node.Y) ymin = node.Y;
+      }
+      foreach (var node in nodes) {
+        node.X -= xmin;
+        node.Y -= ymin;
+      }
+    }
+
+    public void Center(float width, float height) {
+      // center layout on screen
+      var bounds = Bounds();
+      float dx = 0, dy = 0;
+      if (width > bounds.Width) { dx = (width - bounds.Width) / 2f; }
+      if (height > bounds.Height) { dy = (height - bounds.Height) / 2f; }
+      foreach (var node in nodeMap.Values) { node.Translate(dx, dy); }
+    }
+
+    public void FitToBounds(float width, float height) {
       var bounds = Bounds();
       var myWidth = bounds.Width;
@@ -110,48 +157,49 @@
             node.X += (node.Width - w) / 2f;
             node.Width = w;
+            //this is a simple solution to ensure that the leftmost and rightmost nodes are not drawn partially offscreen due to scaling and offset
+            //this should work well enough 99.9% of the time with no noticeable visual difference
             if (node.X < 0) {
-              // if the adjustment would put the node partially offscreen, we reduce the node width a little bit 
-              // this is a simple solution which should work 99% of the time with no noticeable difference
               node.Width += node.X;
-              node.X = Math.Abs(node.X) / 2f;
+              node.X = 0;
+            } else if (node.X + node.Width > width) {
+              node.Width = width - node.X;
             }
           }
         }
       }
+      if (myHeight > height) {
+        // need to scale vertically
+        float x = height / myHeight;
+        foreach (var node in layers.SelectMany(g => g)) {
+          node.Y *= x;
+          node.Height *= x;
+        }
+      }
+    }
+
+    public void Clear() {
+      layoutRoot = null;
+      nodeMap.Clear();
     }
 
     public void Reset() {
-      root = null;
-      nodeMap.Clear();
-    }
-
-    public void ResetParameters() {
       foreach (var layoutNode in nodeMap.Values) {
         // reset layout-related parameters 
-        layoutNode.Ancestor = layoutNode;
-        layoutNode.Thread = null;
-        layoutNode.Change = 0;
-        layoutNode.Shift = 0;
-        layoutNode.Prelim = 0;
-        layoutNode.Mod = 0;
+        layoutNode.Reset();
       }
     }
 
     public void CalculateLayout() {
-      if (root == null)
-        throw new Exception("Root cannot be null.");
-      ResetCoordinates(); // reset node X,Y coordinates
-      ResetParameters(); // reset node parameters like Mod, Shift etc. 
-      FirstWalk(root);
-      SecondWalk(root, -root.Prelim);
+      if (layoutRoot == null) throw new Exception("Layout layoutRoot cannot be null.");
+      Reset(); // reset node parameters like Mod, Shift etc. and set coordinates to 0
+      FirstWalk(layoutRoot);
+      SecondWalk(layoutRoot, -layoutRoot.Prelim);
       NormalizeCoordinates();
     }
 
-    /// <summary>
-    /// Returns a map of coordinates for each LayoutNode in the symbolic expression tree.
-    /// </summary>
-    /// <returns></returns>
-    public Dictionary<T, PointF> GetNodeCoordinates() {
-      return nodeMap.ToDictionary(x => x.Key, x => new PointF(x.Value.X, x.Value.Y));
+    public void CalculateLayout(float width, float height) {
+      CalculateLayout();
+      FitToBounds(width, height);
+      Center(width, height);
     }
 
@@ -163,6 +211,6 @@
       float xmin = 0, xmax = 0, ymin = 0, ymax = 0;
       var list = nodeMap.Values.ToList();
-      for (int i = 0; i < list.Count; ++i) {
-        float x = list[i].X, y = list[i].Y;
+      foreach (LayoutNode<T> node in list) {
+        float x = node.X, y = node.Y;
         if (xmin > x) xmin = x;
         if (xmax < x) xmax = x;
@@ -173,4 +221,5 @@
     }
 
+    #region methods specific to the reingold-tilford layout algorithm
     private void FirstWalk(LayoutNode<T> v) {
       LayoutNode<T> w;
@@ -280,4 +329,5 @@
       return ancestor.Parent == v.Parent ? ancestor : null;
     }
+    #endregion
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionGrammarAllowedChildSymbolsControl.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionGrammarAllowedChildSymbolsControl.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionGrammarAllowedChildSymbolsControl.cs	(revision 10524)
@@ -29,4 +29,6 @@
 using HeuristicLab.PluginInfrastructure;
 
+using VisualSymbolicExpressionTreeNode = HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.VisualTreeNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>;
+
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
   public sealed partial class SymbolicExpressionGrammarAllowedChildSymbolsControl : UserControl {
@@ -162,5 +164,5 @@
 
       VisualSymbolicExpressionTreeNode clickedNode = (VisualSymbolicExpressionTreeNode)sender;
-      var selectedNode = clickedNode.SymbolicExpressionTreeNode;
+      var selectedNode = clickedNode.Content;
       if (selectedNode.SubtreeCount == 0) {
         if (!selectedSymbolicExpressionTreeNodes.Contains(selectedNode))
@@ -207,5 +209,5 @@
         var visualNode = symbolicExpressionTreeChart.FindVisualSymbolicExpressionTreeNodeAt(coordinates.X, coordinates.Y);
         if (visualNode != null) {
-          var node = visualNode.SymbolicExpressionTreeNode;
+          var node = visualNode.Content;
           var root = symbolicExpressionTreeChart.Tree.Root;
           if (node == root || node.Parent == root) e.Effect = DragDropEffects.Copy;
@@ -223,5 +225,5 @@
       var symbols = data as IEnumerable<ISymbol>;
 
-      if (node.SymbolicExpressionTreeNode == root) {
+      if (node.Content == root) {
         if (symbol != null)
           Grammar.AddAllowedChildSymbol(root.Symbol, symbol);
@@ -229,5 +231,5 @@
           foreach (var s in symbols) Grammar.AddAllowedChildSymbol(root.Symbol, s);
       } else {
-        int argumentIndex = root.IndexOfSubtree(node.SymbolicExpressionTreeNode);
+        int argumentIndex = root.IndexOfSubtree(node.Content);
         if (symbol != null)
           Grammar.AddAllowedChildSymbol(root.Symbol, symbol, argumentIndex);
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 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.Designer.cs	(revision 10524)
@@ -49,6 +49,9 @@
       this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
       this.saveImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.exportPgfLaTeXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.layoutEngineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.reingoldTilfordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.boxesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
-      this.exportPgfLaTeXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.contextMenuStrip.SuspendLayout();
       this.SuspendLayout();
@@ -58,5 +61,6 @@
       this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.saveImageToolStripMenuItem,
-            this.exportPgfLaTeXToolStripMenuItem});
+            this.exportPgfLaTeXToolStripMenuItem,
+            this.layoutEngineToolStripMenuItem});
       this.contextMenuStrip.Name = "contextMenuStrip";
       this.contextMenuStrip.Size = new System.Drawing.Size(166, 70);
@@ -65,11 +69,7 @@
       // 
       this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem";
-      this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
       this.saveImageToolStripMenuItem.Text = "Save Image";
       this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click);
-      // 
-      // saveFileDialog
-      // 
-      this.saveFileDialog.Filter = "Bitmap (*.bmp)|*.bmp|EMF (*.emf)|*.emf";
       // 
       // exportPgfLaTeXToolStripMenuItem
@@ -79,4 +79,31 @@
       this.exportPgfLaTeXToolStripMenuItem.Text = "Export Pgf/LaTeX";
       this.exportPgfLaTeXToolStripMenuItem.Click += new System.EventHandler(this.exportLatexToolStripMenuItem_Click);
+      // 
+      // layoutEngineToolStripMenuItem
+      // 
+      this.layoutEngineToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.reingoldTilfordToolStripMenuItem,
+            this.boxesToolStripMenuItem});
+      this.layoutEngineToolStripMenuItem.Name = "layoutEngineToolStripMenuItem";
+      this.layoutEngineToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
+      this.layoutEngineToolStripMenuItem.Text = "Layout Engine:";
+      // 
+      // reingoldTilfordToolStripMenuItem
+      // 
+      this.reingoldTilfordToolStripMenuItem.Name = "reingoldTilfordToolStripMenuItem";
+      this.reingoldTilfordToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+      this.reingoldTilfordToolStripMenuItem.Text = "Reingold-Tilford";
+      this.reingoldTilfordToolStripMenuItem.Click += new System.EventHandler(this.reingoldTilfordToolStripMenuItem_Click);
+      // 
+      // boxesToolStripMenuItem
+      // 
+      this.boxesToolStripMenuItem.Name = "boxesToolStripMenuItem";
+      this.boxesToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+      this.boxesToolStripMenuItem.Text = "Boxes";
+      this.boxesToolStripMenuItem.Click += new System.EventHandler(this.boxesToolStripMenuItem_Click);
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.Filter = "Bitmap (*.bmp)|*.bmp|EMF (*.emf)|*.emf";
       // 
       // SymbolicExpressionTreeChart
@@ -103,4 +130,7 @@
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
     private System.Windows.Forms.ToolStripMenuItem exportPgfLaTeXToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem layoutEngineToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem reingoldTilfordToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem boxesToolStripMenuItem;
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 10524)
@@ -33,14 +33,12 @@
     private Image image;
     private readonly StringFormat stringFormat;
-    private Dictionary<ISymbolicExpressionTreeNode, VisualSymbolicExpressionTreeNode> visualTreeNodes;
-    private Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection> visualLines;
-    private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> layoutEngine;
-    private readonly SymbolicExpressionTreeLayoutAdapter layoutAdapter;
+    private Dictionary<ISymbolicExpressionTreeNode, VisualTreeNode<ISymbolicExpressionTreeNode>> visualTreeNodes;
+    private Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection> visualLines;
+    private ILayoutEngine<ISymbolicExpressionTreeNode> layoutEngine;
 
     private const int preferredNodeWidth = 70;
     private const int preferredNodeHeight = 46;
-    private const int minHorizontalDistance = 20;
-    private const int minVerticalDistance = 20;
-
+    private const int minHorizontalDistance = 30;
+    private const int minVerticalDistance = 30;
 
     public SymbolicExpressionTreeChart() {
@@ -52,12 +50,15 @@
       this.backgroundColor = Color.White;
       this.textFont = new Font(FontFamily.GenericSansSerif, 12);
-      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-      layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
+      //      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
+      layoutEngine = new BoxesLayoutEngine<ISymbolicExpressionTreeNode> {
+        NodeWidth = preferredNodeWidth,
+        NodeHeight = preferredNodeHeight,
+        HorizontalSpacing = minHorizontalDistance,
+        VerticalSpacing = minVerticalDistance
+      };
     }
 
     public SymbolicExpressionTreeChart(ISymbolicExpressionTree tree)
       : this() {
-      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-      layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
       this.Tree = tree;
     }
@@ -105,16 +106,7 @@
       set {
         tree = value;
-        visualTreeNodes = new Dictionary<ISymbolicExpressionTreeNode, VisualSymbolicExpressionTreeNode>();
-        visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection>();
         if (tree != null) {
-          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();
-          }
-        }
-        Repaint();
+          Repaint();
+        }
       }
     }
@@ -160,5 +152,5 @@
     }
 
-    public void RepaintNode(VisualSymbolicExpressionTreeNode visualNode) {
+    public void RepaintNode(VisualTreeNode<ISymbolicExpressionTreeNode> visualNode) {
       if (!suspendRepaint) {
         using (var graphics = Graphics.FromImage(image)) {
@@ -182,5 +174,5 @@
     }
 
-    public VisualSymbolicExpressionTreeNode GetVisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode) {
+    public VisualTreeNode<ISymbolicExpressionTreeNode> GetVisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode) {
       if (visualTreeNodes.ContainsKey(symbolicExpressionTreeNode))
         return visualTreeNodes[symbolicExpressionTreeNode];
@@ -188,8 +180,8 @@
     }
 
-    public VisualSymbolicExpressionTreeNodeConnection GetVisualSymbolicExpressionTreeNodeConnection(ISymbolicExpressionTreeNode parent, ISymbolicExpressionTreeNode child) {
+    public VisualTreeNodeConnection GetVisualSymbolicExpressionTreeNodeConnection(ISymbolicExpressionTreeNode parent, ISymbolicExpressionTreeNode child) {
       if (child.Parent != parent) throw new ArgumentException();
       var key = Tuple.Create(parent, child);
-      VisualSymbolicExpressionTreeNodeConnection connection = null;
+      VisualTreeNodeConnection connection = null;
       visualLines.TryGetValue(key, out connection);
       return connection;
@@ -205,5 +197,5 @@
 
     protected virtual void SymbolicExpressionTreeChart_MouseClick(object sender, MouseEventArgs e) {
-      VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
+      var visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
       if (visualTreeNode != null) {
         OnSymbolicExpressionTreeNodeClicked(visualTreeNode, e);
@@ -219,5 +211,5 @@
 
     protected virtual void SymbolicExpressionTreeChart_MouseDoubleClick(object sender, MouseEventArgs e) {
-      VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
+      VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
       if (visualTreeNode != null)
         OnSymbolicExpressionTreeNodeDoubleClicked(visualTreeNode, e);
@@ -231,5 +223,5 @@
     }
 
-    private VisualSymbolicExpressionTreeNode draggedSymbolicExpressionTree;
+    private VisualTreeNode<ISymbolicExpressionTreeNode> draggedSymbolicExpressionTree;
     private MouseButtons dragButtons;
     private void SymbolicExpressionTreeChart_MouseDown(object sender, MouseEventArgs e) {
@@ -243,5 +235,5 @@
 
     private void SymbolicExpressionTreeChart_MouseMove(object sender, MouseEventArgs e) {
-      VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
+      VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
       if (draggedSymbolicExpressionTree != null &&
         draggedSymbolicExpressionTree != visualTreeNode) {
@@ -258,5 +250,5 @@
     }
 
-    public VisualSymbolicExpressionTreeNode FindVisualSymbolicExpressionTreeNodeAt(int x, int y) {
+    public VisualTreeNode<ISymbolicExpressionTreeNode> FindVisualSymbolicExpressionTreeNodeAt(int x, int y) {
       foreach (var visualTreeNode in visualTreeNodes.Values) {
         if (x >= visualTreeNode.X && x <= visualTreeNode.X + visualTreeNode.Width &&
@@ -269,59 +261,26 @@
 
     #region methods for painting the symbolic expression tree
-    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];
-      layoutEngine.AddNodes(layoutNodes);
-      layoutEngine.MinHorizontalSpacing = (preferredWidth + minHDistance);
-      layoutEngine.MinVerticalSpacing = (preferredHeight + minVDistance);
-      layoutEngine.CalculateLayout();
-      var bounds = layoutEngine.Bounds();
-
-      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 = 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);
-        }
-      }
-      // draw node connections
-      foreach (var visualNode in visualTreeNodes.Values) {
-        var node = visualNode.SymbolicExpressionTreeNode;
+    private void DrawFunctionTree(ISymbolicExpressionTree symbExprTree, Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) {
+      var root = symbExprTree.Root;
+      var actualRoot = root.SubtreeCount == 1 ? root.GetSubtree(0) : root;
+      layoutEngine.NodeWidth = preferredWidth;
+      layoutEngine.NodeHeight = preferredHeight;
+      layoutEngine.HorizontalSpacing = minHDistance;
+      layoutEngine.VerticalSpacing = minVDistance;
+      layoutEngine.Initialize(actualRoot, n => n.Subtrees, n => n.GetLength(), n => n.GetDepth());
+      layoutEngine.CalculateLayout(Width, Height);
+
+      var visualNodes = layoutEngine.GetVisualNodes().ToList();
+      visualTreeNodes = visualNodes.ToDictionary(x => x.Content, x => x);
+      visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection>();
+      foreach (var node in visualNodes.Select(n => n.Content)) {
+        foreach (var subtree in node.Subtrees) {
+          visualLines.Add(new Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(node, subtree), new VisualTreeNodeConnection());
+        }
+      }
+      // draw nodes and connections
+      foreach (var visualNode in visualNodes) {
+        DrawTreeNode(visualNode);
+        var node = visualNode.Content;
         foreach (var subtree in node.Subtrees) {
           var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(node, subtree);
@@ -338,5 +297,5 @@
     }
 
-    protected void DrawTreeNode(VisualSymbolicExpressionTreeNode visualTreeNode) {
+    protected void DrawTreeNode(VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode) {
       using (var graphics = Graphics.FromImage(image)) {
         graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
@@ -346,8 +305,8 @@
     }
 
-    protected void DrawTreeNode(Graphics graphics, VisualSymbolicExpressionTreeNode visualTreeNode) {
+    protected void DrawTreeNode(Graphics graphics, VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode) {
       graphics.Clip = new Region(new Rectangle(visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width + 1, visualTreeNode.Height + 1));
       graphics.Clear(backgroundColor);
-      var node = visualTreeNode.SymbolicExpressionTreeNode;
+      var node = visualTreeNode.Content;
       using (var textBrush = new SolidBrush(visualTreeNode.TextColor))
       using (var nodeLinePen = new Pen(visualTreeNode.LineColor))
@@ -408,4 +367,24 @@
     }
     #endregion
+
+    private void reingoldTilfordToolStripMenuItem_Click(object sender, EventArgs e) {
+      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
+        NodeWidth = preferredNodeWidth,
+        NodeHeight = preferredNodeHeight,
+        HorizontalSpacing = minHorizontalDistance,
+        VerticalSpacing = minVerticalDistance
+      };
+      Repaint();
+    }
+
+    private void boxesToolStripMenuItem_Click(object sender, EventArgs e) {
+      layoutEngine = new BoxesLayoutEngine<ISymbolicExpressionTreeNode> {
+        NodeWidth = preferredNodeWidth,
+        NodeHeight = preferredNodeHeight,
+        HorizontalSpacing = minHorizontalDistance,
+        VerticalSpacing = minVerticalDistance
+      };
+      Repaint();
+    }
   }
 }
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeTile.cs	(revision 10524)
@@ -24,5 +24,6 @@
 using System.Linq;
 using HeuristicLab.Visualization;
-using HeuristicLab.Visualization.Primitives;
+
+using Rectangle = HeuristicLab.Visualization.Rectangle;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
@@ -40,5 +41,4 @@
 
     public ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> LayoutEngine { get; set; }
-    public SymbolicExpressionTreeLayoutAdapter LayoutAdapter { get; set; }
     public SymbolicExpressionTreeTile(IChart chart) : base(chart) { }
     public SymbolicExpressionTreeTile(IChart chart, ISymbolicExpressionTree tree)
@@ -50,21 +50,22 @@
     private void GeneratePrimitives(double preferredNodeWidth, double preferredNodeHeight) {
       Clear();
-      var layoutNodes = LayoutAdapter.Convert(SymbolicExpressionTree).ToList();
-      layoutNodes.RemoveAt(0);
-      LayoutEngine.Root = layoutNodes[0];
+      LayoutEngine.Initialize(SymbolicExpressionTree.Root, node => node.Subtrees);
       LayoutEngine.CalculateLayout();
 
-      var primitivesMap = new Dictionary<LayoutNode<ISymbolicExpressionTreeNode>, IPrimitive>(); // both Ellipse and Rectangle are derived from the RectangularPrimitiveBase
+      var primitivesMap = new Dictionary<ISymbolicExpressionTreeNode, IPrimitive>(); // both Ellipse and Rectangle are derived from the RectangularPrimitiveBase
       var font = new Font(FontFamily.GenericSansSerif, 10, GraphicsUnit.Pixel);
 
-      foreach (var node in layoutNodes) {
-        var lowerLeft = new PointD(node.X, node.Y);
-        var upperRight = new PointD(node.X + preferredNodeWidth, node.Y + preferredNodeHeight);
+      var visualNodes = LayoutEngine.GetVisualNodes().ToList();
+      var visualNodeMap = visualNodes.ToDictionary(x => x.Content, x => x);
 
+      foreach (var visualNode in visualNodes) {
+        var lowerLeft = new PointD(visualNode.X, visualNode.Y);
+        var upperRight = new PointD(visualNode.X + preferredNodeWidth, visualNode.Y + preferredNodeHeight);
+        var node = visualNode.Content;
         RectangularPrimitiveBase rectangularPrimitive;
-        if (node.IsLeaf) {
-          rectangularPrimitive = new LabeledRectangle(Chart, lowerLeft, upperRight) { Font = font, Text = node.Content.ToString() };
+        if (node.SubtreeCount == 0) {
+          rectangularPrimitive = new Rectangle(Chart, lowerLeft, upperRight) { Font = font, Text = visualNode.Content.ToString() };
         } else {
-          rectangularPrimitive = new LabeledEllipse(Chart, lowerLeft, upperRight) { Font = font, Text = node.Content.ToString() };
+          rectangularPrimitive = new Ellipse(Chart, lowerLeft, upperRight) { Font = font, Text = visualNode.Content.ToString() };
         }
 
@@ -73,6 +74,7 @@
       }
 
-      foreach (var node in layoutNodes.Where(n => n.Children != null)) {
-        foreach (var child in node.Children) {
+      foreach (var node in visualNodes.Where(n => n.Content.SubtreeCount > 0)) {
+        var parent = node.Content;
+        foreach (var child in parent.Subtrees.Select(x => visualNodeMap[x])) {
           var start = new PointD(node.X + preferredNodeWidth / 2, node.Y + preferredNodeHeight);
           var end = new PointD(child.X + preferredNodeWidth / 2, child.Y);
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualSymbolicExpressionTreeNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualSymbolicExpressionTreeNode.cs	(revision 10519)
+++ 	(revision )
@@ -1,129 +1,0 @@
-﻿#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.Drawing;
-
-namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
-  public class VisualSymbolicExpressionTreeNode : object {
-    private static readonly Color defaultLineColor = Color.Black;
-    private static readonly Color defaultTextColor = Color.Black;
-    private static readonly Color defaultFillColor = Color.White;
-    private const int defaultPreferredWidth = 70;
-    private const int defaultPreferredHeight = 46;
-
-    public VisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode) :
-      this(symbolicExpressionTreeNode, defaultLineColor) {
-    }
-
-    public VisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode, Color lineColor) :
-      this(symbolicExpressionTreeNode, lineColor, defaultTextColor) {
-    }
-
-    public VisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode, Color lineColor, Color textColor) :
-      this(symbolicExpressionTreeNode, lineColor, textColor, defaultFillColor) {
-    }
-
-    public VisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode, Color lineColor, Color textColor, Color fillColor) :
-      this(symbolicExpressionTreeNode, lineColor, textColor, fillColor, defaultPreferredWidth, defaultPreferredHeight) {
-    }
-
-    public VisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode, Color lineColor, Color textColor, Color fillColor, int width, int height) {
-      this.symbolicExpressionTreeNode = symbolicExpressionTreeNode;
-      this.lineColor = lineColor;
-      this.textColor = textColor;
-      this.fillColor = fillColor;
-      this.preferredWidth = width;
-      this.preferredHeight = height;
-      this.ToolTip = symbolicExpressionTreeNode.ToString();
-    }
-
-    #region members for internal use only
-    private int x;
-    public int X {
-      get { return x; }
-      internal set { this.x = value; }
-    }
-
-    private int y;
-    public int Y {
-      get { return y; }
-      internal set { this.y = value; }
-    }
-
-    private int width;
-    public int Width {
-      get { return this.width; }
-      internal set { this.width = value; }
-    }
-
-    private int height;
-    public int Height {
-      get { return this.height; }
-      internal set { this.height = value; }
-    }
-    #endregion
-
-    private ISymbolicExpressionTreeNode symbolicExpressionTreeNode;
-    public ISymbolicExpressionTreeNode SymbolicExpressionTreeNode {
-      get { return this.symbolicExpressionTreeNode; }
-      set {
-        symbolicExpressionTreeNode = value;
-        ToolTip = SymbolicExpressionTreeNode.ToString();
-      }
-    }
-
-    private int preferredWidth;
-    public int PreferredWidth {
-      get { return this.preferredWidth; }
-      set { this.preferredWidth = value; }
-    }
-
-    private int preferredHeight;
-    public int PreferredHeight {
-      get { return this.preferredHeight; }
-      set { this.preferredHeight = value; }
-    }
-
-    private Color lineColor;
-    public Color LineColor {
-      get { return this.lineColor; }
-      set { this.lineColor = value; }
-    }
-
-    private Color textColor;
-    public Color TextColor {
-      get { return this.textColor; }
-      set { this.textColor = value; }
-    }
-
-    private Color fillColor;
-    public Color FillColor {
-      get { return this.fillColor; }
-      set { this.fillColor = value; }
-    }
-
-    private string toolTip;
-    public string ToolTip {
-      get { return toolTip; }
-      set { toolTip = value; }
-    }
-  }
-}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualSymbolicExpressionTreeNodeConnection.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualSymbolicExpressionTreeNodeConnection.cs	(revision 10519)
+++ 	(revision )
@@ -1,48 +1,0 @@
-﻿#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.Drawing;
-using System.Drawing.Drawing2D;
-
-namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
-  public class VisualSymbolicExpressionTreeNodeConnection : object {
-    private static readonly Color defaultLineColor = Color.Black;
-    private static readonly DashStyle defaultDashStyle = DashStyle.Solid;
-
-    private Color lineColor;
-    public Color LineColor {
-      get { return lineColor; }
-      set { lineColor = value; }
-    }
-
-    private DashStyle dashStyle;
-    public DashStyle DashStyle {
-      get { return dashStyle; }
-      set { dashStyle = value; }
-    }
-
-    public VisualSymbolicExpressionTreeNodeConnection()
-      : base() {
-      lineColor = defaultLineColor;
-      dashStyle = defaultDashStyle;
-    }
-  }
-}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNode.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNode.cs	(revision 10524)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNode.cs	(revision 10524)
@@ -0,0 +1,129 @@
+﻿#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.Drawing;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
+  public class VisualTreeNode<T> where T : class {
+    private static readonly Color defaultLineColor = Color.Black;
+    private static readonly Color defaultTextColor = Color.Black;
+    private static readonly Color defaultFillColor = Color.White;
+    private const int defaultPreferredWidth = 70;
+    private const int defaultPreferredHeight = 46;
+
+    public VisualTreeNode(T content) :
+      this(content, defaultLineColor) {
+    }
+
+    public VisualTreeNode(T content, Color lineColor) :
+      this(content, lineColor, defaultTextColor) {
+    }
+
+    public VisualTreeNode(T content, Color lineColor, Color textColor) :
+      this(content, lineColor, textColor, defaultFillColor) {
+    }
+
+    public VisualTreeNode(T content, Color lineColor, Color textColor, Color fillColor) :
+      this(content, lineColor, textColor, fillColor, defaultPreferredWidth, defaultPreferredHeight) {
+    }
+
+    public VisualTreeNode(T content, Color lineColor, Color textColor, Color fillColor, int width, int height) {
+      this.content = content;
+      this.lineColor = lineColor;
+      this.textColor = textColor;
+      this.fillColor = fillColor;
+      this.preferredWidth = width;
+      this.preferredHeight = height;
+      this.ToolTip = content.ToString();
+    }
+
+    #region members for internal use only
+    private int x;
+    public int X {
+      get { return x; }
+      internal set { this.x = value; }
+    }
+
+    private int y;
+    public int Y {
+      get { return y; }
+      internal set { this.y = value; }
+    }
+
+    private int width;
+    public int Width {
+      get { return this.width; }
+      internal set { this.width = value; }
+    }
+
+    private int height;
+    public int Height {
+      get { return this.height; }
+      internal set { this.height = value; }
+    }
+    #endregion
+
+    private T content;
+    public T Content {
+      get { return this.content; }
+      set {
+        content = value;
+        ToolTip = Content.ToString();
+      }
+    }
+
+    private int preferredWidth;
+    public int PreferredWidth {
+      get { return this.preferredWidth; }
+      set { this.preferredWidth = value; }
+    }
+
+    private int preferredHeight;
+    public int PreferredHeight {
+      get { return this.preferredHeight; }
+      set { this.preferredHeight = value; }
+    }
+
+    private Color lineColor;
+    public Color LineColor {
+      get { return this.lineColor; }
+      set { this.lineColor = value; }
+    }
+
+    private Color textColor;
+    public Color TextColor {
+      get { return this.textColor; }
+      set { this.textColor = value; }
+    }
+
+    private Color fillColor;
+    public Color FillColor {
+      get { return this.fillColor; }
+      set { this.fillColor = value; }
+    }
+
+    private string toolTip;
+    public string ToolTip {
+      get { return toolTip; }
+      set { toolTip = value; }
+    }
+  }
+}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNodeConnection.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNodeConnection.cs	(revision 10524)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/VisualTreeNodeConnection.cs	(revision 10524)
@@ -0,0 +1,48 @@
+﻿#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.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
+  public class VisualTreeNodeConnection : object {
+    private static readonly Color defaultLineColor = Color.Black;
+    private static readonly DashStyle defaultDashStyle = DashStyle.Solid;
+
+    private Color lineColor;
+    public Color LineColor {
+      get { return lineColor; }
+      set { lineColor = value; }
+    }
+
+    private DashStyle dashStyle;
+    public DashStyle DashStyle {
+      get { return dashStyle; }
+      set { dashStyle = value; }
+    }
+
+    public VisualTreeNodeConnection()
+      : base() {
+      lineColor = defaultLineColor;
+      dashStyle = defaultDashStyle;
+    }
+  }
+}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Formatters/SymbolicExpressionTreeLatexFormatter.cs	(revision 10519)
+++ 	(revision )
@@ -1,98 +1,0 @@
-﻿#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;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [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> symbolNameMap = new Dictionary<string, string>
-    {
-      {"ProgramRootSymbol", "Prog"},
-      {"StartSymbol","RPB"}
-    };
-    private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-    private readonly SymbolicExpressionTreeLayoutAdapter layoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
-
-    public SymbolicExpressionTreeLatexFormatter()
-      : base("LaTeX/PDF Formatter", "Formatter for symbolic expression trees for use with latex package tikz.") {
-      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>();
-    }
-
-    protected SymbolicExpressionTreeLatexFormatter(SymbolicExpressionTreeLatexFormatter original, Cloner cloner)
-      : base(original, cloner) {
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new SymbolicExpressionTreeLatexFormatter(this, cloner);
-    }
-
-    public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
-      layoutEngine.Reset();
-      var layoutNodes = layoutAdapter.Convert(symbolicExpressionTree).ToList();
-      layoutEngine.Root = layoutNodes[0];
-      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 +
-                "\\begin{document}" + nl +
-                "\\begin{tikzpicture}" + nl +
-                "\\def\\ws{1}" + nl +
-                "\\def\\hs{0.7}" + nl);
-
-      var nodeIndices = new Dictionary<ISymbolicExpressionTreeNode, int>();
-      var nodes = symbolicExpressionTree.IterateNodesBreadth().ToList();
-      for (int i = 0; i < nodes.Count; ++i) {
-        var node = nodes[i];
-        nodeIndices.Add(node, i);
-        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)));
-      }
-
-      for (int i = 0; i < nodes.Count; ++i) {
-        foreach (var s in nodes[i].Subtrees) {
-          sb.AppendLine(string.Format(CultureInfo.InvariantCulture, "\\draw ({0}) -- ({1});", i, nodeIndices[s]));
-        }
-      }
-
-      sb.Append("\\end{tikzpicture}" + nl +
-                "\\end{document}" + nl);
-      return sb.ToString();
-    }
-
-    private static string EscapeLatexString(string s) {
-      return s.Replace("\\", "\\\\").Replace("{", "\\{").Replace("}", "\\}").Replace("_", "\\_");
-    }
-  }
-}
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 10524)
@@ -187,6 +187,4 @@
     <Compile Include="Formatters\SymbolicExpressionTreeGraphvizFormatter.cs" />
     <Compile Include="Formatters\SymbolicExpressionTreeHierarchicalFormatter.cs" />
-    <Compile Include="Formatters\SymbolicExpressionTreeLatexFormatter.cs" />
-    <Compile Include="Interfaces\ILayoutAdapter.cs" />
     <Compile Include="Interfaces\IReadOnlySymbol.cs" />
     <Compile Include="Interfaces\ISymbolicExpressionGrammar.cs" />
@@ -210,7 +208,4 @@
     <Compile Include="Interfaces\ISymbolicExpressionTreeStringFormatter.cs" />
     <Compile Include="Interfaces\Operators\ISymbolicExpressionTreeSizeConstraintOperator.cs" />
-    <Compile Include="LayoutEngines\LayoutNode.cs" />
-    <Compile Include="LayoutEngines\ReingoldTilfordLayoutEngine.cs" />
-    <Compile Include="LayoutEngines\SymbolicExpressionTreeLayoutAdapter.cs" />
     <Compile Include="Manipulators\ChangeNodeTypeManipulation.cs" />
     <Compile Include="Interfaces\Operators\ISymbolicExpressionTreeManipulator.cs" />
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 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 10524)
@@ -97,6 +97,6 @@
 
     private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) {
-      var visualNode = (VisualSymbolicExpressionTreeNode)sender;
-      var symbExprTreeNode = (SymbolicExpressionTreeNode)visualNode.SymbolicExpressionTreeNode;
+      var visualNode = (VisualTreeNode<ISymbolicExpressionTreeNode>)sender;
+      var symbExprTreeNode = (SymbolicExpressionTreeNode)visualNode.Content;
       if (symbExprTreeNode == null) return;
       var tree = Content.Model.SymbolicExpressionTree;
@@ -126,6 +126,6 @@
       double max = impacts.Max();
       double min = impacts.Min();
-      foreach (ISymbolicExpressionTreeNode treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) {
-        VisualSymbolicExpressionTreeNode visualTree = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode);
+      foreach (var treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) {
+        VisualTreeNode<ISymbolicExpressionTreeNode> visualTree = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode);
 
         if (!(treeNode is ConstantTreeNode) && nodeImpacts.ContainsKey(treeNode)) {
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs	(revision 10524)
@@ -33,5 +33,5 @@
   internal sealed partial class InteractiveSymbolicExpressionTreeChart : SymbolicExpressionTreeChart {
     private ISymbolicExpressionTreeNode tempNode; // node in clipboard (to be cut/copy/pasted etc)
-    private VisualSymbolicExpressionTreeNode currSelected; // currently selected node
+    private VisualTreeNode<ISymbolicExpressionTreeNode> currSelected; // currently selected node
     private enum EditOp { NoOp, CopySubtree, CutSubtree }
     private EditOp lastOp = EditOp.NoOp;
@@ -65,5 +65,5 @@
         pasteToolStripMenuItem.Visible = false;
       } else {
-        var node = currSelected.SymbolicExpressionTreeNode;
+        var node = currSelected.Content;
         insertNodeToolStripMenuItem.Visible = true;
         changeNodeToolStripMenuItem.Visible = true;
@@ -77,10 +77,10 @@
         pasteToolStripMenuItem.Enabled = tempNode != null && insertNodeToolStripMenuItem.Enabled
                                                           && !(lastOp == EditOp.CutSubtree
-                                                               && tempNode.IterateNodesBreadth().Contains(currSelected.SymbolicExpressionTreeNode));
+                                                               && tempNode.IterateNodesBreadth().Contains(currSelected.Content));
       }
     }
 
     protected override void OnSymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) {
-      currSelected = (VisualSymbolicExpressionTreeNode)sender; ;
+      currSelected = (VisualTreeNode<ISymbolicExpressionTreeNode>)sender; ;
       if (currSelected != null) {
         currSelected.LineColor = Color.FromArgb(130, currSelected.LineColor);
@@ -104,6 +104,6 @@
 
     private void insertNodeToolStripMenuItem_Click(object sender, EventArgs e) {
-      if (currSelected == null || currSelected.SymbolicExpressionTreeNode is SymbolicExpressionTreeTerminalNode) return;
-      var parent = currSelected.SymbolicExpressionTreeNode;
+      if (currSelected == null || currSelected.Content is SymbolicExpressionTreeTerminalNode) return;
+      var parent = currSelected.Content;
 
       using (var dialog = new InsertNodeDialog()) {
@@ -138,6 +138,6 @@
       if (currSelected == null) return;
 
-      var node = (ISymbolicExpressionTreeNode)currSelected.SymbolicExpressionTreeNode.Clone();
-      var originalNode = currSelected.SymbolicExpressionTreeNode;
+      var node = (ISymbolicExpressionTreeNode)currSelected.Content.Clone();
+      var originalNode = currSelected.Content;
 
       ISymbolicExpressionTreeNode newNode = null;
@@ -180,5 +180,5 @@
         }
       }
-      tempNode = currSelected.SymbolicExpressionTreeNode;
+      tempNode = currSelected.Content;
       foreach (var node in tempNode.IterateNodesPostfix()) {
         var visualNode = GetVisualSymbolicExpressionTreeNode(node);
@@ -194,5 +194,5 @@
     }
     private void removeNodeToolStripMenuItem_Click(object sender, EventArgs e) {
-      var node = currSelected.SymbolicExpressionTreeNode;
+      var node = currSelected.Content;
       if (node == tempNode) tempNode = null;
       ModifyTree(Tree, node.Parent, node, null, removeSubtree: false);
@@ -200,5 +200,5 @@
     }
     private void removeSubtreeToolStripMenuItem_Click(object sender, EventArgs e) {
-      var node = currSelected.SymbolicExpressionTreeNode;
+      var node = currSelected.Content;
       if (node.IterateNodesPostfix().Contains(tempNode)) tempNode = null;
       ModifyTree(Tree, node.Parent, node, null, removeSubtree: true);
@@ -209,5 +209,5 @@
       if (!(lastOp == EditOp.CopySubtree || lastOp == EditOp.CutSubtree)) return;
       // check if the copied/cut node (stored in the tempNode) can be inserted as a child of the current selected node
-      var node = currSelected.SymbolicExpressionTreeNode;
+      var node = currSelected.Content;
       if (node is ConstantTreeNode || node is VariableTreeNode) return;
       // check if the currently selected node can accept the copied node as a child 
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisExpressionLineageExplorerView.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisExpressionLineageExplorerView.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/SymbolicDataAnalysisExpressionLineageExplorerView.cs	(revision 10524)
@@ -15,5 +15,4 @@
   public partial class SymbolicDataAnalysisExpressionLineageExplorerView : AsynchronousContentView {
     private readonly ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> symbolicExpressionTreeNodeLayoutEngine;
-    private readonly SymbolicExpressionTreeLayoutAdapter symbolicExpressionTreeLayoutAdapter;
 
     private readonly Dictionary<TreeNode, ISymbolicExpressionTree> treeMap;
@@ -32,8 +31,9 @@
       InitializeComponent();
       symbolicExpressionTreeNodeLayoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
-        MinHorizontalSpacing = MinHorizontalSpacing + PreferredNodeWidth,
-        MinVerticalSpacing = MinVerticalSpacing + PreferredNodeHeight
+        HorizontalSpacing = MinHorizontalSpacing,
+        VerticalSpacing = MinVerticalSpacing,
+        NodeWidth = PreferredNodeWidth,
+        NodeHeight = PreferredNodeHeight
       };
-      symbolicExpressionTreeLayoutAdapter = new SymbolicExpressionTreeLayoutAdapter();
       treeMap = new Dictionary<TreeNode, ISymbolicExpressionTree>();
       double width = lineageExplorerChart.PreferredSize.Width;
@@ -74,5 +74,4 @@
       var chart = lineageExplorerChart.Chart;
       var tile = new SymbolicExpressionTreeTile(chart) {
-        LayoutAdapter = symbolicExpressionTreeLayoutAdapter,
         LayoutEngine = symbolicExpressionTreeNodeLayoutEngine,
         PreferredNodeWidth = PreferredNodeWidth,
Index: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs
===================================================================
--- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs	(revision 10519)
+++ branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs	(revision 10524)
@@ -48,5 +48,5 @@
       this.SuspendLayout();
       // 
-      // expressionTreeView
+      // symbolicExpressionTreeView
       // 
       this.symbolicExpressionTreeView.AllowDrop = true;
@@ -54,17 +54,17 @@
       this.symbolicExpressionTreeView.Content = null;
       this.symbolicExpressionTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.symbolicExpressionTreeView.Font = new System.Drawing.Font("Consolas", 8.25F);
       this.symbolicExpressionTreeView.Location = new System.Drawing.Point(0, 0);
-      this.symbolicExpressionTreeView.Name = "expressionTreeView";
+      this.symbolicExpressionTreeView.Name = "symbolicExpressionTreeView";
       this.symbolicExpressionTreeView.ReadOnly = false;
       this.symbolicExpressionTreeView.Size = new System.Drawing.Size(352, 413);
       this.symbolicExpressionTreeView.TabIndex = 0;
       // 
-      // SymbolicExpressionModelView
+      // TextualSymbolicDataAnalysisModelView
       // 
       this.AllowDrop = true;
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.symbolicExpressionTreeView);
-      this.Name = "SymbolicExpressionModelView";
+      this.Name = "TextualSymbolicDataAnalysisModelView";
       this.Size = new System.Drawing.Size(352, 413);
       this.ResumeLayout(false);
