Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 11118)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 11120)
@@ -52,4 +52,5 @@
       Content.ModelChanged += Content_Changed;
       Content.ProblemDataChanged += Content_Changed;
+      treeChart.Repainted += treeChart_Repainted;
     }
     protected override void DeregisterContentEvents() {
@@ -57,4 +58,5 @@
       Content.ModelChanged -= Content_Changed;
       Content.ProblemDataChanged -= Content_Changed;
+      treeChart.Repainted -= treeChart_Repainted;
     }
 
@@ -68,4 +70,9 @@
       UpdateView();
       viewHost.Content = this.Content;
+    }
+
+    private void treeChart_Repainted(object sender, EventArgs e) {
+      if (nodeImpacts != null && nodeImpacts.Count > 0)
+        PaintNodeImpacts();
     }
 
@@ -96,21 +103,18 @@
 
     private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) {
-      var visualNode = (VisualSymbolicExpressionTreeNode)sender;
-      var symbExprTreeNode = (SymbolicExpressionTreeNode)visualNode.SymbolicExpressionTreeNode;
-      if (symbExprTreeNode == null) return;
-      var tree = Content.Model.SymbolicExpressionTree;
+      var visualNode = (VisualTreeNode<ISymbolicExpressionTreeNode>)sender;
+      if (visualNode.Content == null) { throw new Exception("Visual node content cannot be null."); }
+      var symbExprTreeNode = (SymbolicExpressionTreeNode)visualNode.Content;
+      if (!foldedNodes.ContainsKey(symbExprTreeNode)) return; // constant nodes cannot be folded
       var parent = symbExprTreeNode.Parent;
       int indexOfSubtree = parent.IndexOfSubtree(symbExprTreeNode);
-      if (foldedNodes.ContainsKey(symbExprTreeNode)) {
-        // undo node folding
-        SwitchNodeWithReplacementNode(parent, indexOfSubtree);
-      }
-      UpdateModel(tree);
+      SwitchNodeWithReplacementNode(parent, indexOfSubtree);
+      UpdateModel(Content.Model.SymbolicExpressionTree);
     }
 
     private void SwitchNodeWithReplacementNode(ISymbolicExpressionTreeNode parent, int subTreeIndex) {
       ISymbolicExpressionTreeNode subTree = parent.GetSubtree(subTreeIndex);
-      parent.RemoveSubtree(subTreeIndex);
       if (foldedNodes.ContainsKey(subTree)) {
+        parent.RemoveSubtree(subTreeIndex);
         var replacementNode = foldedNodes[subTree];
         parent.InsertSubtree(subTreeIndex, replacementNode);
@@ -125,8 +129,9 @@
       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)) {
+          visualTree.ToolTip = visualTree.Content.ToString(); // to avoid duplicate tooltips
           double impact = nodeImpacts[treeNode];
 
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs	(revision 11118)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs	(revision 11120)
@@ -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 
@@ -218,5 +218,5 @@
             if (tempNode.IterateNodesBreadth().Contains(node))
               throw new ArgumentException();// cannot cut/paste a node into itself
-            ModifyTree(Tree, tempNode.Parent, tempNode, null); //remove node from its original parent 	 	 
+            ModifyTree(Tree, tempNode.Parent, tempNode, null); //remove node from its original parent
             ModifyTree(Tree, node, null, tempNode); //insert it as a child to the new parent 
             break;
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs	(revision 11118)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/TextualSymbolicDataAnalysisModelView.designer.cs	(revision 11120)
@@ -48,5 +48,5 @@
       this.SuspendLayout();
       // 
-      // expressionTreeView
+      // symbolicExpressionTreeView
       // 
       this.symbolicExpressionTreeView.AllowDrop = true;
@@ -55,16 +55,15 @@
       this.symbolicExpressionTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
       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);
