Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionTreeChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionTreeChart.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionTreeChart.cs	(revision 3442)
@@ -258,5 +258,6 @@
 
       //draw name of symbol
-      graphics.DrawString(node.Symbol.Name, textFont, textBrush, new RectangleF(visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height), stringFormat);
+      var text = node.ToString();
+      graphics.DrawString(text, textFont, textBrush, new RectangleF(visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height), stringFormat);
 
       //draw connection line to parent node
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionView.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/SymbolicExpressionView.cs	(revision 3442)
@@ -48,5 +48,5 @@
       if (node.SubTrees.Count > 0) {
         // symbol on same line as '('
-        strBuilder.AppendLine(node.Symbol.Name);
+        strBuilder.AppendLine(node.ToString());
         // each subtree expression on a new line
         // and closing ')' also on new line
@@ -57,5 +57,5 @@
       } else {
         // symbol in the same line with as '(' and ')'
-        strBuilder.Append(node.Symbol.Name);
+        strBuilder.Append(node.ToString());
         strBuilder.Append(")");
       }
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs	(revision 3442)
@@ -56,4 +56,5 @@
       SymbolicExpressionTree tree = new SymbolicExpressionTree();
       var rootNode = grammar.StartSymbol.CreateTreeNode();
+      if (rootNode.HasLocalParameters) rootNode.ResetLocalParameters(random);
       rootNode.Grammar = grammar;
       tree.Root = PTC2(random, rootNode, maxTreeSize, maxTreeHeight, maxFunctionDefinitions, maxFunctionArguments);
@@ -111,5 +112,4 @@
         var dummy = new SymbolicExpressionTreeNode();
         root.AddSubTree(dummy);
-        // dummy.Grammar = (ISymbolicExpressionGrammar)dummy.Grammar.Clone();
         extensionPoints.Add(new TreeExtensionPoint { Parent = root, ChildIndex = i, ExtensionPointDepth = 2 });
       }
@@ -132,4 +132,5 @@
           Symbol selectedSymbol = SelectRandomSymbol(random, allowedSymbols);
           SymbolicExpressionTreeNode newTree = selectedSymbol.CreateTreeNode();
+          if (newTree.HasLocalParameters) newTree.ResetLocalParameters(random);
           parent.RemoveSubTree(argumentIndex);
           parent.InsertSubTree(argumentIndex, newTree);
@@ -145,6 +146,4 @@
             var dummy = new SymbolicExpressionTreeNode();
             newTree.AddSubTree(dummy);
-            //if (IsTopLevelBranch(root, dummy))
-            //  dummy.Grammar = (ISymbolicExpressionGrammar)dummy.Grammar.Clone();
             extensionPoints.Add(new TreeExtensionPoint { Parent = newTree, ChildIndex = i, ExtensionPointDepth = extensionDepth + 1 });
           }
@@ -172,4 +171,5 @@
       var selectedSymbol = SelectRandomSymbol(random, possibleSymbols);
       var tree = selectedSymbol.CreateTreeNode();
+      if (tree.HasLocalParameters) tree.ResetLocalParameters(random);
       parent.RemoveSubTree(argumentIndex);
       parent.InsertSubTree(argumentIndex, tree);
@@ -179,5 +179,4 @@
         var dummy = new SymbolicExpressionTreeNode();
         tree.AddSubTree(dummy);
-        // dummy.Grammar = (ISymbolicExpressionGrammar)dummy.Grammar.Clone();
         // replace the just inserted dummy by recursive application
         ReplaceWithMinimalTree(random, root, tree, i, maxFunctionDefinitions, maxFunctionArguments);
@@ -229,5 +228,4 @@
 
     private static bool IsTopLevelBranch(SymbolicExpressionTreeNode root, SymbolicExpressionTreeNode branch) {
-      //return root.SubTrees.IndexOf(branch) > -1;
       return branch is SymbolicExpressionTreeTopLevelNode;
     }
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 3442)
@@ -65,4 +65,5 @@
     public SymbolicExpressionTree(SymbolicExpressionTreeNode root)
       : base() {
+      this.Root = root;
     }
 
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCompiler.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCompiler.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCompiler.cs	(revision 3442)
@@ -46,5 +46,5 @@
       entryPoint.Clear();
       // compile main body
-      code.AddRange(Compile(tree.Root.SubTrees[0]));
+      code.AddRange(Compile(tree.Root.SubTrees[0].SubTrees[0]));
       // compile branches
       var functionBranches = from node in tree.IterateNodesPrefix()
@@ -53,6 +53,18 @@
       foreach (DefunTreeNode branch in functionBranches) {
         entryPoint[branch.FunctionName] = (short)code.Count;
-        code.AddRange(Compile(branch));
+        code.AddRange(Compile(branch.SubTrees[0]));
       }
+      // address of all functions is fixed now
+      // iterate through code again and fill in the jump locations
+      for (int i = 0; i < code.Count; i++) {
+        Instruction instr = code[i];
+        if (instr.symbol == CodeSymbol.Call) {
+          var invokeNode = (InvokeFunctionTreeNode)instr.dynamicNode;
+          instr.iArg0 = entryPoint[invokeNode.Symbol.FunctionName];
+          instr.dynamicNode = null;
+          code[i] = instr;
+        }
+      }
+
       return code.ToArray();
     }
@@ -65,10 +77,9 @@
         if (codeSymbol.ContainsKey(node.Symbol.GetType())) {
           instr.symbol = codeSymbol[node.Symbol.GetType()];
-          if (instr.symbol == CodeSymbol.Call) {
-            var invokeNode = (InvokeFunctionTreeNode)node;
-            instr.iArg0 = entryPoint[invokeNode.Symbol.FunctionName];
-          } else if (instr.symbol == CodeSymbol.Arg) {
+          if (instr.symbol == CodeSymbol.Arg) {
             var argNode = (ArgumentTreeNode)node;
             instr.iArg0 = (short)argNode.Symbol.ArgumentIndex;
+          } else if (instr.symbol == CodeSymbol.Call) {
+            instr.dynamicNode = node; // save node for fixup of jump addresses in second iteration
           }
         } else {
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCreator.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeCreator.cs	(revision 3442)
@@ -65,8 +65,4 @@
       SymbolicExpressionTreeParameter.ActualValue = Create(Random, SymbolicExpressionGrammar,
         MaxTreeSize, MaxTreeHeight, MaxFunctionDefinitions, MaxFunctionArguments);
-
-      foreach (var node in SymbolicExpressionTreeParameter.ActualValue.IterateNodesPostfix()) {
-        node.ResetLocalParameters(RandomParameter.ActualValue);
-      }
       return null;
     }
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs	(revision 3442)
@@ -145,5 +145,7 @@
     #endregion
 
-
+    public override string ToString() {
+      return Symbol.Name;
+    }
 
   }
Index: /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs	(revision 3442)
@@ -53,4 +53,8 @@
       return new DefunTreeNode(this);
     }
+
+    public override string ToString() {
+      return FunctionName;
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs	(revision 3442)
@@ -25,4 +25,5 @@
 using HeuristicLab.Data;
 using System.Xml;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.GP.StructureIdentification {
@@ -149,6 +150,6 @@
     public override object Clone(System.Collections.Generic.IDictionary<System.Guid, object> clonedObjects) {
       Variable clone = (Variable)base.Clone(clonedObjects);
-      clone.MaxTimeOffset = MaxTimeOffset;
-      clone.MinTimeOffset = MinTimeOffset;
+      clone.maxOffset = MaxTimeOffset;
+      clone.minOffset = MinTimeOffset;
       return clone;
     }
@@ -166,8 +167,8 @@
       base.Populate(node, restoredObjects);
       if (node.Attributes["MinTimeOffset"] != null)
-        MinTimeOffset = XmlConvert.ToInt32(node.Attributes["MinTimeOffset"].Value);
+        minOffset = XmlConvert.ToInt32(node.Attributes["MinTimeOffset"].Value);
       else MinTimeOffset = 0;
       if (node.Attributes["MaxTimeOffset"] != null)
-        MaxTimeOffset = XmlConvert.ToInt32(node.Attributes["MaxTimeOffset"].Value);
+        maxOffset = XmlConvert.ToInt32(node.Attributes["MaxTimeOffset"].Value);
       else MaxTimeOffset = 0;
     }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 3442)
@@ -86,4 +86,7 @@
     <Compile Include="HeuristicLabProblemsDataAnalysisRegressionPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Symbolic\BestValidationSymbolicRegressionSolutionVisualizer.cs" />
+    <Compile Include="Symbolic\SymbolicRegressionSolution.cs" />
+    <Compile Include="Symbolic\SymbolicRegressionModel.cs" />
     <Compile Include="Symbolic\ISymbolicRegressionEvaluator.cs">
       <SubType>Code</SubType>
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/BestValidationSymbolicRegressionSolutionVisualizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/BestValidationSymbolicRegressionSolutionVisualizer.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/BestValidationSymbolicRegressionSolutionVisualizer.cs	(revision 3442)
@@ -0,0 +1,95 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
+  /// <summary>
+  /// An operator for visualizing the best symbolic regression solution based on the validation set.
+  /// </summary>
+  [Item("BestSymbolicExpressionTreeVisualizer", "An operator for visualizing the best symbolic regression solution based on the validation set.")]
+  [StorableClass]
+  public sealed class BestValidationSymbolicRegressionSolutionVisualizer : SingleSuccessorOperator, ISingleObjectiveSolutionsVisualizer, ISolutionsVisualizer {
+    private const string SymbolicRegressionModelParameterName = "SymbolicRegressionModel";
+    private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
+    private const string BestValidationSolutionParameterName = "BestValidationSolution";
+    private const string QualityParameterName = "Quality";
+    public ILookupParameter<ItemArray<SymbolicExpressionTree>> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ItemArray<SymbolicExpressionTree>>)Parameters[SymbolicRegressionModelParameterName]; }
+    }
+    public ILookupParameter<DataAnalysisProblemData> DataAnalysisProblemDataParameter {
+      get { return (ILookupParameter<DataAnalysisProblemData>)Parameters[DataAnalysisProblemDataParameterName]; }
+    }
+    public ILookupParameter<SymbolicRegressionSolution> BestValidationSolutionParameter {
+      get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters[BestValidationSolutionParameterName]; }
+    }
+    ILookupParameter ISolutionsVisualizer.VisualizationParameter {
+      get { return BestValidationSolutionParameter; }
+    }
+
+    public ILookupParameter<ItemArray<DoubleValue>> QualityParameter {
+      get { return (ILookupParameter<ItemArray<DoubleValue>>)Parameters[QualityParameterName]; }
+    }
+
+    public BestValidationSymbolicRegressionSolutionVisualizer()
+      : base() {
+      Parameters.Add(new SubScopesLookupParameter<SymbolicExpressionTree>(SymbolicRegressionModelParameterName, "The symbolic regression solutions from which the best solution should be visualized."));
+      Parameters.Add(new SubScopesLookupParameter<DoubleValue>(QualityParameterName, "The quality of the symbolic regression solutions."));
+      Parameters.Add(new LookupParameter<DataAnalysisProblemData>(DataAnalysisProblemDataParameterName, "The symbolic regression problme data on which the best solution should be evaluated."));
+      Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestValidationSolutionParameterName, "The best symbolic expression tree based on the validation data for the symbolic regression problem."));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results"));
+    }
+
+    public override IOperation Apply() {
+      ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue;
+      DataAnalysisProblemData problemData = DataAnalysisProblemDataParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+
+      var bestExpressionIndex = (from index in Enumerable.Range(0, qualities.Count())
+                                 select new { Index = index, Quality = qualities[index] }).OrderBy(x => x.Quality).Select(x => x.Index).First();
+
+      var bestExpression = expressions[bestExpressionIndex];
+      SymbolicRegressionSolution bestSolution = BestValidationSolutionParameter.ActualValue;
+      if (bestSolution == null) BestValidationSolutionParameter.ActualValue = CreateDataAnalysisSolution(problemData, bestExpression);
+      else {
+        bestSolution.Model = CreateModel(problemData, bestExpression);
+      }
+      // ((ResultCollection)Parameters["Results"].ActualValue).Add(new Result("ValidationMSE", new DoubleValue(3.15)));
+      return base.Apply();
+    }
+
+    private SymbolicRegressionModel CreateModel(DataAnalysisProblemData problemData, SymbolicExpressionTree expression) {
+      return new SymbolicRegressionModel(expression, problemData.InputVariables.Select(x => x.Value));
+    }
+
+    private SymbolicRegressionSolution CreateDataAnalysisSolution(DataAnalysisProblemData problemData, SymbolicExpressionTree expression) {
+      return new SymbolicRegressionSolution(problemData, CreateModel(problemData, expression));
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 3442)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Operators;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
+  [StorableClass]
+  public class SymbolicRegressionModel : DeepCloneable, IModel {
+    [Storable]
+    private SymbolicExpressionTree tree;
+    public SymbolicExpressionTree SymbolicExpressionTree {
+      get { return tree; }
+    }
+    [Storable]
+    private SimpleArithmeticExpressionEvaluator evaluator;
+    public SimpleArithmeticExpressionEvaluator Evaluator {
+      get { return evaluator; }
+    }
+    private Dataset emptyDataset;
+    private IEnumerable<int> firstRow = new int[] { 0 };
+
+    public SymbolicRegressionModel() : base() { } // for cloning
+
+    public SymbolicRegressionModel(SymbolicExpressionTree tree, IEnumerable<string> inputVariables)
+      : base() {
+      this.tree = tree;
+      this.evaluator = new SimpleArithmeticExpressionEvaluator();
+      emptyDataset = new Dataset(inputVariables, new double[1, inputVariables.Count()]);
+    }
+
+    #region IModel Members
+
+    public double GetValue(double[] xs) {
+      if (xs.Length != emptyDataset.Columns) throw new ArgumentException("Length of input vector doesn't match model");
+      for (int i = 0; i < xs.Length; i++) {
+        emptyDataset[0, i] = xs[i];
+      }
+      return evaluator.EstimatedValues(tree, emptyDataset, firstRow).First();
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs	(revision 3442)
@@ -118,6 +118,6 @@
       get { return EvaluatorParameter.Value; }
     }
-    public ArithmeticExpressionGrammar FunctionTreeGrammar {
-      get { return (ArithmeticExpressionGrammar)FunctionTreeGrammarParameter.Value; }
+    public ISymbolicExpressionGrammar FunctionTreeGrammar {
+      get { return (ISymbolicExpressionGrammar)FunctionTreeGrammarParameter.Value; }
     }
     public ISingleObjectiveSolutionsVisualizer Visualizer {
@@ -141,10 +141,12 @@
       SymbolicExpressionTreeCreator creator = new ProbabilisticTreeCreator();
       var evaluator = new SymbolicRegressionMeanSquaredErrorEvaluator();
-      var grammar = new GlobalSymbolicExpressionGrammar(new ArithmeticExpressionGrammar());
+      var grammar = new ArithmeticExpressionGrammar();
+      var globalGrammar = new GlobalSymbolicExpressionGrammar(grammar);
+      var visualizer = new BestValidationSymbolicRegressionSolutionVisualizer();
       Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the error of the regression model should be minimized.", new BoolValue(false)));
       Parameters.Add(new ValueParameter<SymbolicExpressionTreeCreator>("SolutionCreator", "The operator which should be used to create new symbolic regression solutions.", creator));
       Parameters.Add(new ValueParameter<ISymbolicRegressionEvaluator>("Evaluator", "The operator which should be used to evaluate symbolic regression solutions.", evaluator));
       Parameters.Add(new ValueParameter<DoubleValue>("BestKnownQuality", "The minimal error value that can be reached by symbolic regression models.", new DoubleValue(0)));
-      Parameters.Add(new ValueParameter<ISymbolicExpressionGrammar>("FunctionTreeGrammar", "The grammar that should be used for symbolic regression models.", grammar));
+      Parameters.Add(new ValueParameter<ISymbolicExpressionGrammar>("FunctionTreeGrammar", "The grammar that should be used for symbolic regression models.", globalGrammar));
       Parameters.Add(new ValueParameter<IntValue>("MaxExpressionLength", "Maximal length of the symbolic expression.", new IntValue(100)));
       Parameters.Add(new ValueParameter<IntValue>("MaxExpressionDepth", "Maximal depth of the symbolic expression.", new IntValue(10)));
@@ -152,10 +154,12 @@
       Parameters.Add(new ValueParameter<IntValue>("MaxFunctionArguments", "Maximal number of arguments of automatically defined functions.", new IntValue(3)));
       Parameters.Add(new ValueParameter<DoubleValue>("NumberOfEvaluatedNodes", "The total number of evaluated function tree nodes (for performance measurements.)", new DoubleValue()));
-      Parameters.Add(new ValueParameter<ISingleObjectiveSolutionsVisualizer>("Visualizer", "The operator which should be used to visualize artificial ant solutions.", null));
+      Parameters.Add(new ValueParameter<ISingleObjectiveSolutionsVisualizer>("Visualizer", "The operator which should be used to visualize symbolic regression solutions.", visualizer));
 
       creator.SymbolicExpressionTreeParameter.ActualName = "SymbolicRegressionModel";
+      creator.MaxFunctionArgumentsParameter.ActualName = "MaxFunctionArguments";
+      creator.MaxFunctionDefinitionsParameter.ActualName = "MaxFunctionDefiningBranches";
       evaluator.QualityParameter.ActualName = "TrainingMeanSquaredError";
       DataAnalysisProblemDataParameter.ValueChanged += new EventHandler(DataAnalysisProblemDataParameter_ValueChanged);
-      DataAnalysisProblemData.InputVariablesChanged += new EventHandler(DataAnalysisProblemData_InputVariablesChanged);
+      DataAnalysisProblemData.ProblemDataChanged += new EventHandler(DataAnalysisProblemData_Changed);
       ParameterizeSolutionCreator();
       ParameterizeEvaluator();
@@ -166,9 +170,11 @@
 
     void DataAnalysisProblemDataParameter_ValueChanged(object sender, EventArgs e) {
-      DataAnalysisProblemData.InputVariablesChanged += new EventHandler(DataAnalysisProblemData_InputVariablesChanged);
-    }
-
-    void DataAnalysisProblemData_InputVariablesChanged(object sender, EventArgs e) {
-      FunctionTreeGrammar.VariableNames = DataAnalysisProblemData.InputVariables.Select(x => x.Value);
+      DataAnalysisProblemData.ProblemDataChanged += new EventHandler(DataAnalysisProblemData_Changed);
+    }
+
+    void DataAnalysisProblemData_Changed(object sender, EventArgs e) {
+      foreach (var varSymbol in FunctionTreeGrammar.Symbols.OfType<HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable>()) {
+        varSymbol.VariableNames = DataAnalysisProblemData.InputVariables.Select(x => x.Value);
+      }
     }
 
@@ -268,15 +274,9 @@
     private void ParameterizeVisualizer() {
       if (Visualizer != null) {
-        //Visualizer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-        //var antTrailVisualizer = Visualizer as IAntTrailVisualizer;
-        //if (antTrailVisualizer != null) {
-        //  antTrailVisualizer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
-        //  antTrailVisualizer.WorldParameter.ActualName = WorldParameter.Name;
-        //  antTrailVisualizer.MaxTimeStepsParameter.ActualName = MaxTimeStepsParameter.Name;
-        //}
-        //var bestSymExpressionVisualizer = Visualizer as BestSymbolicExpressionTreeVisualizer;
-        //if (bestSymExpressionVisualizer != null) {
-        //  bestSymExpressionVisualizer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
-        //}
+        var solutionVisualizer = Visualizer as BestValidationSymbolicRegressionSolutionVisualizer;
+        if (solutionVisualizer != null) {
+          solutionVisualizer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
+          solutionVisualizer.DataAnalysisProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
+        }
       }
     }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3442)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
+  /// <summary>
+  /// Represents a solution for a symbolic regression problem which can be visualized in the GUI.
+  /// </summary>
+  [Item("SymbolicRegressionSolution", "Represents a solution for a symbolic regression problem which can be visualized in the GUI.")]
+  [StorableClass]
+  public sealed class SymbolicRegressionSolution : DataAnalysisSolution {
+    public new SymbolicRegressionModel Model {
+      get { return (SymbolicRegressionModel)base.Model; }
+      set { base.Model = value; }
+    }
+
+    public SymbolicRegressionSolution() : base() { }
+    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model)
+      : base(problemData, model) {
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.Designer.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.Designer.cs	(revision 3442)
@@ -1,24 +1,3 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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
-
-namespace HeuristicLab.Problems.DataAnalysis {
+﻿namespace HeuristicLab.Problems.DataAnalysis.Views {
   partial class DataAnalysisProblemDataView {
     /// <summary> 
@@ -32,7 +11,6 @@
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
     protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (openFileDialog != null) openFileDialog.Dispose();
-        if (components != null) components.Dispose();
+      if (disposing && (components != null)) {
+        components.Dispose();
       }
       base.Dispose(disposing);
@@ -46,6 +24,6 @@
     /// </summary>
     private void InitializeComponent() {
+      this.variableCollectionView = new HeuristicLab.Core.Views.VariableCollectionView();
       this.importButton = new System.Windows.Forms.Button();
-      this.datasetView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -55,9 +33,17 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(457, 20);
       // 
-      // descriptionTextBox
+      // variableCollectionView
       // 
-      this.descriptionTextBox.Size = new System.Drawing.Size(457, 20);
+      this.variableCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.variableCollectionView.Caption = "VariableCollection";
+      this.variableCollectionView.Content = null;
+      this.variableCollectionView.Location = new System.Drawing.Point(0, 52);
+      this.variableCollectionView.Name = "variableCollectionView";
+      this.variableCollectionView.ReadOnly = false;
+      this.variableCollectionView.Size = new System.Drawing.Size(588, 366);
+      this.variableCollectionView.TabIndex = 0;
       // 
       // importButton
@@ -65,34 +51,22 @@
       this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.importButton.Location = new System.Drawing.Point(0, 399);
+      this.importButton.Location = new System.Drawing.Point(6, 424);
       this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(529, 23);
-      this.importButton.TabIndex = 5;
-      this.importButton.Text = "&Import from CSV file";
+      this.importButton.Size = new System.Drawing.Size(579, 23);
+      this.importButton.TabIndex = 4;
+      this.importButton.Text = "Import from CSV file";
       this.importButton.UseVisualStyleBackColor = true;
       this.importButton.Click += new System.EventHandler(this.importButton_Click);
       // 
-      // datasetView
-      // 
-      this.datasetView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.datasetView.Caption = "StringConvertibleMatrix View";
-      this.datasetView.Content = null;
-      this.datasetView.Location = new System.Drawing.Point(0, 52);
-      this.datasetView.Name = "datasetView";
-      this.datasetView.Size = new System.Drawing.Size(526, 341);
-      this.datasetView.TabIndex = 6;
-      // 
-      // RegressionProblemDataView
+      // ProblemDataView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.variableCollectionView);
       this.Controls.Add(this.importButton);
-      this.Controls.Add(this.datasetView);
-      this.Name = "RegressionProblemDataView";
-      this.Size = new System.Drawing.Size(529, 422);
-      this.Controls.SetChildIndex(this.datasetView, 0);
+      this.Name = "ProblemDataView";
+      this.Size = new System.Drawing.Size(588, 450);
       this.Controls.SetChildIndex(this.importButton, 0);
+      this.Controls.SetChildIndex(this.variableCollectionView, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.descriptionLabel, 0);
@@ -107,7 +81,6 @@
     #endregion
 
+    private HeuristicLab.Core.Views.VariableCollectionView variableCollectionView;
     private System.Windows.Forms.Button importButton;
-    private HeuristicLab.Data.Views.StringConvertibleMatrixView datasetView;
-
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs	(revision 3442)
@@ -1,39 +1,23 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
 using System.Windows.Forms;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 
-namespace HeuristicLab.Problems.DataAnalysis {
-  [View("Data-Analysis Data View")]
-  [Content(typeof(DataAnalysisProblemData), true)]
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Data-Analysis Problem View")]
+  [Content(typeof(DataAnalysisProblemData))]
   public partial class DataAnalysisProblemDataView : NamedItemView {
     private OpenFileDialog openFileDialog;
-
     public new DataAnalysisProblemData Content {
       get { return (DataAnalysisProblemData)base.Content; }
-      set { base.Content = value; }
+      set {
+        base.Content = value;
+      }
     }
 
@@ -45,33 +29,8 @@
       : this() {
       Content = content;
+      variableCollectionView.Content = content.Variables.AsReadOnly();
     }
 
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      if (Content != null)
-        Content.DatasetChanged += new EventHandler(Content_DatasetChanged);
-    }
-
-    protected override void DeregisterContentEvents() {
-      base.DeregisterContentEvents();
-      if(Content != null)
-        Content.DatasetChanged -= new EventHandler(Content_DatasetChanged);
-    }
-
-    private void Content_DatasetChanged(object sender, EventArgs e) {
-      this.datasetView.Content = this.Content.Dataset;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        importButton.Enabled = false;
-      } else {
-        importButton.Enabled = true;
-        this.datasetView.Content = this.Content.Dataset;
-      }
-    }
-
-    private void importButton_Click(object sender, System.EventArgs e) {
+    private void importButton_Click(object sender, EventArgs e) {
       if (openFileDialog == null) openFileDialog = new OpenFileDialog();
 
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.resx	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.resx	(revision 3442)
@@ -0,0 +1,129 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: unk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemView.Designer.cs	(revision 3441)
+++ 	(revision )
@@ -1,143 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  partial class DataAnalysisProblemView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.importButton = new System.Windows.Forms.Button();
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.parametersTabPage = new System.Windows.Forms.TabPage();
-      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.tabControl.SuspendLayout();
-      this.parametersTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(457, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Size = new System.Drawing.Size(457, 20);
-      // 
-      // importButton
-      // 
-      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.importButton.Location = new System.Drawing.Point(0, 399);
-      this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(529, 23);
-      this.importButton.TabIndex = 5;
-      this.importButton.Text = "&Import from CSV file";
-      this.importButton.UseVisualStyleBackColor = true;
-      this.importButton.Click += new System.EventHandler(this.importButton_Click);
-      // 
-      // tabControl
-      // 
-      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.tabControl.Controls.Add(this.parametersTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 52);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(529, 341);
-      this.tabControl.TabIndex = 4;
-      // 
-      // parametersTabPage
-      // 
-      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
-      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
-      this.parametersTabPage.Name = "parametersTabPage";
-      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.parametersTabPage.Size = new System.Drawing.Size(521, 315);
-      this.parametersTabPage.TabIndex = 0;
-      this.parametersTabPage.Text = "Parameters";
-      this.parametersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // parameterCollectionView
-      // 
-      this.parameterCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.parameterCollectionView.Caption = "ParameterCollection";
-      this.parameterCollectionView.Content = null;
-      this.parameterCollectionView.Location = new System.Drawing.Point(6, 6);
-      this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.Size = new System.Drawing.Size(509, 303);
-      this.parameterCollectionView.TabIndex = 0;
-      // 
-      // RegressionProblemView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.importButton);
-      this.Name = "RegressionProblemView";
-      this.Size = new System.Drawing.Size(529, 422);
-      this.Controls.SetChildIndex(this.importButton, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.tabControl.ResumeLayout(false);
-      this.parametersTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Button importButton;
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage parametersTabPage;
-    private HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
-
-  }
-}
Index: unk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemView.cs	(revision 3441)
+++ 	(revision )
@@ -1,59 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [View("Data-Analysis Problem View")]
-  [Content(typeof(DataAnalysisProblem), true)]
-  public partial class DataAnalysisProblemView : NamedItemView {
-    public new DataAnalysisProblem Content {
-      get { return (DataAnalysisProblem)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public DataAnalysisProblemView() {
-      InitializeComponent();
-    }
-
-    public DataAnalysisProblemView(DataAnalysisProblem content)
-      : this() {
-      Content = content;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        parameterCollectionView.Content = null;
-        parameterCollectionView.Enabled = false;
-        importButton.Enabled = false;
-      } else {
-        parameterCollectionView.Content = ((IParameterizedNamedItem)Content).Parameters;
-        parameterCollectionView.Enabled = true;
-        importButton.Enabled = true;
-      }
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.Designer.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.Designer.cs	(revision 3442)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class EstimatedValuesView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.SuspendLayout();
+      // 
+      // EstimatedValuesView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "EstimatedValuesView";
+      this.Size = new System.Drawing.Size(310, 285);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs	(revision 3442)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Collections.Specialized;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.MainForm.WindowsForms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Data.Views;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Estimated Values View")]
+  [Content(typeof(DataAnalysisSolution))]
+  public partial class EstimatedValuesView : AsynchronousContentView {
+    private const string TARGETVARIABLE_SERIES_NAME = "TargetVariable";
+    private const string ESTIMATEDVALUES_SERIES_NAME = "EstimatedValues";
+
+    public new DataAnalysisSolution Content {
+      get { return (DataAnalysisSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
+    private StringConvertibleMatrixView matrixView;
+
+    public EstimatedValuesView()
+      : base() {
+      InitializeComponent();
+      matrixView = new StringConvertibleMatrixView();
+      matrixView.Dock = DockStyle.Fill;
+      this.Controls.Add(matrixView);
+    }
+
+    public EstimatedValuesView(DataAnalysisSolution dataAnalysisSolution)
+      : this() {
+      Content = dataAnalysisSolution;
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+    void Content_ProblemDataChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    void Content_ModelChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateEstimatedValues();
+    }
+
+    private void UpdateEstimatedValues() {
+      if (InvokeRequired) Invoke((Action)UpdateEstimatedValues);
+      else {
+        double[,] values =
+        MatrixExtensions<double>.Create(
+          Content.ProblemData.Dataset[Content.ProblemData.TargetVariable.Value],
+          Content.EstimatedValues.ToArray());
+        var content = new DoubleMatrix(values);
+        content.ColumnNames = new string[] { "Original", "Estimated" };
+        matrixView.Content = content;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.resx	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.resx	(revision 3442)
@@ -0,0 +1,120 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj	(revision 3442)
@@ -72,4 +72,5 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
     <Reference Include="System.Xml.Linq">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
@@ -84,4 +85,10 @@
     <None Include="HeuristicLab.snk" />
     <None Include="Properties\AssemblyInfo.frame" />
+    <Compile Include="EstimatedValuesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EstimatedValuesView.Designer.cs">
+      <DependentUpon>EstimatedValuesView.cs</DependentUpon>
+    </Compile>
     <Compile Include="DataAnalysisProblemDataView.cs">
       <SubType>UserControl</SubType>
@@ -91,5 +98,29 @@
     </Compile>
     <Compile Include="HeuristicLabProblemsDataAnalysisViewsPlugin.cs" />
+    <Compile Include="LineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LineChartView.Designer.cs">
+      <DependentUpon>LineChartView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ScatterPlotView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScatterPlotView.Designer.cs">
+      <DependentUpon>ScatterPlotView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Symbolic\SimplifiedSymbolicExpressionModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Symbolic\SimplifiedSymbolicExpressionModelView.designer.cs">
+      <DependentUpon>SimplifiedSymbolicExpressionModelView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Symbolic\SymbolicExpressionModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Symbolic\SymbolicExpressionModelView.designer.cs">
+      <DependentUpon>SymbolicExpressionModelView.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
@@ -118,4 +149,8 @@
       <Name>HeuristicLab.Data-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views\3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3.csproj">
+      <Project>{6F42C5F8-16CD-43EE-8208-FD4573A69D85}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.csproj">
       <Project>{125D3006-67F5-48CB-913E-73C0548F17FA}</Project>
@@ -146,8 +181,32 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Regression\3.3\HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj">
+      <Project>{BDF86B1D-630E-4CE2-8A49-8C90B1BDE4C9}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Regression-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.3\HeuristicLab.Problems.DataAnalysis-3.3.csproj">
       <Project>{70DFD984-B1D9-46FE-8EB7-4DE92D71A9FC}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.3</Name>
     </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="EstimatedValuesView.resx">
+      <DependentUpon>EstimatedValuesView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAnalysisProblemDataView.resx">
+      <DependentUpon>DataAnalysisProblemDataView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LineChartView.resx">
+      <DependentUpon>LineChartView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ScatterPlotView.resx">
+      <DependentUpon>ScatterPlotView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Symbolic\SimplifiedSymbolicExpressionModelView.resx">
+      <DependentUpon>SimplifiedSymbolicExpressionModelView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Symbolic\SymbolicExpressionModelView.resx">
+      <DependentUpon>SymbolicExpressionModelView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs	(revision 3442)
@@ -19,5 +19,5 @@
  */
 #endregion
-namespace HeuristicLab.Problem.DataAnalysis.Views {
+namespace HeuristicLab.Problems.DataAnalysis.Views {
   partial class LineChartView {
     /// <summary> 
@@ -63,6 +63,4 @@
       this.chart.Size = new System.Drawing.Size(358, 225);
       this.chart.TabIndex = 0;
-      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
-      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
       // 
       // QualityLineChart
@@ -74,6 +72,4 @@
       this.Name = "QualityLineChart";
       this.Size = new System.Drawing.Size(358, 225);
-      this.DragDrop += new System.Windows.Forms.DragEventHandler(this.ModelLineChart_DragDrop);
-      this.DragEnter += new System.Windows.Forms.DragEventHandler(this.ModelLineChart_DragEnter);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
       this.ResumeLayout(false);
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs	(revision 3442)
@@ -32,10 +32,20 @@
 using HeuristicLab.Problems.DataAnalysis;
 using HeuristicLab.MainForm.WindowsForms;
+using System.Windows.Forms.DataVisualization.Charting;
 
-namespace HeuristicLab.Problems.DataAnalysis {
+namespace HeuristicLab.Problems.DataAnalysis.Views {
   [View("Line Chart View")]
   [Content(typeof(DataAnalysisSolution))]
-  public partial class LineChartView : ContentView {
-    
+  public partial class LineChartView : AsynchronousContentView {
+    private const string TARGETVARIABLE_SERIES_NAME = "TargetVariable";
+    private const string ESTIMATEDVALUES_SERIES_NAME = "EstimatedValues";
+
+    public new DataAnalysisSolution Content {
+      get { return (DataAnalysisSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
     public LineChartView()
       : base() {
@@ -49,113 +59,80 @@
       this.chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
       this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
-      this.chart.ChartAreas[0].CursorY.Interval = 0;      
+      this.chart.ChartAreas[0].CursorY.Interval = 0;
     }
 
     public LineChartView(DataAnalysisSolution dataAnalysisSolution)
       : this() {
-      
+      Content = dataAnalysisSolution;
+      DrawTargetVariableValues();
+      DrawEstimatedValues();
     }
 
-    private void model_Changed(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Action<object, EventArgs> action = new Action<object, EventArgs>(model_Changed);
-        this.Invoke(action, sender, e);
-      } else {
-        IVisualModel model = (IVisualModel)sender;
-        Series s = this.chart.Series.Single(x => x.Tag == model);
-        s.Points.DataBindY(model.PredictedValues.ToArray());
-        s.LegendText = model.ModelName;
-        this.UpdateStripLines();
-      }
+    private void DrawEstimatedValues() {
+      this.chart.Series.Add(ESTIMATEDVALUES_SERIES_NAME);
+      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].LegendText = Content.ItemName;
+      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].ChartType = SeriesChartType.FastLine;
+      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].Points.DataBindY(Content.EstimatedValues.ToArray());
+      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].Tag = Content;
     }
 
-    protected override void ModelsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
-      base.ModelsCollectionChanged(sender, e);
-      if (InvokeRequired) {
-        Action<object, NotifyCollectionChangedEventArgs> action = new Action<object, NotifyCollectionChangedEventArgs>(ModelsCollectionChanged);
-        this.Invoke(action, sender, e);
-      } else {
-        if (e.Action == NotifyCollectionChangedAction.Remove) {
-          foreach (IVisualModel model in e.OldItems) {
-            if (this.chart.Series.Any(x => x.Tag == model))
-              this.RemoveModel(model);
-          }
-          this.UpdateStripLines();
-        } else if (e.Action == NotifyCollectionChangedAction.Reset)
-          this.RemoveAllModels();
-      }
-    }
-
-    private void AddModel(IVisualModel model) {
-      if (this.targetVariableName != model.TargetVariableName) {
-        this.RemoveAllModels();
-        this.chart.Series.Clear();
-        this.chart.Series.Add(TARGETVARIABLE);
-        this.chart.Series[TARGETVARIABLE].LegendText = model.TargetVariableName;
-        this.chart.Series[TARGETVARIABLE].ChartType = SeriesChartType.FastLine;
-        this.chart.Series[TARGETVARIABLE].Points.DataBindY(model.Dataset.GetVariableValues(model.TargetVariableName));
-        this.targetVariableName = model.TargetVariableName;
-        this.Caption = this.targetVariableName + " Model Line Chart";
-      }
-      string seriesName = model.GetHashCode().ToString();
-      this.chart.Series.Add(seriesName);
-      this.chart.Series[seriesName].Tag = model;
-      this.chart.Series[seriesName].LegendText = model.ModelName;
-      this.chart.Series[seriesName].ChartType = SeriesChartType.FastLine;
-      this.chart.Series[seriesName].Points.DataBindY(model.PredictedValues.ToArray());
-      model.Changed += new EventHandler(model_Changed);
+    private void DrawTargetVariableValues() {
+      this.chart.Series.Clear();
+      this.chart.Series.Add(TARGETVARIABLE_SERIES_NAME);
+      this.chart.Series[TARGETVARIABLE_SERIES_NAME].LegendText = Content.ProblemData.TargetVariable.Value;
+      this.chart.Series[TARGETVARIABLE_SERIES_NAME].ChartType = SeriesChartType.FastLine;
+      this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.DataBindY(Content.ProblemData.Dataset[Content.ProblemData.TargetVariable.Value]);
       this.UpdateStripLines();
     }
 
-    private void RemoveModel(IVisualModel model) {
-      Series s = this.chart.Series.Single(x => x.Tag == model);
-      this.chart.Series.Remove(s);
-      model.Changed -= new EventHandler(model_Changed);
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
     }
 
-    private void RemoveAllModels() {
-      var models = (from s in chart.Series
-                    let m = s.Tag as IVisualModel
-                    where m != null
-                    select m).ToArray(); // select and copy currently displayed models
-      foreach (var m in models) {
-        this.RemoveModel(m);
-      }
-      this.UpdateStripLines();
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
     }
 
-    private void chart_MouseDown(object sender, MouseEventArgs e) {
-      HitTestResult result = this.chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem) {
-        if (result.Series.Name != TARGETVARIABLE) {
-          this.RemoveModel(result.Series.Tag as IVisualModel);
-          this.UpdateStripLines();
+    void Content_ProblemDataChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    void Content_ModelChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateEstimatedValuesLineChart();
+    }
+
+    private void UpdateEstimatedValuesLineChart() {
+      if (InvokeRequired) Invoke((Action)UpdateEstimatedValuesLineChart);
+      else {
+        if (this.chart.Series.Count > 0) {
+          Series s = this.chart.Series.SingleOrDefault(x => x.Tag == Content);
+          if (s != null) {
+            s.Points.DataBindY(Content.EstimatedValues.ToArray());
+            s.LegendText = Content.ItemName;
+            this.UpdateStripLines();
+          }
         }
       }
     }
-
-    private void chart_MouseMove(object sender, MouseEventArgs e) {
-      HitTestResult result = this.chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem) {
-        if (result.Series.Name != TARGETVARIABLE)
-          this.Cursor = Cursors.Hand;
-      } else
-        this.Cursor = Cursors.Default;
-    }
+    #endregion
 
     private void UpdateStripLines() {
       this.chart.ChartAreas[0].AxisX.StripLines.Clear();
-      IEnumerable<IVisualModel> visualModels = from Series s in this.chart.Series
-                                               where s.Tag is IVisualModel
-                                               select (IVisualModel)s.Tag;
-      if (visualModels.Count() > 0) {
-        IVisualModel model = visualModels.ElementAt(0);
-        if (visualModels.All(x => x.TrainingSamplesStart == model.TrainingSamplesStart && x.TrainingSamplesEnd == model.TrainingSamplesEnd))
-          this.CreateAndAddStripLine("Training", Color.FromArgb(20, Color.Green), model.TrainingSamplesStart, model.TrainingSamplesEnd);
-        if (visualModels.All(x => x.ValidationSamplesStart == model.ValidationSamplesStart && x.ValidationSamplesEnd == model.ValidationSamplesEnd))
-          this.CreateAndAddStripLine("Validation", Color.FromArgb(20, Color.Yellow), model.ValidationSamplesStart, model.ValidationSamplesEnd);
-        if (visualModels.All(x => x.TestSamplesStart == model.TestSamplesStart && x.TestSamplesEnd == model.TestSamplesEnd))
-          this.CreateAndAddStripLine("Test", Color.FromArgb(20, Color.Red), model.TestSamplesStart, model.TestSamplesEnd);
-      }
+      this.CreateAndAddStripLine("Training", Color.FromArgb(20, Color.Green),
+        Content.ProblemData.TrainingSamplesStart.Value,
+        Content.ProblemData.TrainingSamplesEnd.Value);
+      this.CreateAndAddStripLine("Test", Color.FromArgb(20, Color.Red),
+        Content.ProblemData.TestSamplesStart.Value,
+        Content.ProblemData.TestSamplesEnd.Value);
     }
 
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 3442)
@@ -75,6 +75,4 @@
       this.AllowDrop = true;
       this.Size = new System.Drawing.Size(527, 392);
-      this.DragDrop += new System.Windows.Forms.DragEventHandler(this.ScatterPlotView_DragDrop);
-      this.DragEnter += new System.Windows.Forms.DragEventHandler(this.ScatterPlotView_DragEnter);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
       this.ResumeLayout(false);
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs	(revision 3442)
@@ -32,14 +32,19 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Problems.DataAnalyis.Views {
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
   [View("Scatter Plot View")]
   [Content(typeof(DataAnalysisSolution))]
-  public partial class ScatterPlotView : ContentView {
+  public partial class ScatterPlotView : AsynchronousContentView {
     private const string DEFAULT_CAPTION = "Scatter Plot";
     private const string ALL_SERIES = "All Samples";
     private const string TRAINING_SERIES = "Training Samples";
-    private const string validationSeries = "Validation Samples";
     private const string TEST_SERIES = "Test Samples";
+
+    public new DataAnalysisSolution Content {
+      get { return (DataAnalysisSolution)base.Content; }
+      set { base.Content = value; }
+    }
 
     public ScatterPlotView()
@@ -55,8 +60,4 @@
       this.chart.Series[TRAINING_SERIES].LegendText = TRAINING_SERIES;
       this.chart.Series[TRAINING_SERIES].ChartType = SeriesChartType.FastPoint;
-
-      this.chart.Series.Add(validationSeries);
-      this.chart.Series[validationSeries].LegendText = validationSeries;
-      this.chart.Series[validationSeries].ChartType = SeriesChartType.FastPoint;
 
       this.chart.Series.Add(TEST_SERIES);
@@ -80,20 +81,39 @@
     }
 
-    public ScatterPlotView(IVisualModel visualModel)
+    public ScatterPlotView(DataAnalysisSolution dataAnalysisSolution)
       : this() {
-      this.VisualModel = visualModel;
-    }
-
-    private IVisualModel visualModel;
-    public IVisualModel VisualModel {
-      get { return this.visualModel; }
-      private set {
-        if (this.visualModel != null) {
-          this.visualModel.Changed -= new EventHandler(model_Changed);                 
-        }
-        this.visualModel = value;
-        if (this.visualModel != null) {
-          this.Caption = this.visualModel.ModelName + " " + DEFAULT_CAPTION;
-          this.visualModel.Changed += new EventHandler(model_Changed);
+      Content = dataAnalysisSolution;
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+
+    void Content_ProblemDataChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    void Content_ModelChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateChart();
+    }
+
+    private void UpdateChart() {
+      if (InvokeRequired) Invoke((Action)UpdateChart);
+      else {
+        if (Content != null) {
+          this.Caption = Content.ItemName + " " + DEFAULT_CAPTION;
           this.UpdateSeries();
           if (!this.chart.Series.Any(s => s.Points.Count > 0))
@@ -107,23 +127,22 @@
 
     private void UpdateSeries() {
+      string targetVariableName = Content.ProblemData.TargetVariable.Value;
+      Dataset dataset = Content.ProblemData.Dataset;
+      int trainingStart = Content.ProblemData.TrainingSamplesStart.Value;
+      int trainingEnd = Content.ProblemData.TrainingSamplesEnd.Value;
+      int testStart = Content.ProblemData.TestSamplesStart.Value;
+      int testEnd = Content.ProblemData.TestSamplesEnd.Value;
       if (this.chart.Series[ALL_SERIES].Points.Count > 0)
-        this.chart.Series[ALL_SERIES].Points.DataBindXY(this.visualModel.PredictedValues.ToArray(), "",
-          this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName), "");
+        this.chart.Series[ALL_SERIES].Points.DataBindXY(Content.EstimatedValues.ToArray(), "",
+          dataset[targetVariableName], "");
       if (this.chart.Series[TRAINING_SERIES].Points.Count > 0)
-        this.chart.Series[TRAINING_SERIES].Points.DataBindXY(this.visualModel.PredictedTrainingValues.ToArray(), "",
-          this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.TrainingSamplesStart, this.visualModel.TrainingSamplesEnd), "");
-      if (this.chart.Series[validationSeries].Points.Count > 0)
-        this.chart.Series[validationSeries].Points.DataBindXY(this.visualModel.PredictedValidationValues.ToArray(), "",
-          this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.ValidationSamplesStart, this.visualModel.ValidationSamplesEnd), "");
+        this.chart.Series[TRAINING_SERIES].Points.DataBindXY(Content.EstimatedTrainingValues.ToArray(), "",
+          dataset.GetVariableValues(targetVariableName, trainingStart, trainingEnd), "");
       if (this.chart.Series[TEST_SERIES].Points.Count > 0)
-        this.chart.Series[TEST_SERIES].Points.DataBindXY(this.visualModel.PredictedTestValues.ToArray(), "",
-          this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.TestSamplesStart, this.visualModel.TestSamplesEnd), "");
-
-      double x = this.visualModel.PredictedValues.Max();
-      double y = this.visualModel.Dataset.GetMaximum(this.visualModel.TargetVariableName);
-      double max = x > y ? x : y;
-      x = this.visualModel.PredictedValues.Min();
-      y = this.visualModel.Dataset.GetMinimum(this.visualModel.TargetVariableName);
-      double min = x < y ? x : y;
+        this.chart.Series[TEST_SERIES].Points.DataBindXY(Content.EstimatedTestValues.ToArray(), "",
+          dataset.GetVariableValues(targetVariableName, testStart, testEnd), "");
+
+      double max = Math.Max(Content.EstimatedValues.Max(), dataset.GetMax(targetVariableName));
+      double min = Math.Min(Content.EstimatedValues.Min(), dataset.GetMin(targetVariableName));
 
       max = Math.Ceiling(max) * 1.2;
@@ -139,65 +158,37 @@
       this.chart.Series[ALL_SERIES].Points.Clear();
       this.chart.Series[TRAINING_SERIES].Points.Clear();
-      this.chart.Series[validationSeries].Points.Clear();
       this.chart.Series[TEST_SERIES].Points.Clear();
     }
-
-
-    private void model_Changed(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Action<object, EventArgs> action = new Action<object, EventArgs>(model_Changed);
-        this.Invoke(action, sender, e);
-      } else {
-        this.Caption = this.visualModel.ModelName + " " + DEFAULT_CAPTION;
-        this.UpdateSeries();
-      }
-    }
-
-    protected override void OnClosed(FormClosedEventArgs e) {
-      base.OnClosed( e);
-      this.VisualModel = null;
-    }
-
-    protected override void ModelsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
-      if (InvokeRequired) {
-        Action<object, NotifyCollectionChangedEventArgs> action = new Action<object, NotifyCollectionChangedEventArgs>(ModelsCollectionChanged);
-        this.Invoke(action, sender, e);
-      } else {
-        if (e.Action == NotifyCollectionChangedAction.Remove) {
-          if (e.OldItems.Contains(this.visualModel))
-            this.VisualModel = null;
-        }
-        if(e.Action == NotifyCollectionChangedAction.Reset)
-          this.VisualModel = null;
-      }
-    }  
 
     private void ToggleSeriesData(Series series) {
       if (series.Points.Count > 0) {  //checks if series is shown
         if (this.chart.Series.Any(s => s != series && s.Points.Count > 0)) {
-          series.Points.Clear();    
+          series.Points.Clear();
         }
-      } else if (this.visualModel != null) {
+      } else if (Content != null) {
+        string targetVariableName = Content.ProblemData.TargetVariable.Value;
+        Dataset dataset = Content.ProblemData.Dataset;
+        int trainingStart = Content.ProblemData.TrainingSamplesStart.Value;
+        int trainingEnd = Content.ProblemData.TrainingSamplesEnd.Value;
+        int testStart = Content.ProblemData.TestSamplesStart.Value;
+        int testEnd = Content.ProblemData.TestSamplesEnd.Value;
+
         IEnumerable<double> predictedValues = null;
         IEnumerable<double> targetValues = null;
         switch (series.Name) {
           case ALL_SERIES:
-            predictedValues = this.visualModel.PredictedValues;
-            targetValues = this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName);
+            predictedValues = Content.EstimatedValues;
+            targetValues = dataset[targetVariableName];
             break;
           case TRAINING_SERIES:
-            predictedValues = this.visualModel.PredictedTrainingValues;
-            targetValues = this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.TrainingSamplesStart, this.visualModel.TrainingSamplesEnd);
-            break;
-          case validationSeries:
-            predictedValues = this.visualModel.PredictedValidationValues;
-            targetValues = this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.ValidationSamplesStart, this.visualModel.ValidationSamplesEnd);
+            predictedValues = Content.EstimatedTrainingValues;
+            targetValues = dataset.GetVariableValues(targetVariableName, trainingStart, trainingEnd);
             break;
           case TEST_SERIES:
-            predictedValues = this.visualModel.PredictedTestValues;
-            targetValues = this.visualModel.Dataset.GetVariableValues(this.visualModel.TargetVariableName, this.visualModel.TestSamplesStart, this.visualModel.TestSamplesEnd);
+            predictedValues = Content.EstimatedTestValues;
+            targetValues = dataset.GetVariableValues(targetVariableName, testStart, testEnd);
             break;
         }
-        series.Points.DataBindXY(predictedValues.ToArray(), "", targetValues, "");
+        series.Points.DataBindXY(predictedValues, "", targetValues, "");
         this.chart.Legends[series.Legend].ForeColor = Color.Black;
       }
@@ -227,22 +218,5 @@
       e.LegendItems[0].Cells[1].ForeColor = this.chart.Series[ALL_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
       e.LegendItems[1].Cells[1].ForeColor = this.chart.Series[TRAINING_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
-      e.LegendItems[2].Cells[1].ForeColor = this.chart.Series[validationSeries].Points.Count == 0 ? Color.Gray : Color.Black;
-      e.LegendItems[3].Cells[1].ForeColor = this.chart.Series[TEST_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
-    }
-
-
-    private void ScatterPlotView_DragDrop(object sender, DragEventArgs e) {
-      IVisualModel model = this.ExtractModel(e.Data);
-      if (model != null) {
-        this.VisualModel = model;
-      }
-    }
-
-    private void ScatterPlotView_DragEnter(object sender, DragEventArgs e) {
-      IVisualModel model = this.ExtractModel(e.Data);
-      if (model != null)
-        e.Effect = DragDropEffects.Link;
-      else
-        e.Effect = DragDropEffects.None;
+      e.LegendItems[2].Cells[1].ForeColor = this.chart.Series[TEST_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
     }
   }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.cs	(revision 3442)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Modeling;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views.Symbolic {
+  [View("Simplified Symbolic Expression Model View")]
+  [Content(typeof(SymbolicRegressionSolution))]
+  public partial class SimplifiedSymbolicExpressionModelView : AsynchronousContentView {
+    public new SymbolicRegressionSolution Content {
+      get { return (SymbolicRegressionSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
+    private ViewHost viewHost;
+
+    public SimplifiedSymbolicExpressionModelView()
+      : base() {
+      InitializeComponent();
+
+      // manual initialization of viewhost for the simplified model
+      viewHost = new ViewHost();
+      viewHost.Dock = DockStyle.Fill;
+      simplifiedModelGroupBox.Controls.Add(viewHost);
+    }
+
+    public SimplifiedSymbolicExpressionModelView(SymbolicRegressionSolution content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      var simplifier = new SymbolicSimplifier();
+      var simplifiedTree = simplifier.Simplify(Content.Model.SymbolicExpressionTree);
+      viewHost.Content = simplifiedTree;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.designer.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.designer.cs	(revision 3442)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Problems.DataAnalysis.Views.Symbolic {
+  partial class SimplifiedSymbolicExpressionModelView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.simplifiedModelGroupBox = new System.Windows.Forms.GroupBox();
+      this.SuspendLayout();
+      // 
+      // simplifiedModelGroupBox
+      // 
+      this.simplifiedModelGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.simplifiedModelGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.simplifiedModelGroupBox.Name = "simplifiedModelGroupBox";
+      this.simplifiedModelGroupBox.Size = new System.Drawing.Size(352, 413);
+      this.simplifiedModelGroupBox.TabIndex = 0;
+      this.simplifiedModelGroupBox.TabStop = false;
+      this.simplifiedModelGroupBox.Text = "Simplified Symbolic Expression Model";
+      // 
+      // SimplifiedSymbolicExpressionModelView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.simplifiedModelGroupBox);
+      this.Name = "SimplifiedSymbolicExpressionModelView";
+      this.Size = new System.Drawing.Size(352, 413);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox simplifiedModelGroupBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.resx	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SimplifiedSymbolicExpressionModelView.resx	(revision 3442)
@@ -0,0 +1,120 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.cs	(revision 3442)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Modeling;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views.Symbolic {
+  [View("Symbolic Exression Model View")]
+  [Content(typeof(SymbolicRegressionSolution))]
+  public partial class SymbolicExpressionModelView : AsynchronousContentView {
+    public new SymbolicRegressionSolution Content {
+      get { return (SymbolicRegressionSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
+    private ViewHost viewHost;
+
+    public SymbolicExpressionModelView()
+      : base() {
+      InitializeComponent();
+
+      // manual initialization of viewhost for the simplified model
+      viewHost = new ViewHost();
+      viewHost.Dock = DockStyle.Fill;
+      modelGroupBox.Controls.Add(viewHost);
+    }
+
+    public SymbolicExpressionModelView(SymbolicRegressionSolution content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      viewHost.Content = Content.Model.SymbolicExpressionTree;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.designer.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.designer.cs	(revision 3442)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Problems.DataAnalysis.Views.Symbolic {
+  partial class SymbolicExpressionModelView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.modelGroupBox = new System.Windows.Forms.GroupBox();
+      this.SuspendLayout();
+      // 
+      // modelGroupBox
+      // 
+      this.modelGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.modelGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.modelGroupBox.Name = "modelGroupBox";
+      this.modelGroupBox.Size = new System.Drawing.Size(352, 413);
+      this.modelGroupBox.TabIndex = 0;
+      this.modelGroupBox.TabStop = false;
+      this.modelGroupBox.Text = "Symbolic Expression Model";
+      // 
+      // SymbolicExpressionModelView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.modelGroupBox);
+      this.Name = "SymbolicExpressionModelView";
+      this.Size = new System.Drawing.Size(352, 413);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox modelGroupBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.resx	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionModelView.resx	(revision 3442)
@@ -0,0 +1,120 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs	(revision 3442)
@@ -36,74 +36,122 @@
   [StorableClass]
   public class DataAnalysisProblemData : NamedItem {
+    [Storable]
+    private VariableCollection variables;
+    public VariableCollection Variables {
+      get { return variables; }
+    }
+
+    #region variable properties
+    public IVariable DatasetVariable {
+      get { return variables["Dataset"]; }
+    }
+
+    public IVariable TargetVariableVariable {
+      get { return variables["TargetVariable"]; }
+    }
+
+    public IVariable InputVariablesVariable {
+      get { return variables["InputVariables"]; }
+    }
+
+    public IVariable TrainingSamplesStartVariable {
+      get { return variables["TrainingSamplesStart"]; }
+    }
+    public IVariable TrainingSamplesEndVariable {
+      get { return variables["TrainingSamplesEnd"]; }
+    }
+
+    public IVariable TestSamplesStartVariable {
+      get { return variables["TestSamplesStart"]; }
+    }
+    public IVariable TestSamplesEndVariable {
+      get { return variables["TestSamplesEnd"]; }
+    }
+    #endregion
+
     #region properties
-    private Dataset dataset;
-    [Storable]
     public Dataset Dataset {
-      get { return dataset; }
-      set {
-        if (dataset != value) {
-          if (value == null) throw new ArgumentNullException();
-          else {
-            dataset = value;
-            OnDatasetChanged(EventArgs.Empty);
-          }
-        }
-      }
-    }
-    private StringValue targetVariable;
-    [Storable]
+      get { return (Dataset)DatasetVariable.Value; }
+      set {
+        if (value != Dataset) {
+          if (value == null) throw new ArgumentNullException();
+          if (Dataset != null) DeregisterDatasetEventHandlers();
+          DatasetVariable.Value = value;
+          RegisterDatasetEventHandlers();
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public StringValue TargetVariable {
-      get { return targetVariable; }
-      set { targetVariable = value; }
-    }
-    private ItemList<StringValue> inputVariables;
-    [Storable]
+      get { return (StringValue)TargetVariableVariable.Value; }
+      set {
+        if (value != TargetVariableVariable) {
+          if (value == null) throw new ArgumentNullException();
+          if (TargetVariable != null) DeregisterStringValueEventHandlers(TargetVariable);
+          TargetVariableVariable.Value = value;
+          RegisterStringValueEventHandlers(TargetVariable);
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public ItemList<StringValue> InputVariables {
-      get { return inputVariables; }
-      set {
-        if (inputVariables != value) {
-          if (value == null) throw new ArgumentNullException();
-          else {
-            inputVariables = value;
-            OnInputVariablesChanged(EventArgs.Empty);
-          }
-        }
-      }
-    }
-    private IntValue trainingSamplesStart;
-    [Storable]
+      get { return (ItemList<StringValue>)InputVariablesVariable.Value; }
+      set {
+        if (value != InputVariables) {
+          if (value == null) throw new ArgumentNullException();
+          if (InputVariables != null) DeregisterInputVariablesEventHandlers();
+          InputVariablesVariable.Value = value;
+          RegisterInputVariablesEventHandlers();
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public IntValue TrainingSamplesStart {
-      get { return trainingSamplesStart; }
-      set { trainingSamplesStart = value; }
-    }
-    private IntValue trainingSamplesEnd;
-    [Storable]
+      get { return (IntValue)TrainingSamplesStartVariable.Value; }
+      set {
+        if (value != TrainingSamplesStart) {
+          if (value == null) throw new ArgumentNullException();
+          if (TrainingSamplesStart != null) DeregisterValueTypeEventHandlers(TrainingSamplesStart);
+          TrainingSamplesStartVariable.Value = value;
+          RegisterValueTypeEventHandlers(TrainingSamplesStart);
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public IntValue TrainingSamplesEnd {
-      get { return trainingSamplesEnd; }
-      set { trainingSamplesEnd = value; }
-    }
-    private IntValue validationSamplesStart;
-    [Storable]
-    public IntValue ValidationSamplesStart {
-      get { return validationSamplesStart; }
-      set { validationSamplesStart = value; }
-    }
-    private IntValue validationSamplesEnd;
-    [Storable]
-    public IntValue ValidationSamplesEnd {
-      get { return validationSamplesEnd; }
-      set { validationSamplesEnd = value; }
-    }
-    private IntValue testSamplesStart;
-    [Storable]
+      get { return (IntValue)TrainingSamplesEndVariable.Value; }
+      set {
+        if (value != TrainingSamplesEnd) {
+          if (value == null) throw new ArgumentNullException();
+          if (TrainingSamplesEnd != null) DeregisterValueTypeEventHandlers(TrainingSamplesEnd);
+          TrainingSamplesEndVariable.Value = value;
+          RegisterValueTypeEventHandlers(TrainingSamplesEnd);
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public IntValue TestSamplesStart {
-      get { return testSamplesStart; }
-      set { testSamplesStart = value; }
-    }
-    private IntValue testSamplesEnd;
-    [Storable]
+      get { return (IntValue)TestSamplesStartVariable.Value; }
+      set {
+        if (value != TestSamplesStart) {
+          if (value == null) throw new ArgumentNullException();
+          if (TestSamplesStart != null) DeregisterValueTypeEventHandlers(TestSamplesStart);
+          TestSamplesStartVariable.Value = value;
+          RegisterValueTypeEventHandlers(TestSamplesStart);
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
+    }
     public IntValue TestSamplesEnd {
-      get { return testSamplesEnd; }
-      set { testSamplesEnd = value; }
+      get { return (IntValue)TestSamplesEndVariable.Value; }
+      set {
+        if (value != TestSamplesEnd) {
+          if (value == null) throw new ArgumentNullException();
+          if (TestSamplesEnd != null) DeregisterValueTypeEventHandlers(TestSamplesEnd);
+          TestSamplesEndVariable.Value = value;
+          RegisterValueTypeEventHandlers(TestSamplesEnd);
+          OnProblemDataChanged(EventArgs.Empty);
+        }
+      }
     }
     #endregion
@@ -111,13 +159,13 @@
     public DataAnalysisProblemData()
       : base() {
-      dataset = new Dataset();
-      targetVariable = new StringValue();
-      inputVariables = new ItemList<StringValue>();
-      trainingSamplesStart = new IntValue();
-      trainingSamplesEnd = new IntValue();
-      validationSamplesStart = new IntValue();
-      validationSamplesEnd = new IntValue();
-      testSamplesStart = new IntValue();
-      testSamplesEnd = new IntValue();
+      variables = new VariableCollection();
+      variables.Add(new Variable("Dataset", new Dataset()));
+      variables.Add(new Variable("InputVariables", new ItemList<StringValue>()));
+      variables.Add(new Variable("TargetVariable", new StringValue()));
+      variables.Add(new Variable("TrainingSamplesStart", new IntValue()));
+      variables.Add(new Variable("TrainingSamplesEnd", new IntValue()));
+      variables.Add(new Variable("TestSamplesStart", new IntValue()));
+      variables.Add(new Variable("TestSamplesEnd", new IntValue()));
+      RegisterEventHandlers();
     }
 
@@ -125,16 +173,120 @@
     private DataAnalysisProblemData(bool deserializing) : base() { }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      RegisterEventHandlers();
+    }
+
     #region events
-    public event EventHandler InputVariablesChanged;
-    protected virtual void OnInputVariablesChanged(EventArgs e) {
-      var listeners = InputVariablesChanged;
+    private void RegisterEventHandlers() {
+      RegisterDatasetEventHandlers();
+      RegisterInputVariablesEventHandlers();
+      RegisterStringValueEventHandlers(TargetVariable);
+      RegisterValueTypeEventHandlers(TrainingSamplesStart);
+      RegisterValueTypeEventHandlers(TrainingSamplesEnd);
+      RegisterValueTypeEventHandlers(TestSamplesStart);
+      RegisterValueTypeEventHandlers(TestSamplesEnd);
+    }
+
+    public event EventHandler ProblemDataChanged;
+    protected virtual void OnProblemDataChanged(EventArgs e) {
+      var listeners = ProblemDataChanged;
       if (listeners != null) listeners(this, e);
     }
 
-    public event EventHandler DatasetChanged;
-    protected virtual void OnDatasetChanged(EventArgs e) {
-      EventHandler handler = DatasetChanged;
-      if (handler != null) handler(this, e);
-    }
+
+    private void RegisterValueTypeEventHandlers<T>(ValueTypeValue<T> value) where T : struct {
+      value.ValueChanged += new EventHandler(value_ValueChanged);
+    }
+
+    private void DeregisterValueTypeEventHandlers<T>(ValueTypeValue<T> value) where T : struct {
+      value.ValueChanged -= new EventHandler(value_ValueChanged);
+    }
+
+    void value_ValueChanged(object sender, EventArgs e) {
+      OnProblemDataChanged(e);
+    }
+
+    private void RegisterStringValueEventHandlers(StringValue value) {
+      value.ValueChanged += new EventHandler(value_ValueChanged);
+    }
+
+    private void DeregisterStringValueEventHandlers(StringValue value) {
+      value.ValueChanged -= new EventHandler(value_ValueChanged);
+    }
+
+    private void RegisterDatasetEventHandlers() {
+      Dataset.DataChanged += new EventHandler<EventArgs<int, int>>(Dataset_DataChanged);
+      Dataset.Reset += new EventHandler(Dataset_Reset);
+      Dataset.ColumnNamesChanged += new EventHandler(Dataset_ColumnNamesChanged);
+    }
+
+    private void DeregisterDatasetEventHandlers() {
+      Dataset.DataChanged -= new EventHandler<EventArgs<int, int>>(Dataset_DataChanged);
+      Dataset.Reset -= new EventHandler(Dataset_Reset);
+      Dataset.ColumnNamesChanged -= new EventHandler(Dataset_ColumnNamesChanged);
+    }
+
+    void Dataset_ColumnNamesChanged(object sender, EventArgs e) {
+      OnProblemDataChanged(e);
+    }
+
+    void Dataset_Reset(object sender, EventArgs e) {
+      OnProblemDataChanged(e);
+    }
+
+    void Dataset_DataChanged(object sender, EventArgs<int, int> e) {
+      OnProblemDataChanged(e);
+    }
+
+    private void RegisterInputVariablesEventHandlers() {
+      InputVariables.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_CollectionReset);
+      InputVariables.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsAdded);
+      InputVariables.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsRemoved);
+      InputVariables.ItemsReplaced += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsReplaced);
+      foreach (var item in InputVariables)
+        item.ValueChanged += new EventHandler(InputVariables_Value_ValueChanged);
+    }
+
+    private void DeregisterInputVariablesEventHandlers() {
+      InputVariables.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_CollectionReset);
+      InputVariables.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsAdded);
+      InputVariables.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsRemoved);
+      InputVariables.ItemsReplaced -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<HeuristicLab.Collections.IndexedItem<StringValue>>(InputVariables_ItemsReplaced);
+      foreach (var item in InputVariables) {
+        item.ValueChanged -= new EventHandler(InputVariables_Value_ValueChanged);
+      }
+    }
+
+    void InputVariables_ItemsReplaced(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<HeuristicLab.Collections.IndexedItem<StringValue>> e) {
+      foreach (var indexedItem in e.OldItems)
+        indexedItem.Value.ValueChanged -= new EventHandler(InputVariables_Value_ValueChanged);
+      foreach (var indexedItem in e.Items)
+        indexedItem.Value.ValueChanged += new EventHandler(InputVariables_Value_ValueChanged);
+      OnProblemDataChanged(e);
+    }
+
+    void InputVariables_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<HeuristicLab.Collections.IndexedItem<StringValue>> e) {
+      foreach (var indexedItem in e.Items)
+        indexedItem.Value.ValueChanged -= new EventHandler(InputVariables_Value_ValueChanged);
+      OnProblemDataChanged(e);
+    }
+
+    void InputVariables_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<HeuristicLab.Collections.IndexedItem<StringValue>> e) {
+      foreach (var indexedItem in e.Items)
+        indexedItem.Value.ValueChanged += new EventHandler(InputVariables_Value_ValueChanged);
+      OnProblemDataChanged(e);
+    }
+
+    void InputVariables_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<HeuristicLab.Collections.IndexedItem<StringValue>> e) {
+      foreach (var indexedItem in e.OldItems)
+        indexedItem.Value.ValueChanged -= new EventHandler(InputVariables_Value_ValueChanged);
+
+      OnProblemDataChanged(e);
+    }
+    void InputVariables_Value_ValueChanged(object sender, EventArgs e) {
+      OnProblemDataChanged(e);
+    }
+
     #endregion
 
@@ -147,8 +299,17 @@
       TargetVariable = new StringValue(Dataset.VariableNames.First());
       InputVariables = new ItemList<StringValue>(Dataset.VariableNames.Skip(1).Select(s => new StringValue(s)));
+      int middle = (int)(csvFileParser.Rows * 0.5);
       TrainingSamplesStart = new IntValue(0);
-      TrainingSamplesEnd = new IntValue(csvFileParser.Rows);
-      TestSamplesStart = new IntValue(0);
+      TrainingSamplesEnd = new IntValue(middle);
+      TestSamplesStart = new IntValue(middle);
       TestSamplesEnd = new IntValue(csvFileParser.Rows);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      DataAnalysisProblemData clone = (DataAnalysisProblemData)base.Clone(cloner);
+      clone.variables = (VariableCollection)variables.Clone(cloner);
+
+      clone.RegisterEventHandlers();
+      return clone;
     }
   }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs	(revision 3442)
@@ -26,4 +26,6 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace HeuristicLab.Problems.DataAnalysis {
@@ -33,13 +35,13 @@
   [Item("DataAnalysisSolution", "Represents a solution for a data analysis problem which can be visualized in the GUI.")]
   [StorableClass]
-  public sealed class DataAnalysisSolution : Item {
+  public class DataAnalysisSolution : Item {
     [Storable]
-    private IPredictor predictor;
-    public IPredictor Predictor {
-      get { return predictor; }
+    private IModel model;
+    public IModel Model {
+      get { return model; }
       set {
-        if (predictor != value) {
-          predictor = value;
-          OnPredictorChanged();
+        if (model != value) {
+          model = value;
+          OnModelChanged();
         }
       }
@@ -52,19 +54,42 @@
       set {
         if (problemData != value) {
+          if (value == null) throw new ArgumentNullException();
           if (problemData != null) DeregisterProblemDataEvents();
           problemData = value;
-          if (problemData != null) RegisterProblemDataEvents();
+          RegisterProblemDataEvents();
           OnProblemDataChanged();
         }
       }
     }
-    
+
+    private List<double> estimatedValues;
+    public IEnumerable<double> EstimatedValues {
+      get {
+        return estimatedValues;
+      }
+    }
+
+    private List<double> estimatedTrainingValues;
+    public IEnumerable<double> EstimatedTrainingValues {
+      get {
+        return estimatedTrainingValues;
+      }
+    }
+
+    private List<double> estimatedTestValues;
+    public IEnumerable<double> EstimatedTestValues {
+      get {
+        return estimatedTestValues;
+      }
+    }
+
     public DataAnalysisSolution() : base() { }
-    public DataAnalysisSolution(DataAnalysisProblemData problemData, IPredictor predictor)
+    public DataAnalysisSolution(DataAnalysisProblemData problemData, IModel model)
       : this() {
       this.problemData = problemData;
-      this.predictor = predictor;
+      this.model = model;
       Initialize();
     }
+
     [StorableConstructor]
     private DataAnalysisSolution(bool deserializing) : base(deserializing) { }
@@ -75,8 +100,27 @@
     }
 
+    private void RecalculateEstimatedValues() {
+      estimatedValues = GetEstimatedValues(0, problemData.Dataset.Rows).ToList();
+      int nTrainingValues = problemData.TrainingSamplesEnd.Value - problemData.TrainingSamplesStart.Value;
+      estimatedTrainingValues = estimatedValues.Skip(problemData.TrainingSamplesStart.Value).Take(nTrainingValues).ToList();
+      int nTestValues = problemData.TestSamplesEnd.Value - problemData.TestSamplesStart.Value;
+      estimatedTestValues = estimatedValues.Skip(problemData.TestSamplesStart.Value).Take(nTestValues).ToList();
+    }
+
+    private IEnumerable<double> GetEstimatedValues(int start, int end) {
+      double[] xs = new double[ProblemData.InputVariables.Count];
+      for (int row = 0; row < ProblemData.Dataset.Rows; row++) {
+        for (int i = 0; i < xs.Length; i++) {
+          var variableIndex = ProblemData.Dataset.GetVariableIndex(ProblemData.InputVariables[i].Value);
+          xs[i] = ProblemData.Dataset[row, variableIndex];
+        }
+        yield return model.GetValue(xs);
+      }
+    }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       DataAnalysisSolution clone = new DataAnalysisSolution();
       cloner.RegisterClonedObject(this, clone);
-      clone.predictor = (IPredictor)cloner.Clone(predictor);
+      clone.model = (IModel)cloner.Clone(model);
       clone.problemData = problemData;
       clone.Initialize();
@@ -85,7 +129,8 @@
 
     #region Events
-    public event EventHandler PredictorChanged;
-    private void OnPredictorChanged() {
-      var changed = PredictorChanged;
+    public event EventHandler ModelChanged;
+    private void OnModelChanged() {
+      RecalculateEstimatedValues();
+      var changed = ModelChanged;
       if (changed != null)
         changed(this, EventArgs.Empty);
@@ -93,4 +138,5 @@
     public event EventHandler ProblemDataChanged;
     private void OnProblemDataChanged() {
+      RecalculateEstimatedValues();
       var changed = ProblemDataChanged;
       if (changed != null)
@@ -99,11 +145,11 @@
 
     private void RegisterProblemDataEvents() {
-      ProblemData.DatasetChanged += new EventHandler(ProblemData_DataSetChanged);
+      ProblemData.ProblemDataChanged += new EventHandler(ProblemData_Changed);
     }
     private void DeregisterProblemDataEvents() {
-      ProblemData.DatasetChanged += new EventHandler(ProblemData_DataSetChanged);
+      ProblemData.ProblemDataChanged += new EventHandler(ProblemData_Changed);
     }
 
-    private void ProblemData_DataSetChanged(object sender, EventArgs e) {
+    private void ProblemData_Changed(object sender, EventArgs e) {
       OnProblemDataChanged();
     }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 3442)
@@ -36,5 +36,5 @@
   public sealed class Dataset : NamedItem, IStringConvertibleMatrix {
     public Dataset()
-      : this(new string[0], new double[,] { { } }) {
+      : this(new string[1] { "y" }, new double[,] { { 0.0 } }) {
     }
 
@@ -45,6 +45,6 @@
         throw new ArgumentException("Number of variable names doesn't match the number of columns of data");
       }
-      Data = data;
-      this.VariableNames = variableNames;
+      this.data = data;
+      this.variableNames = variableNames.ToArray();
       this.SortableView = false;
     }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj	(revision 3442)
@@ -93,9 +93,10 @@
     <Compile Include="Evaluators\SimpleMSEEvaluator.cs" />
     <Compile Include="HeuristicLabProblemsDataAnalysisPlugin.cs" />
-    <Compile Include="Interfaces\IPredictor.cs" />
+    <Compile Include="Interfaces\IModel.cs" />
     <Compile Include="MatrixExtensions.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Symbolic\ArithmeticExpressionGrammar.cs" />
     <Compile Include="Symbolic\SimpleArithmeticExpressionEvaluator.cs" />
+    <Compile Include="Symbolic\SymbolicSimplifier.cs" />
     <Compile Include="Symbolic\Symbols\Constant.cs" />
     <Compile Include="Symbolic\Symbols\ConstantTreeNode.cs" />
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IModel.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IModel.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IModel.cs	(revision 3442)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public interface IModel : IDeepCloneable {
+    double GetValue(double[] xs);
+  }
+}
Index: unk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IPredictor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IPredictor.cs	(revision 3441)
+++ 	(revision )
@@ -1,36 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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.Linq;
-using System.Text;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  public interface IPredictor : IDeepCloneable {
-    double Estimate(double[] xs);
-  }
-}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs	(revision 3442)
@@ -35,14 +35,4 @@
   public class ArithmeticExpressionGrammar : DefaultSymbolicExpressionGrammar {
     [Storable]
-    private List<string> variableNames = new List<string>();
-    public IEnumerable<string> VariableNames {
-      get { return variableNames; }
-      set {
-        variableNames = new List<string>(value);
-        variableSymbol.VariableNames = variableNames;
-      }
-    }
-
-    [Storable]
     private HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable variableSymbol;
 
@@ -58,4 +48,6 @@
       var div = new Division();
       var constant = new Constant();
+      constant.MinValue = -20;
+      constant.MaxValue = 20;
       variableSymbol = new HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable();
 
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionEvaluator.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionEvaluator.cs	(revision 3442)
@@ -44,5 +44,5 @@
         this.row = row;
         pc = 0;
-        arguments.Clear();
+        argumentStack.Clear();
         var estimatedValue = Evaluate();
         if (double.IsNaN(estimatedValue) || double.IsInfinity(estimatedValue)) yield return 0.0;
@@ -51,5 +51,5 @@
     }
 
-    private List<double> arguments = new List<double>();
+    private Stack<List<double>> argumentStack = new Stack<List<double>>();
     public double Evaluate() {
       var currentInstr = code[pc++];
@@ -85,10 +85,10 @@
         case CodeSymbol.Call: {
             // save current arguments
-            var oldArgs = new List<double>(arguments);
-            arguments.Clear();
+            List<double> arguments = new List<double>();
             // evaluate sub-trees
             for (int i = 0; i < currentInstr.nArguments; i++) {
               arguments.Add(Evaluate());
             }
+            argumentStack.Push(arguments);
             // save the pc
             int nextPc = pc;
@@ -97,12 +97,11 @@
             // evaluate the function
             double v = Evaluate();
+            argumentStack.Pop();
             // restore the pc => evaluation will continue at point after my subtrees  
             pc = nextPc;
-            // restore arguments
-            arguments = oldArgs;
             return v;
           }
         case CodeSymbol.Arg: {
-            return arguments[currentInstr.iArg0];
+            return argumentStack.Peek()[currentInstr.iArg0];
           }
         case CodeSymbol.Dynamic: {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs	(revision 3442)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs	(revision 3442)
@@ -0,0 +1,360 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.GeneralSymbols;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
+using System.Diagnostics;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  /// <summary>
+  /// Simplistic simplifier for arithmetic expressions
+  /// Rules:
+  ///  * Constants are always the last argument to any function
+  ///  * f(c1, c2) => c3 (constant expression folding)
+  ///  * c1 / ( c2 * Var) => ( var * ( c2 / c1))
+  /// </summary>
+  public class SymbolicSimplifier {
+    public SymbolicExpressionTree Simplify(SymbolicExpressionTree originalTree) {
+      var clone = (SymbolicExpressionTreeNode)originalTree.Root.Clone();
+      // macro expand (initially no argument trees)
+      var macroExpandedTree = MacroExpand(clone, clone.SubTrees[0], new List<SymbolicExpressionTreeNode>());
+      return new SymbolicExpressionTree(GetSimplifiedTree(macroExpandedTree));
+    }
+
+    // the argumentTrees list contains already expanded trees used as arguments for invocations
+    private SymbolicExpressionTreeNode MacroExpand(SymbolicExpressionTreeNode root, SymbolicExpressionTreeNode node, IList<SymbolicExpressionTreeNode> argumentTrees) {
+      List<SymbolicExpressionTreeNode> subtrees = new List<SymbolicExpressionTreeNode>(node.SubTrees);
+      while (node.SubTrees.Count > 0) node.SubTrees.RemoveAt(0);
+      if (node.Symbol is InvokeFunction) {
+        var invokeSym = node.Symbol as InvokeFunction;
+        var defunNode = FindFunctionDefinition(root, invokeSym.FunctionName);
+        var macroExpandedArguments = new List<SymbolicExpressionTreeNode>();
+        foreach (var subtree in subtrees) {
+          macroExpandedArguments.Add(MacroExpand(root, subtree, argumentTrees));
+        }
+        return MacroExpand(root, defunNode, macroExpandedArguments);
+      } else if (node.Symbol is Argument) {
+        var argSym = node.Symbol as Argument;
+        // return the correct argument sub-tree (already macro-expanded)
+        return (SymbolicExpressionTreeNode)argumentTrees[argSym.ArgumentIndex].Clone();
+      } else {
+        // recursive application
+        foreach (var subtree in subtrees) {
+          node.AddSubTree(MacroExpand(root, subtree, argumentTrees));
+        }
+        return node;
+      }
+    }
+
+    private SymbolicExpressionTreeNode FindFunctionDefinition(SymbolicExpressionTreeNode root, string functionName) {
+      foreach (var subtree in root.SubTrees.OfType<DefunTreeNode>()) {
+        if (subtree.FunctionName == functionName) return subtree.SubTrees[0];
+      }
+
+      throw new ArgumentException("Definition of function " + functionName + " not found.");
+    }
+
+    /// <summary>
+    /// Creates a new simplified tree
+    /// </summary>
+    /// <param name="original"></param>
+    /// <returns></returns>
+    public SymbolicExpressionTreeNode GetSimplifiedTree(SymbolicExpressionTreeNode original) {
+      if (IsConstant(original) || IsVariable(original)) {
+        return (SymbolicExpressionTreeNode)original.Clone();
+      } else if (IsAddition(original)) {
+        if (original.SubTrees.Count == 1) {
+          return GetSimplifiedTree(original.SubTrees[0]);
+        } else {
+          // simplify expression x0..xn
+          // make addition (x0..xn)
+          Trace.Assert(original.SubTrees.Count > 1);
+          return original.SubTrees
+            .Select(x => GetSimplifiedTree(x))
+            .Aggregate((a, b) => MakeAddition(a, b));
+        }
+      } else if (IsSubtraction(original)) {
+        if (original.SubTrees.Count == 1) {
+          return Negate(GetSimplifiedTree(original.SubTrees[0]));
+        } else {
+          // simplify expressions x0..xn
+          // make addition (x0,-x1..-xn)
+          Trace.Assert(original.SubTrees.Count > 1);
+          var simplifiedTrees = original.SubTrees.Select(x => GetSimplifiedTree(x));
+          return simplifiedTrees.Take(1)
+            .Concat(simplifiedTrees.Skip(1).Select(x => Negate(x)))
+            .Aggregate((a, b) => MakeAddition(a, b));
+        }
+      } else if (IsMultiplication(original)) {
+        if (original.SubTrees.Count == 1) {
+          return GetSimplifiedTree(original.SubTrees[0]);
+        } else {
+          Trace.Assert(original.SubTrees.Count > 1);
+          return original.SubTrees
+            .Select(x => GetSimplifiedTree(x))
+            .Aggregate((a, b) => MakeMultiplication(a, b));
+        }
+      } else if (IsDivision(original)) {
+        if (original.SubTrees.Count == 1) {
+          return Invert(GetSimplifiedTree(original.SubTrees[0]));
+        } else {
+          // simplify expressions x0..xn
+          // make multiplication (x0 * 1/(x1 * x1 * .. * xn))
+          Trace.Assert(original.SubTrees.Count > 1);
+          var simplifiedTrees = original.SubTrees.Select(x => GetSimplifiedTree(x));
+          return
+            MakeMultiplication(simplifiedTrees.First(), Invert(simplifiedTrees.Skip(1).Aggregate((a, b) => MakeMultiplication(a, b))));
+        }
+      } else {
+        // can't simplify this function but simplify all subtrees 
+        // TODO evaluate the function if original is a constant expression
+        List<SymbolicExpressionTreeNode> subTrees = new List<SymbolicExpressionTreeNode>(original.SubTrees);
+        while (original.SubTrees.Count > 0) original.RemoveSubTree(0);
+        var clone = (SymbolicExpressionTreeNode)original.Clone();
+        foreach (var subTree in subTrees) {
+          clone.AddSubTree(GetSimplifiedTree(subTree));
+          original.AddSubTree(subTree);
+        }
+        return clone;
+      }
+    }
+
+    /// <summary>
+    /// x => x * -1
+    /// Doesn't create new trees and manipulates x
+    /// </summary>
+    /// <param name="x"></param>
+    /// <returns>-x</returns>
+    private SymbolicExpressionTreeNode Negate(SymbolicExpressionTreeNode x) {
+      if (IsConstant(x)) {
+        ((ConstantTreeNode)x).Value *= -1;
+      } else if (IsVariable(x)) {
+        var variableTree = (VariableTreeNode)x;
+        variableTree.Weight *= -1.0;
+      } else if (IsAddition(x)) {
+        // (x0 + x1 + .. + xn) * -1 => (-x0 + -x1 + .. + -xn)        
+        foreach (var subTree in x.SubTrees) {
+          Negate(subTree);
+        }
+      } else if (IsMultiplication(x) || IsDivision(x)) {
+        // x0 * x1 * .. * xn * -1 => x0 * x1 * .. * -xn
+        Negate(x.SubTrees.Last()); // last is maybe a constant, prefer to negate the constant
+      } else {
+        // any other function
+        return MakeMultiplication(x, MakeConstant(-1));
+      }
+      return x;
+    }
+
+    /// <summary>
+    /// x => 1/x
+    /// Doesn't create new trees and manipulates x
+    /// </summary>
+    /// <param name="x"></param>
+    /// <returns></returns>
+    private SymbolicExpressionTreeNode Invert(SymbolicExpressionTreeNode x) {
+      if (IsConstant(x)) {
+        ((ConstantTreeNode)x).Value = 1.0 / ((ConstantTreeNode)x).Value;
+      } else {
+        // any other function
+        return MakeDivision(MakeConstant(1), x);
+      }
+      return x;
+    }
+
+    private SymbolicExpressionTreeNode MakeDivision(SymbolicExpressionTreeNode a, SymbolicExpressionTreeNode b) {
+      if (IsConstant(a) && IsConstant(b)) {
+        return MakeConstant(((ConstantTreeNode)a).Value / ((ConstantTreeNode)b).Value);
+      } else if (IsVariable(a) && IsConstant(b)) {
+        var constB = ((ConstantTreeNode)b).Value;
+        ((VariableTreeNode)a).Weight /= constB;
+        return a;
+      } else {
+        var div = (new Division()).CreateTreeNode();
+        div.SubTrees.Add(a);
+        div.SubTrees.Add(b);
+        return div;
+      }
+    }
+
+    private SymbolicExpressionTreeNode MakeAddition(SymbolicExpressionTreeNode a, SymbolicExpressionTreeNode b) {
+      if (IsConstant(a) && IsConstant(b)) {
+        // merge constants
+        ((ConstantTreeNode)a).Value += ((ConstantTreeNode)b).Value;
+        return a;
+      } else if (IsConstant(a)) {
+        // c + x => x + c
+        // b is not constant => make sure constant is on the right
+        return MakeAddition(b, a);
+      } else if (IsConstant(b) && ((ConstantTreeNode)b).Value.IsAlmost(0.0)) {
+        // x + 0 => x
+        return a;
+      } else if (IsAddition(a) && IsAddition(b)) {
+        // merge additions
+        var add = (new Addition()).CreateTreeNode();
+        for (int i = 0; i < a.SubTrees.Count - 1; i++) add.AddSubTree(a.SubTrees[i]);
+        for (int i = 0; i < b.SubTrees.Count - 1; i++) add.AddSubTree(b.SubTrees[i]);
+        if (IsConstant(a.SubTrees.Last()) && IsConstant(b.SubTrees.Last())) {
+          add.AddSubTree(MakeAddition(a.SubTrees.Last(), b.SubTrees.Last()));
+        } else if (IsConstant(a.SubTrees.Last())) {
+          add.AddSubTree(b.SubTrees.Last());
+          add.AddSubTree(a.SubTrees.Last());
+        } else {
+          add.AddSubTree(a.SubTrees.Last());
+          add.AddSubTree(b.SubTrees.Last());
+        }
+        MergeVariables(add);
+        return add;
+      } else if (IsAddition(b)) {
+        return MakeAddition(b, a);
+      } else if (IsAddition(a) && IsConstant(b)) {
+        var add = (new Addition()).CreateTreeNode();
+        for (int i = 0; i < a.SubTrees.Count - 1; i++) add.AddSubTree(a.SubTrees[i]);
+        if (IsConstant(a.SubTrees.Last()))
+          add.AddSubTree(MakeAddition(a.SubTrees.Last(), b));
+        else {
+          add.AddSubTree(a.SubTrees.Last());
+          add.AddSubTree(b);
+        }
+        return add;
+      } else if (IsAddition(a)) {
+        var add = (new Addition()).CreateTreeNode();
+        add.AddSubTree(b);
+        foreach (var subTree in a.SubTrees) {
+          add.AddSubTree(subTree);
+        }
+        MergeVariables(add);
+        return add;
+      } else {
+        var add = (new Addition()).CreateTreeNode();
+        add.SubTrees.Add(a);
+        add.SubTrees.Add(b);
+        MergeVariables(add);
+        return add;
+      }
+    }
+
+    private void MergeVariables(SymbolicExpressionTreeNode add) {
+      var subtrees = new List<SymbolicExpressionTreeNode>(add.SubTrees);
+      while (add.SubTrees.Count > 0) add.RemoveSubTree(0);
+      var groupedVarNodes = from node in subtrees.OfType<VariableTreeNode>()
+                            group node by node.VariableName into g
+                            select g;
+      var unchangedSubTrees = subtrees.Where(t => !(t is VariableTreeNode));
+
+      foreach (var variableNodeGroup in groupedVarNodes) {
+        var weightSum = variableNodeGroup.Select(t => t.Weight).Sum();
+        var representative = variableNodeGroup.First();
+        representative.Weight = weightSum;
+        add.AddSubTree(representative);
+      }
+      foreach (var unchangedSubtree in unchangedSubTrees)
+        add.AddSubTree(unchangedSubtree);
+    }
+
+    private SymbolicExpressionTreeNode MakeMultiplication(SymbolicExpressionTreeNode a, SymbolicExpressionTreeNode b) {
+      if (IsConstant(a) && IsConstant(b)) {
+        ((ConstantTreeNode)a).Value *= ((ConstantTreeNode)b).Value;
+        return a;
+      } else if (IsConstant(a)) {
+        return MakeMultiplication(b, a);
+      } else if (IsConstant(b) && ((ConstantTreeNode)b).Value.IsAlmost(1.0)) {
+        return a;
+      } else if (IsConstant(b) && IsVariable(a)) {
+        ((VariableTreeNode)a).Weight *= ((ConstantTreeNode)b).Value;
+        return a;
+      } else if (IsConstant(b) && IsAddition(a)) {
+        return a.SubTrees.Select(x => MakeMultiplication(x, b)).Aggregate((c, d) => MakeAddition(c, d));
+      } else if (IsDivision(a)) {
+        Trace.Assert(a.SubTrees.Count == 2);
+        return MakeDivision(MakeMultiplication(a.SubTrees[0], b), a.SubTrees[1]);
+      } else if (IsDivision(b)) {
+        Trace.Assert(b.SubTrees.Count == 2);
+        return MakeDivision(MakeMultiplication(b.SubTrees[0], a), b.SubTrees[1]);
+      } else if (IsMultiplication(a) && IsMultiplication(b)) {
+        var mul = (new Multiplication()).CreateTreeNode();
+        for (int i = 0; i < a.SubTrees.Count - 1; i++) mul.AddSubTree(a.SubTrees[i]);
+        for (int i = 0; i < b.SubTrees.Count - 1; i++) mul.AddSubTree(b.SubTrees[i]);
+        mul.AddSubTree(MakeMultiplication(a.SubTrees.Last(), b.SubTrees.Last()));
+        return mul;
+      } else if (IsMultiplication(a)) {
+        var mul = (new Multiplication()).CreateTreeNode();
+        for (int i = 0; i < a.SubTrees.Count - 1; i++) mul.AddSubTree(a.SubTrees[i]);
+        mul.AddSubTree(MakeMultiplication(a.SubTrees.Last(), b));
+        return mul;
+      } else if (IsMultiplication(b)) {
+        var mul = (new Multiplication()).CreateTreeNode();
+        for (int i = 0; i < b.SubTrees.Count - 1; i++) mul.AddSubTree(b.SubTrees[i]);
+        mul.AddSubTree(MakeMultiplication(b.SubTrees.Last(), a));
+        return mul;
+      } else {
+        var mul = (new Multiplication()).CreateTreeNode();
+        mul.SubTrees.Add(a);
+        mul.SubTrees.Add(b);
+        return mul;
+      }
+    }
+
+    #region is symbol ?
+    private bool IsDivision(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Division;
+    }
+
+    private bool IsMultiplication(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Multiplication;
+    }
+
+    private bool IsSubtraction(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Subtraction;
+    }
+
+    private bool IsAddition(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Addition;
+    }
+
+    private bool IsVariable(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Variable;
+    }
+
+    private bool IsConstant(SymbolicExpressionTreeNode original) {
+      return original.Symbol is Constant;
+    }
+    #endregion
+
+    private SymbolicExpressionTreeNode MakeConstant(double value) {
+      ConstantTreeNode constantTreeNode = (ConstantTreeNode)(new Constant().CreateTreeNode());
+      constantTreeNode.Value = value;
+      return (SymbolicExpressionTreeNode)constantTreeNode;
+    }
+
+    private SymbolicExpressionTreeNode MakeVariable(double weight, string name) {
+      var tree = (VariableTreeNode)(new Variable().CreateTreeNode());
+      tree.Weight = weight;
+      tree.VariableName = name;
+      return tree;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs	(revision 3442)
@@ -34,9 +34,4 @@
       get { return (Constant)base.Symbol; }
     }
-    public override bool HasLocalParameters {
-      get {
-        return true;
-      }
-    }
 
     private double constantValue;
@@ -54,4 +49,9 @@
     public ConstantTreeNode(Constant constantSymbol) : base(constantSymbol) { }
 
+    public override bool HasLocalParameters {
+      get {
+        return true;
+      }
+    }
     public override void ResetLocalParameters(IRandom random) {
       base.ResetLocalParameters(random);
@@ -63,4 +63,8 @@
       return new ConstantTreeNode(this);
     }
+
+    public override string ToString() {
+      return constantValue.ToString("E5");
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs	(revision 3442)
@@ -52,5 +52,5 @@
     private List<string> variableNames;
     [Storable]
-    public ICollection<string> VariableNames {
+    public IEnumerable<string> VariableNames {
       get { return variableNames; }
       set {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs	(revision 3441)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs	(revision 3442)
@@ -56,4 +56,10 @@
     public VariableTreeNode(Variable variableSymbol) : base(variableSymbol) { }
 
+    public override bool HasLocalParameters {
+      get {
+        return true;
+      }
+    }
+
     public override void ResetLocalParameters(IRandom random) {
       base.ResetLocalParameters(random);
@@ -68,4 +74,8 @@
       return new VariableTreeNode(this);
     }
+
+    public override string ToString() {
+      return weight.ToString("E5") + " * " + variableName;
+    }
   }
 }
