Index: /branches/DataAnalysis/HeuristicLab 3.3.sln
===================================================================
--- /branches/DataAnalysis/HeuristicLab 3.3.sln	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab 3.3.sln	(revision 5275)
@@ -21,4 +21,18 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3", "HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views\3.3\HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj", "{C60DF094-ABC1-4313-AD82-E2EAD3FC8DF7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Main", "Main\Main.csproj", "{8892BD96-1AC6-489E-8848-6BDFE051F09C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{7252890C-F207-4AD6-B3C9-764DF93F73CC} = {7252890C-F207-4AD6-B3C9-764DF93F73CC}
+		{BDF86B1D-630E-4CE2-8A49-8C90B1BDE4C9} = {BDF86B1D-630E-4CE2-8A49-8C90B1BDE4C9}
+		{799B0B38-E384-4A17-A73C-F211EB854592} = {799B0B38-E384-4A17-A73C-F211EB854592}
+		{6024D74F-E29C-4E6B-843E-8851831B8E14} = {6024D74F-E29C-4E6B-843E-8851831B8E14}
+		{70DFD984-B1D9-46FE-8EB7-4DE92D71A9FC} = {70DFD984-B1D9-46FE-8EB7-4DE92D71A9FC}
+		{C60DF094-ABC1-4313-AD82-E2EAD3FC8DF7} = {C60DF094-ABC1-4313-AD82-E2EAD3FC8DF7}
+		{9B6EA19A-F894-4E00-B5A3-970514284772} = {9B6EA19A-F894-4E00-B5A3-970514284772}
+		{2B88DCD0-EE28-4DCA-90A8-2F4ECACFC515} = {2B88DCD0-EE28-4DCA-90A8-2F4ECACFC515}
+		{B3310CE1-0C05-410F-BA77-8DAD6CE3F803} = {B3310CE1-0C05-410F-BA77-8DAD6CE3F803}
+		{5A4679EF-A8F3-4647-B722-441A36B3BA6B} = {5A4679EF-A8F3-4647-B722-441A36B3BA6B}
+	EndProjectSection
 EndProject
 Global
@@ -234,4 +248,21 @@
 		{C60DF094-ABC1-4313-AD82-E2EAD3FC8DF7}.Silverlight2|x86.ActiveCfg = Release|x86
 		{C60DF094-ABC1-4313-AD82-E2EAD3FC8DF7}.Silverlight2|x86.Build.0 = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Debug|x64.ActiveCfg = Debug|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Debug|x86.ActiveCfg = Debug|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Debug|x86.Build.0 = Debug|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Release|Any CPU.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Release|x64.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Release|x86.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Release|x86.Build.0 = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Services|Any CPU.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Services|x64.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Services|x86.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Services|x86.Build.0 = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Silverlight2|Any CPU.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Silverlight2|x64.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Silverlight2|x86.ActiveCfg = Release|x86
+		{8892BD96-1AC6-489E-8848-6BDFE051F09C}.Silverlight2|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/Evaluators/LinearRegressionFeatureSelectionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/Evaluators/LinearRegressionFeatureSelectionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/Evaluators/LinearRegressionFeatureSelectionEvaluator.cs	(revision 5275)
@@ -33,4 +33,5 @@
 using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 namespace HeuristicLab.Problems.DataAnalysis.FeatureSelection {
   public class LinearRegressionFeatureSelectionEvaluator : SingleSuccessorOperator, IFeatureSelectionEvaluator {
@@ -56,5 +57,9 @@
     }
     #endregion
-
+    [StorableConstructor]
+    protected LinearRegressionFeatureSelectionEvaluator(bool deserializing) : base(deserializing) { }
+    protected LinearRegressionFeatureSelectionEvaluator(LinearRegressionFeatureSelectionEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public LinearRegressionFeatureSelectionEvaluator()
       : base() {
@@ -63,5 +68,7 @@
       Parameters.Add(new LookupParameter<DoubleArray>("Qualities", "The qualities of the linear regression solution (MSE, size)."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinearRegressionFeatureSelectionEvaluator(this, cloner);
+    }
     public override IOperation Apply() {
       var dataset = DataAnalysisProblemData.Dataset;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/FeatureSelectionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/FeatureSelectionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/FeatureSelectionProblem.cs	(revision 5275)
@@ -91,4 +91,10 @@
     [StorableConstructor]
     protected FeatureSelectionProblem(bool deserializing) : base(deserializing) { }
+    protected FeatureSelectionProblem(FeatureSelectionProblem original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
     public FeatureSelectionProblem()
       : base() {
@@ -111,5 +117,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       // BackwardsCompatibility3.3
       #region Backwards compatible code (remove with 3.4)
@@ -121,9 +127,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      FeatureSelectionProblem clone = (FeatureSelectionProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new FeatureSelectionProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/HeuristicLab.Problems.DataAnalysis.FeatureSelection-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/HeuristicLab.Problems.DataAnalysis.FeatureSelection-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.FeatureSelection/3.3/HeuristicLab.Problems.DataAnalysis.FeatureSelection-3.3.csproj	(revision 5275)
@@ -92,4 +92,49 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression-3.3.csproj	(revision 5275)
@@ -92,4 +92,49 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -33,4 +33,5 @@
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Interfaces;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Analyzers {
@@ -133,5 +134,9 @@
     }
     #endregion
-
+    [StorableConstructor]
+    protected ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer(ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer()
       : base() {
@@ -151,5 +156,8 @@
       Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
       Parameters.Add(new LookupParameter<DoubleValue>(BestKnownQualityParameterName, "The best known (validation) quality achieved on the data set."));
-
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValidationBestScaledSymbolicVectorRegressionSolutionAnalyzer(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicVectorRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicVectorRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicVectorRegressionEvaluator.cs	(revision 5275)
@@ -32,4 +32,5 @@
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Interfaces;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -42,5 +43,9 @@
     }
     #endregion
-    public MultiObjectiveSymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    [StorableConstructor]
+    protected MultiObjectiveSymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveSymbolicVectorRegressionEvaluator(MultiObjectiveSymbolicVectorRegressionEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public MultiObjectiveSymbolicVectorRegressionEvaluator()
       : base() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/PartialDerivativeEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/PartialDerivativeEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/PartialDerivativeEvaluator.cs	(revision 5275)
@@ -39,9 +39,15 @@
   public class PartialDerivativeEvaluator : SingleObjectiveSymbolicVectorRegressionEvaluator {
 
-    public PartialDerivativeEvaluator(bool deserializing) : base(deserializing) { }
+    [StorableConstructor]
+    protected PartialDerivativeEvaluator(bool deserializing) : base(deserializing) { }
+    protected PartialDerivativeEvaluator(PartialDerivativeEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public PartialDerivativeEvaluator()
       : base() {
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PartialDerivativeEvaluator(this, cloner);
+    }
     public override double Evaluate(SymbolicExpressionTree tree, ISymbolicExpressionTreeInterpreter interpreter, MultiVariateDataAnalysisProblemData problemData, IEnumerable<string> targetVariables, IEnumerable<int> rows, DoubleArray lowerEstimationBound, DoubleArray upperEstimationBound) {
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicVectorRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicVectorRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicVectorRegressionEvaluator.cs	(revision 5275)
@@ -32,4 +32,5 @@
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Interfaces;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -42,10 +43,13 @@
     }
     #endregion
-    public SingleObjectiveSymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    [StorableConstructor]
+    protected SingleObjectiveSymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveSymbolicVectorRegressionEvaluator(SingleObjectiveSymbolicVectorRegressionEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SingleObjectiveSymbolicVectorRegressionEvaluator()
       : base() {
       Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The quality of the symbolic vector regression solution."));
     }
-
 
     public override IOperation Apply() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionNormalizedMeanSquaredErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionNormalizedMeanSquaredErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionNormalizedMeanSquaredErrorEvaluator.cs	(revision 5275)
@@ -29,4 +29,5 @@
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
@@ -34,8 +35,15 @@
   [StorableClass]
   public class SymbolicRegressionNormalizedMeanSquaredErrorEvaluator : SingleObjectiveSymbolicRegressionEvaluator {
+    [StorableConstructor]
+    protected SymbolicRegressionNormalizedMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionNormalizedMeanSquaredErrorEvaluator(SymbolicRegressionNormalizedMeanSquaredErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicRegressionNormalizedMeanSquaredErrorEvaluator()
       : base() {
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionNormalizedMeanSquaredErrorEvaluator(this, cloner);
+    }
     public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
       double nmse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionEvaluator.cs	(revision 5275)
@@ -31,4 +31,5 @@
 using HeuristicLab.Problems.DataAnalysis.Regression;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -105,5 +106,9 @@
     #endregion
 
-    public SymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    [StorableConstructor]
+    protected SymbolicVectorRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionEvaluator(SymbolicVectorRegressionEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionEvaluator()
       : base() {
@@ -118,5 +123,4 @@
       Parameters.Add(new ValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index.", new PercentValue(1)));
     }
-
     public static IEnumerable<int> GenerateRowsToEvaluate(int seed, double relativeAmount, int start, int end) {
       if (end < start) throw new ArgumentException("Start value is larger than end value.");
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionNormalizedMseEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionNormalizedMseEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionNormalizedMseEvaluator.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -37,7 +38,14 @@
 
 
-    public SymbolicVectorRegressionNormalizedMseEvaluator(bool deserializing) : base(deserializing) { }
+    [StorableConstructor]
+    protected SymbolicVectorRegressionNormalizedMseEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionNormalizedMseEvaluator(SymbolicVectorRegressionNormalizedMseEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionNormalizedMseEvaluator()
       : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicVectorRegressionNormalizedMseEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledMseEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledMseEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledMseEvaluator.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -48,4 +49,9 @@
     #endregion
 
+    [StorableConstructor]
+    protected SymbolicVectorRegressionScaledMseEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionScaledMseEvaluator(SymbolicVectorRegressionScaledMseEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionScaledMseEvaluator()
       : base() {
@@ -53,5 +59,7 @@
       Parameters.Add(new LookupParameter<DoubleArray>(BetaParameterName, "The beta parameter for linear scaling."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicVectorRegressionScaledMseEvaluator(this, cloner);
+    }
     public override double[] Evaluate(SymbolicExpressionTree tree, ISymbolicExpressionTreeInterpreter interpreter, MultiVariateDataAnalysisProblemData problemData, IEnumerable<string> targetVariables, IEnumerable<int> rows, DoubleArray lowerEstimationBound, DoubleArray upperEstimationBound) {
       List<string> targetVariablesList = targetVariables.ToList();
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledNormalizedMseEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledNormalizedMseEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/Evaluators/SymbolicVectorRegressionScaledNormalizedMseEvaluator.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic.Evaluators {
@@ -48,4 +49,9 @@
     #endregion
 
+    [StorableConstructor]
+    protected SymbolicVectorRegressionScaledNormalizedMseEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionScaledNormalizedMseEvaluator(SymbolicVectorRegressionScaledNormalizedMseEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionScaledNormalizedMseEvaluator()
       : base() {
@@ -53,5 +59,7 @@
       Parameters.Add(new LookupParameter<DoubleArray>(BetaParameterName, "The beta parameter for linear scaling."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicVectorRegressionScaledNormalizedMseEvaluator(this, cloner);
+    }
     public override double Evaluate(SymbolicExpressionTree tree, ISymbolicExpressionTreeInterpreter interpreter, MultiVariateDataAnalysisProblemData problemData, IEnumerable<string> targetVariables, IEnumerable<int> rows, DoubleArray lowerEstimationBound, DoubleArray upperEstimationBound) {
       List<string> targetVariablesList = targetVariables.ToList();
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/MultiObjectiveSymbolicVectorRegressionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/MultiObjectiveSymbolicVectorRegressionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/MultiObjectiveSymbolicVectorRegressionProblem.cs	(revision 5275)
@@ -68,4 +68,8 @@
     [StorableConstructor]
     protected MultiObjectiveSymbolicVectorRegressionProblem(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveSymbolicVectorRegressionProblem(MultiObjectiveSymbolicVectorRegressionProblem original, Cloner cloner)
+      : base(original, cloner) {
+        Initialize();
+    }
     public MultiObjectiveSymbolicVectorRegressionProblem()
       : base() {
@@ -84,7 +88,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MultiObjectiveSymbolicVectorRegressionProblem clone = (MultiObjectiveSymbolicVectorRegressionProblem)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
+      return new MultiObjectiveSymbolicVectorRegressionProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SingleObjectiveSymbolicVectorRegressionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SingleObjectiveSymbolicVectorRegressionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SingleObjectiveSymbolicVectorRegressionProblem.cs	(revision 5275)
@@ -75,4 +75,10 @@
     #endregion
 
+    [StorableConstructor]
+    private SingleObjectiveSymbolicVectorRegressionProblem(bool deserializing) : base() { }
+    private SingleObjectiveSymbolicVectorRegressionProblem(SingleObjectiveSymbolicVectorRegressionProblem original, Cloner cloner)
+      : base(original, cloner) {
+        Initialize();
+    }
     public SingleObjectiveSymbolicVectorRegressionProblem()
       : base() {
@@ -87,18 +93,13 @@
     }
 
-    [StorableConstructor]
-    private SingleObjectiveSymbolicVectorRegressionProblem(bool deserializing) : base() { }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       Initialize();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SingleObjectiveSymbolicVectorRegressionProblem clone = (SingleObjectiveSymbolicVectorRegressionProblem)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
+      return new SingleObjectiveSymbolicVectorRegressionProblem(this, cloner);
     }
-
     private void RegisterParameterValueEvents() {
       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionGrammar.cs	(revision 5275)
@@ -33,12 +33,15 @@
   public class SymbolicVectorRegressionGrammar : MultiVariateExpressionGrammar {
     public SymbolicVectorRegressionGrammar() : this(1) { }
-
+    [StorableConstructor]
+    protected SymbolicVectorRegressionGrammar(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionGrammar(SymbolicVectorRegressionGrammar original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionGrammar(int dimension)
       : base(dimension) {
       Initialize();
     }
-
-    protected SymbolicVectorRegressionGrammar(SymbolicVectorRegressionGrammar original) : base(original.Dimension) {
-    // fill ???
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicVectorRegressionGrammar(this, cloner);
     }
 
@@ -115,10 +118,4 @@
       }
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      var clone = new SymbolicVectorRegressionGrammar(this);
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionProblem.cs	(revision 5275)
@@ -158,4 +158,10 @@
     [StorableConstructor]
     protected SymbolicVectorRegressionProblem(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionProblem(SymbolicVectorRegressionProblem original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
     public SymbolicVectorRegressionProblem()
       : base() {
@@ -184,5 +190,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       // BackwardsCompatibility3.3
       #region Backwards compatible code (remove with 3.4)
@@ -194,9 +200,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicVectorRegressionProblem clone = (SymbolicVectorRegressionProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new SymbolicVectorRegressionProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionSolutionLinearScaler.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionSolutionLinearScaler.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression/3.3/Symbolic/SymbolicVectorRegressionSolutionLinearScaler.cs	(revision 5275)
@@ -29,4 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression.Symbolic {
@@ -54,5 +55,9 @@
       get { return (ILookupParameter<DoubleArray>)Parameters[BetaParameterName]; }
     }
-
+    [StorableConstructor]
+    protected SymbolicVectorRegressionSolutionLinearScaler(bool deserializing) : base(deserializing) { }
+    protected SymbolicVectorRegressionSolutionLinearScaler(SymbolicVectorRegressionSolutionLinearScaler original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicVectorRegressionSolutionLinearScaler()
       : base() {
@@ -62,5 +67,7 @@
       Parameters.Add(new LookupParameter<DoubleArray>(BetaParameterName, "Beta parameter for linear transformation."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicVectorRegressionSolutionLinearScaler(this, cloner);
+    }
     public override IOperation Apply() {
       SymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj	(revision 5275)
@@ -92,5 +92,49 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -110,42 +154,62 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="PrognosisView.cs" />
+    <Compile Include="PrognosisView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="PrognosisView.Designer.cs">
       <DependentUpon>PrognosisView.cs</DependentUpon>
     </Compile>
     <Compile Include="HeuristicLabProblemsDataAnalysisMultiVariateTimeSeriesPrognosisViewsPlugin.cs" />
-    <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs" />
+    <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.Designer.cs">
       <DependentUpon>InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs</DependentUpon>
     </Compile>
-    <Compile Include="TimeSeriesPrognosisLineChartView.cs" />
+    <Compile Include="TimeSeriesPrognosisLineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="TimeSeriesPrognosisLineChartView.Designer.cs">
       <DependentUpon>TimeSeriesPrognosisLineChartView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ResultsView.cs" />
+    <Compile Include="ResultsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="ResultsView.Designer.cs">
       <DependentUpon>ResultsView.cs</DependentUpon>
     </Compile>
-    <Compile Include="SimplifiedSymbolicTimeSeriesPrognosisModelView.cs" />
+    <Compile Include="SimplifiedSymbolicTimeSeriesPrognosisModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="SimplifiedSymbolicTimeSeriesPrognosisModelView.designer.cs">
       <DependentUpon>SimplifiedSymbolicTimeSeriesPrognosisModelView.cs</DependentUpon>
     </Compile>
-    <Compile Include="SymbolicTimeSeriesPrognosisSolutionView.cs" />
+    <Compile Include="SymbolicTimeSeriesPrognosisSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="SymbolicTimeSeriesPrognosisSolutionView.Designer.cs">
       <DependentUpon>SymbolicTimeSeriesPrognosisSolutionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="SymbolicTimeSeriesPrognosisModelView.cs" />
+    <Compile Include="SymbolicTimeSeriesPrognosisModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="SymbolicTimeSeriesPrognosisModelView.designer.cs">
       <DependentUpon>SymbolicTimeSeriesPrognosisModelView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbols\DerivativeVariableView.cs" />
+    <Compile Include="Symbols\DerivativeVariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbols\DerivativeVariableView.Designer.cs">
       <DependentUpon>DerivativeVariableView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbols\IntegratedVariableView.cs" />
+    <Compile Include="Symbols\IntegratedVariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbols\IntegratedVariableView.Designer.cs">
       <DependentUpon>IntegratedVariableView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbols\MovingAverageView.cs" />
+    <Compile Include="Symbols\MovingAverageView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbols\MovingAverageView.Designer.cs">
       <DependentUpon>MovingAverageView.cs</DependentUpon>
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs	(revision 5275)
@@ -132,5 +132,5 @@
         // training
         foreach (var evaluator in trainingEvaluators[targetVariable]) {
-          matrix[rowIndex++, columnIndex] = evaluator.Value;
+          matrix[rowIndex++, columnIndex] = Math.Round(evaluator.Value, 3);
         }
         columnIndex++;
@@ -138,5 +138,5 @@
         rowIndex = 0;
         foreach (var evaluator in testEvaluators[targetVariable]) {
-          matrix[rowIndex++, columnIndex] = evaluator.Value;
+          matrix[rowIndex++, columnIndex] = Math.Round(evaluator.Value);
         }
         columnIndex++;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis-3.3.csproj	(revision 5275)
@@ -92,4 +92,43 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -109,4 +148,5 @@
     <Compile Include="HeuristicLabProblemsDataAnalysisMultiVariateTimeSeriesPrognosisPlugin.cs" />
     <Compile Include="Symbolic\Analyzer\ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer.cs" />
+    <Compile Include="Symbolic\Evaluators\SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator.cs" />
     <Compile Include="Symbolic\Evaluators\SymbolicTimeSeriesPrognosisEvaluator.cs" />
     <Compile Include="Symbolic\Evaluators\SymbolicTimeSeriesPrognosisMahalanobisEvaluator.cs">
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Analyzer/ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer.cs	(revision 5275)
@@ -222,4 +222,9 @@
     #endregion
 
+    [StorableConstructor]
+    protected ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer(ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer()
       : base() {
@@ -245,9 +250,9 @@
     }
 
-    [StorableConstructor]
-    private ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer(bool deserializing) : base(deserializing) { }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValidationBestScaledSymbolicTimeSeriesPrognosisSolutionAnalyzer(this, cloner);
+    }
     [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       //if (!Parameters.ContainsKey("Evaluator")) {
       //  Parameters.Add(new LookupParameter<ISingleObjectiveSymbolicTimeSeriesPrognosisEvaluator>("Evaluator", ""));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisEvaluator.cs	(revision 5275)
@@ -93,5 +93,5 @@
     }
     #endregion
-    #region
+    #region properties
     public IRandom Random {
       get { return RandomParameter.ActualValue; }
@@ -128,5 +128,9 @@
     }
     #endregion
-
+    [StorableConstructor]
+    protected SymbolicTimeSeriesPrognosisEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisEvaluator(SymbolicTimeSeriesPrognosisEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicTimeSeriesPrognosisEvaluator()
       : base() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisMahalanobisEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisMahalanobisEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisMahalanobisEvaluator.cs	(revision 5275)
@@ -45,8 +45,15 @@
   public class SymbolicTimeSeriesPrognosisMahalanobisEvaluator : SymbolicTimeSeriesPrognosisEvaluator {
 
+    [StorableConstructor]
+    protected SymbolicTimeSeriesPrognosisMahalanobisEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisMahalanobisEvaluator(SymbolicTimeSeriesPrognosisMahalanobisEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicTimeSeriesPrognosisMahalanobisEvaluator()
       : base() {
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisMahalanobisEvaluator(this, cloner);
+    }
     public override double Evaluate(SymbolicExpressionTree tree, MultiVariateDataAnalysisProblemData problemData, ISymbolicTimeSeriesExpressionInterpreter interpreter, IEnumerable<int> rows, int predictionHorizon, DoubleArray lowerEstimationLimit, DoubleArray upperEstimationLimit) {
       return Calculate(tree, problemData, interpreter, rows, predictionHorizon, lowerEstimationLimit, upperEstimationLimit);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator.cs	(revision 5275)
@@ -0,0 +1,184 @@
+#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.SupportVectorMachine;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Optimization;
+using HeuristicLab.Operators;
+using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using System.Collections.Generic;
+using HeuristicLab.Problems.DataAnalysis.Regression;
+using HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Symbolic.Interfaces;
+using HeuristicLab.Problems.DataAnalysis.MultiVariate.Evaluators;
+
+namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Symbolic.Evaluators {
+  [Item("SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator", "")]
+  [StorableClass]
+  public class SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator : SymbolicTimeSeriesPrognosisEvaluator {
+    public ValueParameter<DoubleValue> DimensionParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["Dimension"]; }
+    }
+    public DoubleValue Dimension {
+      get { return DimensionParameter.Value; }
+      set { DimensionParameter.Value = value; }
+    }
+    [StorableConstructor]
+    protected SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator(SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator()
+      : base() {
+        Parameters.Add(new ValueParameter<DoubleValue>("Dimension", "The dimension parameter for the fractional distance metric (Sum(x_i-y_i)^(1/d))^d). d=0.5 is equivalent to Euclidian distance.", new DoubleValue(0.5)));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisScaledNormalizedFractionalDistanceEvaluator(this, cloner);
+    }
+    public override double Evaluate(SymbolicExpressionTree tree, MultiVariateDataAnalysisProblemData problemData, ISymbolicTimeSeriesExpressionInterpreter interpreter, IEnumerable<int> rows, int predictionHorizon, DoubleArray lowerEstimationLimit, DoubleArray upperEstimationLimit) {
+      return Calculate(tree, problemData, interpreter, rows, predictionHorizon, Dimension.Value, lowerEstimationLimit, upperEstimationLimit);
+    }
+
+    public static double Calculate(SymbolicExpressionTree tree, MultiVariateDataAnalysisProblemData problemData, ISymbolicTimeSeriesExpressionInterpreter interpreter, IEnumerable<int> rows, int predictionHorizon, double fractionalDimension, DoubleArray lowerEstimationLimit, DoubleArray upperEstimationLimit) {
+      double[] alpha, beta;
+      double quality;
+
+      Dataset dataset = problemData.Dataset;
+      // calculate scaling parameters based on one-step-predictions
+      IEnumerable<string> selectedTargetVariables = (from item in problemData.TargetVariables
+                                                     where problemData.TargetVariables.ItemChecked(item)
+                                                     select item.Value).ToArray();
+      int dimension = selectedTargetVariables.Count();
+
+      IEnumerable<int> selectedTargetVariableIndexes = (from targetVariable in selectedTargetVariables
+                                                        select dataset.GetVariableIndex(targetVariable)).ToArray();
+      IEnumerable<IEnumerable<double>> oneStepPredictions =
+        interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, selectedTargetVariables, rows, 1).Cast<IEnumerable<double>>();
+      IEnumerable<IEnumerable<double>> originalValues = from row in rows
+                                                        select (from targetVariableIndex in selectedTargetVariableIndexes
+                                                                select dataset[row, targetVariableIndex]);
+      alpha = new double[dimension];
+      beta = new double[dimension];
+
+      CalculateScalingParameters(originalValues, oneStepPredictions, ref beta, ref alpha);
+
+      // calculate the quality for the full horizon
+      quality = CalculateWithScaling(tree, problemData, interpreter,
+        rows, predictionHorizon, fractionalDimension,
+        lowerEstimationLimit, upperEstimationLimit,
+        beta, alpha);
+      return quality;
+    }
+
+    public static double CalculateWithScaling(SymbolicExpressionTree tree, MultiVariateDataAnalysisProblemData problemData,
+      ISymbolicTimeSeriesExpressionInterpreter interpreter,
+      IEnumerable<int> rows, int predictionHorizon, double fractionalDimension,
+      DoubleArray lowerEstimationLimit, DoubleArray upperEstimationLimit,
+      double[] beta, double[] alpha) {
+      Dataset dataset = problemData.Dataset;
+      IEnumerable<string> selectedTargetVariables = (from targetVariable in problemData.TargetVariables
+                                                     where problemData.TargetVariables.ItemChecked(targetVariable)
+                                                     select targetVariable.Value).ToArray();
+      IEnumerable<int> selectedTargetVariableIndexes = (from targetVariable in selectedTargetVariables
+                                                        select dataset.GetVariableIndex(targetVariable)).ToArray();
+
+      IEnumerable<double[]> estimatedValues =
+        interpreter.GetScaledSymbolicExpressionTreeValues(tree, dataset, selectedTargetVariables,
+        rows, predictionHorizon, beta, alpha);
+
+      IEnumerable<IEnumerable<double>> originalValues = from row in rows
+                                                        from step in Enumerable.Range(0, predictionHorizon)
+                                                        select (from targetVariableIndex in selectedTargetVariableIndexes
+                                                                select dataset[row + step, targetVariableIndex]);
+
+      var evaluator = new OnlineMeanFractionalDistanceEvaluator(fractionalDimension);
+
+      var estimatedValuesEnumerator = estimatedValues.GetEnumerator();
+      var originalValuesEnumerator = originalValues.GetEnumerator();
+      while (originalValuesEnumerator.MoveNext() & estimatedValuesEnumerator.MoveNext()) {
+        IEnumerable<double> original = originalValuesEnumerator.Current;
+        double[] estimated = estimatedValuesEnumerator.Current;
+        for (int i = 0; i < estimated.Length; i++) {
+          if (double.IsNaN(estimated[i])) estimated[i] = upperEstimationLimit[i];
+          else estimated[i] = Math.Min(upperEstimationLimit[i], Math.Max(lowerEstimationLimit[i], estimated[i]));
+        }
+        evaluator.Add(original, estimated);
+      }
+
+      double quality = evaluator.Value;
+      return quality;
+    }
+
+    public static void CalculateScalingParameters(IEnumerable<IEnumerable<double>> originalValues, IEnumerable<IEnumerable<double>> estimatedValues, ref double[] beta, ref double[] alpha) {
+      List<OnlineLinearScalingCalculator> linearScalingCalculators = new List<OnlineLinearScalingCalculator>();
+      // initialize lists
+      int dimension = originalValues.First().Count();
+      for (int i = 0; i < dimension; i++) {
+        linearScalingCalculators.Add(new OnlineLinearScalingCalculator());
+      }
+
+      var estimatedEnumerator = estimatedValues.GetEnumerator();
+      var originalEnumerator = originalValues.GetEnumerator();
+      // foreach row vector in both series
+      while (estimatedEnumerator.MoveNext() & originalEnumerator.MoveNext()) {
+        IEnumerable<double> original = originalEnumerator.Current;
+        IEnumerable<double> estimated = estimatedEnumerator.Current;
+        var originalComponentValuesEnumerator = original.GetEnumerator();
+        var estimatedComponentValuesEnumerator = estimated.GetEnumerator();
+
+        int component = 0;
+        // for each component in both row vectors
+        while (originalComponentValuesEnumerator.MoveNext() & estimatedComponentValuesEnumerator.MoveNext() && component < dimension) {
+          if (IsValidValue(originalComponentValuesEnumerator.Current) && IsValidValue(estimatedComponentValuesEnumerator.Current)) {
+            linearScalingCalculators[component].Add(originalComponentValuesEnumerator.Current, estimatedComponentValuesEnumerator.Current);
+          }
+          component++;
+        }
+        // check if both row vectors are finished
+        if (originalComponentValuesEnumerator.MoveNext() | estimatedComponentValuesEnumerator.MoveNext() || component < dimension) {
+          throw new ArgumentException("Number of elements in original and estimated row vectors does not match.");
+        }
+      }
+
+      // check if both series are finished
+      if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())
+        throw new InvalidOperationException("Number of elements in estimated and original series doesn't match.");
+
+      // get alpha and beta for each component
+      for (int component = 0; component < dimension; component++) {
+        alpha[component] = linearScalingCalculators[component].Alpha;
+        beta[component] = linearScalingCalculators[component].Beta;
+      }
+    }
+
+    private static bool IsValidValue(double d) {
+      return !double.IsInfinity(d) && !double.IsNaN(d) && d > -1.0E07 && d < 1.0E07;  // don't consider very large or very small values for scaling
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Evaluators/SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator.cs	(revision 5275)
@@ -44,8 +44,15 @@
   public class SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator : SymbolicTimeSeriesPrognosisEvaluator {
 
+    [StorableConstructor]
+    protected SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator(SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator()
       : base() {
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisScaledNormalizedMseEvaluator(this, cloner);
+    }
     public override double Evaluate(SymbolicExpressionTree tree, MultiVariateDataAnalysisProblemData problemData, ISymbolicTimeSeriesExpressionInterpreter interpreter, IEnumerable<int> rows, int predictionHorizon, DoubleArray lowerEstimationLimit, DoubleArray upperEstimationLimit) {
       return Calculate(tree, problemData, interpreter, rows, predictionHorizon, lowerEstimationLimit, upperEstimationLimit);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SingleObjectiveSymbolicTimeSeriesPrognosisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SingleObjectiveSymbolicTimeSeriesPrognosisProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SingleObjectiveSymbolicTimeSeriesPrognosisProblem.cs	(revision 5275)
@@ -87,4 +87,8 @@
     [StorableConstructor]
     protected SingleObjectiveSymbolicTimeSeriesPrognosisProblem(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveSymbolicTimeSeriesPrognosisProblem(SingleObjectiveSymbolicTimeSeriesPrognosisProblem original, Cloner cloner)
+      : base(original, cloner) {
+        AttachEventHandlers();
+    }
     public SingleObjectiveSymbolicTimeSeriesPrognosisProblem()
       : base() {
@@ -102,12 +106,10 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       AttachEventHandlers();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SingleObjectiveSymbolicTimeSeriesPrognosisProblem clone = (SingleObjectiveSymbolicTimeSeriesPrognosisProblem)base.Clone(cloner);
-      clone.AttachEventHandlers();
-      return clone;
+      return new SingleObjectiveSymbolicTimeSeriesPrognosisProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs	(revision 5275)
@@ -116,7 +116,14 @@
       get { return false; }
     }
-
+    [StorableConstructor]
+    protected SymbolicTimeSeriesExpressionInterpreter(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesExpressionInterpreter(SymbolicTimeSeriesExpressionInterpreter original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicTimeSeriesExpressionInterpreter()
       : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesExpressionInterpreter(this, cloner);
     }
     #region ITimeSeriesExpressionInterpreter Members
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisGrammar.cs	(revision 5275)
@@ -38,9 +38,18 @@
     // for persistence
     private SymbolicTimeSeriesPrognosisGrammar() : this(1) { }
-
+    [StorableConstructor]
+    protected SymbolicTimeSeriesPrognosisGrammar(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisGrammar(SymbolicTimeSeriesPrognosisGrammar original, Cloner cloner)
+      : base(original, cloner) {
+        dimension = original.dimension;
+    }
     public SymbolicTimeSeriesPrognosisGrammar(int dimension)
       : base() {
       this.dimension = dimension;
       Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisGrammar(this, cloner);
     }
 
@@ -129,11 +138,5 @@
           }
       }
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicTimeSeriesPrognosisGrammar clone = (SymbolicTimeSeriesPrognosisGrammar)base.Clone(cloner);
-      clone.dimension = this.dimension;
-      return clone;
-    }
+    }   
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisModel.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisModel.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisModel.cs	(revision 5275)
@@ -47,11 +47,18 @@
     [StorableConstructor]
     protected SymbolicTimeSeriesPrognosisModel(bool deserializing) : base(deserializing) { }
-
+    protected SymbolicTimeSeriesPrognosisModel(SymbolicTimeSeriesPrognosisModel original, Cloner cloner)
+      : base(original, cloner) {
+        tree = cloner.Clone(original.tree);
+        interpreter = cloner.Clone(original.interpreter);
+    }
     public SymbolicTimeSeriesPrognosisModel() { }
-
     public SymbolicTimeSeriesPrognosisModel(ISymbolicTimeSeriesExpressionInterpreter interpreter, SymbolicExpressionTree tree) {
       this.tree = tree;
       this.interpreter = interpreter;
 
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisModel(this, cloner);
     }
 
@@ -70,10 +77,4 @@
     #endregion
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicTimeSeriesPrognosisModel clone = (SymbolicTimeSeriesPrognosisModel)base.Clone(cloner);
-      clone.tree = (SymbolicExpressionTree)cloner.Clone(tree);
-      clone.interpreter = (ISymbolicTimeSeriesExpressionInterpreter)cloner.Clone(interpreter);
-      return clone;
-    }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisProblem.cs	(revision 5275)
@@ -161,4 +161,11 @@
     [StorableConstructor]
     protected SymbolicTimeSeriesPrognosisProblem(bool deserializing) : base(deserializing) { }
+    protected SymbolicTimeSeriesPrognosisProblem(SymbolicTimeSeriesPrognosisProblem original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      grammar = (SymbolicTimeSeriesPrognosisGrammar)cloner.Clone(original.grammar);
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
     public SymbolicTimeSeriesPrognosisProblem()
       : base() {
@@ -188,5 +195,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       // BackwardsCompatibility3.3
       #region Backwards compatible code (remove with 3.4)
@@ -198,10 +205,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicTimeSeriesPrognosisProblem clone = (SymbolicTimeSeriesPrognosisProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.grammar = (SymbolicTimeSeriesPrognosisGrammar)cloner.Clone(grammar);
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new SymbolicTimeSeriesPrognosisProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs	(revision 5275)
@@ -54,5 +54,13 @@
     [StorableConstructor]
     protected SymbolicTimeSeriesPrognosisSolution(bool deserializing) : base(deserializing) { }
-
+    protected SymbolicTimeSeriesPrognosisSolution(SymbolicTimeSeriesPrognosisSolution original, Cloner cloner)
+      : base(original, cloner) {
+      problemData = (MultiVariateDataAnalysisProblemData)cloner.Clone(original.problemData);
+      model = (SymbolicTimeSeriesPrognosisModel)cloner.Clone(original.model);
+      horizon = original.horizon;
+      conditionalEvaluationVariable = original.conditionalEvaluationVariable;
+      lowerEstimationLimit = (double[])original.lowerEstimationLimit.Clone();
+      upperEstimationLimit = (double[])original.upperEstimationLimit.Clone();
+    }
     public SymbolicTimeSeriesPrognosisSolution() {
       horizon = 1;
@@ -68,7 +76,9 @@
       this.upperEstimationLimit = (double[])upperEstimationLimit.Clone();
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicTimeSeriesPrognosisSolution(this, cloner);
+    }
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       if (problemData != null)
         RegisterProblemDataEvents();
@@ -206,14 +216,4 @@
 
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicTimeSeriesPrognosisSolution clone = (SymbolicTimeSeriesPrognosisSolution)base.Clone(cloner);
-      clone.problemData = (MultiVariateDataAnalysisProblemData)cloner.Clone(problemData);
-      clone.model = (SymbolicTimeSeriesPrognosisModel)cloner.Clone(model);
-      clone.horizon = horizon;
-      clone.conditionalEvaluationVariable = conditionalEvaluationVariable;
-      clone.lowerEstimationLimit = (double[])lowerEstimationLimit.Clone();
-      clone.upperEstimationLimit = (double[])upperEstimationLimit.Clone();
-      return clone;
-    }
 
     private IEnumerable<double[]> ApplyEstimationLimits(IEnumerable<double[]> values) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariable.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariable.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariable.cs	(revision 5275)
@@ -47,4 +47,11 @@
       set { maxLag = value; }
     }
+    [StorableConstructor]
+    protected DerivativeVariable(bool deserializing) : base(deserializing) { }
+    protected DerivativeVariable(DerivativeVariable original, Cloner cloner)
+      : base(original, cloner) {
+        minLag = original.minLag;
+        maxLag = original.maxLag;
+    }
     public DerivativeVariable()
       : base("DerivativeVariable", "Represents an differentiated variable value with a time offset.") {
@@ -57,8 +64,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DerivativeVariable clone = (DerivativeVariable)base.Clone(cloner);
-      clone.minLag = minLag;
-      clone.maxLag = maxLag;
-      return clone;
+      return new DerivativeVariable(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariableTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariableTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/DerivativeVariableTreeNode.cs	(revision 5275)
@@ -44,8 +44,9 @@
     private DerivativeVariableTreeNode() { }
 
-    // copy constructor
-    private DerivativeVariableTreeNode(DerivativeVariableTreeNode original)
-      : base(original) {
-      lag = original.lag;
+    [StorableConstructor]
+    protected DerivativeVariableTreeNode(bool deserializing) : base(deserializing) { }
+    protected DerivativeVariableTreeNode(DerivativeVariableTreeNode original, Cloner cloner)
+      : base(original, cloner) {
+        lag = original.lag;
     }
 
@@ -69,6 +70,6 @@
 
 
-    public override object Clone() {
-      return new DerivativeVariableTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DerivativeVariableTreeNode(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariable.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariable.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariable.cs	(revision 5275)
@@ -47,4 +47,11 @@
       set { maxLag = value; }
     }
+    [StorableConstructor]
+    protected IntegratedVariable(bool deserializing) : base(deserializing) { }
+    protected IntegratedVariable(IntegratedVariable original, Cloner cloner)
+      : base(original, cloner) {
+        minLag = original.minLag;
+        maxLag = original.maxLag;
+    }
     public IntegratedVariable()
       : base("IntegratedVariable", "Represents an integrated variable value with a time offset.") {
@@ -57,8 +64,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntegratedVariable clone = (IntegratedVariable)base.Clone(cloner);
-      clone.minLag = minLag;
-      clone.maxLag = maxLag;
-      return clone;
+      return new IntegratedVariable(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariableTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariableTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/IntegratedVariableTreeNode.cs	(revision 5275)
@@ -50,8 +50,8 @@
 
     private IntegratedVariableTreeNode() { }
-
-    // copy constructor
-    private IntegratedVariableTreeNode(IntegratedVariableTreeNode original)
-      : base(original) {
+    [StorableConstructor]
+    protected IntegratedVariableTreeNode(bool deserializing) : base(deserializing) { }
+    protected IntegratedVariableTreeNode(IntegratedVariableTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       minTimeOffset = original.minTimeOffset;
       maxTimeOffset = original.maxTimeOffset;
@@ -77,10 +77,7 @@
       maxTimeOffset = Math.Min(Symbol.MaxLag, Math.Max(minTimeOffset, maxTimeOffset + random.Next(-1, 2)));
     }
-
-
-    public override object Clone() {
-      return new IntegratedVariableTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegratedVariableTreeNode(this, cloner);
     }
-
     public override string ToString() {
       return Weight.ToString("E4") + " I(" + VariableName +
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverage.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverage.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverage.cs	(revision 5275)
@@ -47,4 +47,11 @@
       set { maxLag = value; }
     }
+    [StorableConstructor]
+    protected MovingAverage(bool deserializing) : base(deserializing) { }
+    protected MovingAverage(MovingAverage original, Cloner cloner)
+      : base(original, cloner) {
+      minLag = original.minLag;
+      maxLag = original.maxLag;
+    }
     public MovingAverage()
       : base("MovingAverage", "Represents a moving average of a variable value with a time offset.") {
@@ -57,8 +64,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MovingAverage clone = (MovingAverage)base.Clone(cloner);
-      clone.minLag = minLag;
-      clone.maxLag = maxLag;
-      return clone;
+      return new MovingAverage(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverageTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverageTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/Symbols/MovingAverageTreeNode.cs	(revision 5275)
@@ -50,8 +50,8 @@
 
     private MovingAverageTreeNode() { }
-
-    // copy constructor
-    private MovingAverageTreeNode(MovingAverageTreeNode original)
-      : base(original) {
+    [StorableConstructor]
+    protected MovingAverageTreeNode(bool deserializing) : base(deserializing) { }
+    protected MovingAverageTreeNode(MovingAverageTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       minTimeOffset = original.minTimeOffset;
       maxTimeOffset = original.maxTimeOffset;
@@ -79,8 +79,7 @@
 
 
-    public override object Clone() {
-      return new MovingAverageTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MovingAverageTreeNode(this, cloner);
     }
-
     public override string ToString() {
       return Weight.ToString("E4") + " MA(" + VariableName +
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj	(revision 5275)
@@ -92,6 +92,38 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -114,18 +146,26 @@
     <None Include="HeuristicLabProblemsDataAnalysisMultiVariateViewsPlugin.cs.frame" />
     <None Include="Properties\AssemblyInfo.frame" />
-    <Compile Include="EstimatedValuesView.cs" />
+    <Compile Include="EstimatedValuesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="EstimatedValuesView.Designer.cs">
       <DependentUpon>EstimatedValuesView.cs</DependentUpon>
     </Compile>
-    <Compile Include="LineChartView.cs" />
+    <Compile Include="LineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="LineChartView.Designer.cs">
       <DependentUpon>LineChartView.cs</DependentUpon>
     </Compile>
-    <Compile Include="MultiVariateDataAnalysisSolutionView.cs" />
+    <Compile Include="MultiVariateDataAnalysisSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="MultiVariateDataAnalysisSolutionView.Designer.cs">
       <DependentUpon>MultiVariateDataAnalysisSolutionView.cs</DependentUpon>
     </Compile>
     <Compile Include="HeuristicLabProblemsDataAnalysisMultiVariateViewsPlugin.cs" />
-    <Compile Include="MultiVariateDataAnalysisProblemDataView.cs" />
+    <Compile Include="MultiVariateDataAnalysisProblemDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="MultiVariateDataAnalysisProblemDataView.Designer.cs">
       <DependentUpon>MultiVariateDataAnalysisProblemDataView.cs</DependentUpon>
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanFractionalDistanceEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanFractionalDistanceEvaluator.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanFractionalDistanceEvaluator.cs	(revision 5275)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Evaluators {
+  public class OnlineMeanFractionalDistanceEvaluator : IMultiVariateOnlineEvaluator {
+    private OnlineMeanAndVarianceCalculator meanEvaluator;
+    private readonly double d;
+    public OnlineMeanFractionalDistanceEvaluator(double d) {
+      this.d = d;
+      meanEvaluator = new OnlineMeanAndVarianceCalculator();
+      Reset();
+    }
+
+    public double MeanFractionalDistance {
+      get { return meanEvaluator.Mean ; }
+    }
+
+    #region IMultiVariateOnlineEvaluator Members
+    public double Value {
+      get { return MeanFractionalDistance; }
+    }
+
+    public void Add(IEnumerable<double> original, IEnumerable<double> estimated) {
+      var originalEnumerator = original.GetEnumerator();
+      var estimatedEnumerator = estimated.GetEnumerator();
+      double sum = 0.0;
+      while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
+        sum += Math.Pow(Math.Abs(originalEnumerator.Current - estimatedEnumerator.Current), 1.0 / d);
+      }
+      if (originalEnumerator.MoveNext() | estimatedEnumerator.MoveNext()) {
+        throw new ArgumentException("Number of elements in original and estimated does not match.");
+      }
+      double fracDist = Math.Pow(sum, d);
+      meanEvaluator.Add(fracDist);
+    }
+
+    public void Reset() {
+      meanEvaluator.Reset();
+    }
+
+    #endregion
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanMahalanobisDistanceEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanMahalanobisDistanceEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Evaluators/OnlineMeanMahalanobisDistanceEvaluator.cs	(revision 5275)
@@ -60,5 +60,5 @@
         // calculate mahalanobis distance using covariance matrix
         // covMatrix^(-1) * diff => target
-        alglib.ablas.rmatrixmv(covMatrix.GetLength(0), covMatrix.GetLength(1), ref covMatrix, 0, 0, 0, ref diff, 0, ref target, 0);
+        alglib.ablas.rmatrixmv(covMatrix.GetLength(0), covMatrix.GetLength(1), covMatrix, 0, 0, 0, diff, 0, ref target, 0);
 
         // diff^T * (covMatrix^(-1) * diff) => sum
@@ -102,5 +102,5 @@
       int info = 0;
       alglib.matinv.matinvreport report = new alglib.matinv.matinvreport();
-      alglib.matinv.rmatrixinverse(ref covMatrix, covMatrix.GetLength(0), ref info, ref report);
+      alglib.matinv.rmatrixinverse(ref covMatrix, covMatrix.GetLength(0), ref info, report);
       if (info != 1) throw new InvalidOperationException("Can't invert covariance matrix.");
       diff = new double[samples.Length];
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate-3.3.csproj	(revision 5275)
@@ -92,4 +92,46 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -110,4 +152,5 @@
     <None Include="HeuristicLabProblemsDataAnalysisMultiVariatePlugin.cs.frame" />
     <None Include="Properties\AssemblyInfo.frame" />
+    <Compile Include="Evaluators\OnlineMeanFractionalDistanceEvaluator.cs" />
     <Compile Include="Evaluators\OnlineMultiVariateEvaluator.cs" />
     <Compile Include="Evaluators\OnlineMeanMahalanobisDistanceEvaluator.cs" />
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblem.cs	(revision 5275)
@@ -54,4 +54,9 @@
     [StorableConstructor]
     protected MultiVariateDataAnalysisProblem(bool deserializing) : base(deserializing) { }
+    protected MultiVariateDataAnalysisProblem(MultiVariateDataAnalysisProblem original, Cloner cloner)
+      : base(original, cloner) {
+        RegisterParameterEvents();
+        RegisterParameterValueEvents();
+    }
     public MultiVariateDataAnalysisProblem()
       : base() {
@@ -90,8 +95,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MultiVariateDataAnalysisProblem clone = (MultiVariateDataAnalysisProblem)base.Clone(cloner);
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new MultiVariateDataAnalysisProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblemData.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblemData.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/MultiVariateDataAnalysisProblemData.cs	(revision 5275)
@@ -166,4 +166,12 @@
     #endregion
 
+
+    [StorableConstructor]
+    private MultiVariateDataAnalysisProblemData(bool deserializing) : base() { }
+    protected MultiVariateDataAnalysisProblemData(MultiVariateDataAnalysisProblemData original, Cloner cloner)
+      : base(original, cloner) {
+        RegisterParameterEventHandlers();
+        RegisterParameterValueEventHandlers();
+    }
     public MultiVariateDataAnalysisProblemData()
       : base() {
@@ -187,10 +195,10 @@
     }
 
-
-    [StorableConstructor]
-    private MultiVariateDataAnalysisProblemData(bool deserializing) : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVariateDataAnalysisProblemData(this, cloner);
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       RegisterParameterEventHandlers();
       RegisterParameterValueEventHandlers();
@@ -395,28 +403,22 @@
 
     public virtual void ImportFromFile(string fileName) {
-      var csvFileParser = new CsvFileParser();
-      csvFileParser.Parse(fileName);
+      var tableFileParser = new TableFileParser();
+      tableFileParser.Parse(fileName);
       suppressEvents = true;
       Name = "Data imported from " + Path.GetFileName(fileName);
-      Dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
+      Dataset = new Dataset(tableFileParser.VariableNames, tableFileParser.Values);
       Dataset.Name = Path.GetFileName(fileName);
       var variableNames = Dataset.VariableNames.Select(x => new StringValue(x).AsReadOnly()).ToList();
       InputVariables = new CheckedItemList<StringValue>(variableNames).AsReadOnly();
       TargetVariables = new CheckedItemList<StringValue>(variableNames).AsReadOnly();
-      int middle = (int)(csvFileParser.Rows * 0.5);
+      int middle = (int)(tableFileParser.Rows * 0.5);
       TrainingSamplesStart = new IntValue(0);
       TrainingSamplesEnd = new IntValue(middle);
       TestSamplesStart = new IntValue(middle);
-      TestSamplesEnd = new IntValue(csvFileParser.Rows);
+      TestSamplesEnd = new IntValue(tableFileParser.Rows);
       suppressEvents = false;
       OnProblemDataChanged(EventArgs.Empty);
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      MultiVariateDataAnalysisProblemData clone = (MultiVariateDataAnalysisProblemData)base.Clone(cloner);
-      clone.RegisterParameterEventHandlers();
-      clone.RegisterParameterValueEventHandlers();
-      return clone;
-    }
 
     public DataAnalysisProblemData ConvertToDataAnalysisProblemData(string targetVariable) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Symbolic/MultiVariateExpressionGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Symbolic/MultiVariateExpressionGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate/3.3/Symbolic/MultiVariateExpressionGrammar.cs	(revision 5275)
@@ -37,6 +37,11 @@
     }
 
+    [StorableConstructor]
+    protected MultiVariateExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected MultiVariateExpressionGrammar(MultiVariateExpressionGrammar original, Cloner cloner)
+      : base(original, cloner) {
+        dimension = original.dimension;
+    }
     public MultiVariateExpressionGrammar() : this(2) { }
-
     public MultiVariateExpressionGrammar(int dimension)
       : base() {
@@ -50,5 +55,5 @@
 
       foreach (Symbol s in Symbols) {
-        if (s != StartSymbol)
+        if (s != StartSymbol) 
           for (int i = 0; i < n; i++) {
             SetAllowedChild(StartSymbol, s, i);
@@ -58,7 +63,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MultiVariateExpressionGrammar clone = (MultiVariateExpressionGrammar)base.Clone(cloner);
-      clone.dimension = this.dimension;
-      return clone;
+      return new MultiVariateExpressionGrammar(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Analyzers/RegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Analyzers/RegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Analyzers/RegressionSolutionAnalyzer.cs	(revision 5275)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -28,5 +29,4 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
-using HeuristicLab.Analysis;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
@@ -90,4 +90,8 @@
     #endregion
 
+
+    [StorableConstructor]
+    protected RegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RegressionSolutionAnalyzer(RegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public RegressionSolutionAnalyzer()
       : base() {
@@ -102,5 +106,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       // backwards compatibility
       if (!Parameters.ContainsKey(GenerationsParameterName)) {
@@ -119,18 +123,12 @@
     }
 
-    public static void UpdateBestSolutionResults(DataAnalysisSolution bestSolution, DataAnalysisProblemData problemData, ResultCollection results, IntValue CurrentGeneration) {
-      var solution = bestSolution;
+    public static void UpdateBestSolutionResults(DataAnalysisSolution solution, DataAnalysisProblemData problemData, ResultCollection results, IntValue generation) {
       #region update R2,MSE, Rel Error
-      IEnumerable<double> trainingValues = problemData.Dataset.GetEnumeratedVariableValues(
-        problemData.TargetVariable.Value,
-        problemData.TrainingSamplesStart.Value,
-        problemData.TrainingSamplesEnd.Value);
-      IEnumerable<double> testValues = problemData.Dataset.GetEnumeratedVariableValues(
-        problemData.TargetVariable.Value,
-        problemData.TestSamplesStart.Value,
-        problemData.TestSamplesEnd.Value);
+      IEnumerable<double> trainingValues = problemData.Dataset.GetEnumeratedVariableValues(problemData.TargetVariable.Value, problemData.TrainingIndizes);
+      IEnumerable<double> testValues = problemData.Dataset.GetEnumeratedVariableValues(problemData.TargetVariable.Value, problemData.TestIndizes);
       OnlineMeanSquaredErrorEvaluator mseEvaluator = new OnlineMeanSquaredErrorEvaluator();
       OnlineMeanAbsolutePercentageErrorEvaluator relErrorEvaluator = new OnlineMeanAbsolutePercentageErrorEvaluator();
       OnlinePearsonsRSquaredEvaluator r2Evaluator = new OnlinePearsonsRSquaredEvaluator();
+
       #region training
       var originalEnumerator = trainingValues.GetEnumerator();
@@ -145,7 +143,9 @@
       double trainingRelError = relErrorEvaluator.MeanAbsolutePercentageError;
       #endregion
+
       mseEvaluator.Reset();
       relErrorEvaluator.Reset();
       r2Evaluator.Reset();
+
       #region test
       originalEnumerator = testValues.GetEnumerator();
@@ -160,4 +160,5 @@
       double testRelError = relErrorEvaluator.MeanAbsolutePercentageError;
       #endregion
+
       if (results.ContainsKey(BestSolutionResultName)) {
         results[BestSolutionResultName].Value = solution;
@@ -168,11 +169,6 @@
         results[BestSolutionTrainingRelativeError].Value = new DoubleValue(trainingRelError);
         results[BestSolutionTestRelativeError].Value = new DoubleValue(testRelError);
-        if (CurrentGeneration != null) // this check is needed because linear regression solutions do not have a generations parameter
-          results[BestSolutionGeneration].Value = new IntValue(CurrentGeneration.Value);
-        var solutionQualityTable = (DataTable)results["Best solution quality table"].Value;
-        solutionQualityTable.Rows["Training R²"].Values.Add(trainingR2);
-        solutionQualityTable.Rows["Training MSE"].Values.Add(trainingMse);
-        solutionQualityTable.Rows["Test R²"].Values.Add(testR2);
-        solutionQualityTable.Rows["Test MSE"].Values.Add(testMse);
+        if (generation != null) // this check is needed because linear regression solutions do not have a generations parameter
+          results[BestSolutionGeneration].Value = new IntValue(generation.Value);
       } else {
         results.Add(new Result(BestSolutionResultName, solution));
@@ -183,16 +179,6 @@
         results.Add(new Result(BestSolutionTrainingRelativeError, new DoubleValue(trainingRelError)));
         results.Add(new Result(BestSolutionTestRelativeError, new DoubleValue(testRelError)));
-        if (CurrentGeneration != null)
-          results.Add(new Result(BestSolutionGeneration, new IntValue(CurrentGeneration.Value)));
-        var solutionQualityTable = new DataTable("Best solution quality table");
-        solutionQualityTable.Rows.Add(new DataRow("Training R²"));
-        solutionQualityTable.Rows.Add(new DataRow("Training MSE"));
-        solutionQualityTable.Rows.Add(new DataRow("Test R²"));
-        solutionQualityTable.Rows.Add(new DataRow("Test MSE"));
-        solutionQualityTable.Rows["Training R²"].Values.Add(trainingR2);
-        solutionQualityTable.Rows["Training MSE"].Values.Add(trainingMse);
-        solutionQualityTable.Rows["Test R²"].Values.Add(testR2);
-        solutionQualityTable.Rows["Test MSE"].Values.Add(testMse);
-        results.Add(new Result("Best solution quality table", solutionQualityTable));
+        if (generation != null)
+          results.Add(new Result(BestSolutionGeneration, new IntValue(generation.Value)));
       }
       #endregion
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj	(revision 5275)
@@ -92,4 +92,58 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.LibSVM-1.6.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.LibSVM-1.6.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="LibSVM-1.6.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\LibSVM-1.6.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -120,5 +174,4 @@
     <Compile Include="SupportVectorRegression\SupportVectorRegressionSolution.cs" />
     <Compile Include="Symbolic\Analyzers\BestSymbolicRegressionSolutionAnalyzer.cs" />
-    <Compile Include="Symbolic\Analyzers\OverfittingAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\ISymbolicRegressionAnalyzer.cs" />
@@ -127,9 +180,12 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Symbolic\Analyzers\SymbolicRegressionOverfittingAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionSolutionLinearScaler.cs" />
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionTournamentPruning.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Symbolic\Analyzers\SymbolicRegressionValidationAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\SymbolicRegressionVariableFrequencyAnalyzer.cs" />
+    <Compile Include="Symbolic\Analyzers\TrainingBestScaledSymbolicRegressionSolutionAnalyzer.cs" />
     <Compile Include="Symbolic\Analyzers\ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs" />
     <Compile Include="Symbolic\Evaluators\MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator.cs" />
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLabProblemsDataAnalysisRegressionPlugin.cs.frame
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLabProblemsDataAnalysisRegressionPlugin.cs.frame	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLabProblemsDataAnalysisRegressionPlugin.cs.frame	(revision 5275)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis.Regression","3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Regression-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "2.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.1")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/LinearRegression/LinearRegressionSolutionCreator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/LinearRegression/LinearRegressionSolutionCreator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/LinearRegression/LinearRegressionSolutionCreator.cs	(revision 5275)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -39,5 +40,5 @@
   [Item("LinearRegressionSolutionCreator", "Uses linear regression to create a structure tree.")]
   [StorableClass]
-  public class LinearRegressionSolutionCreator : SingleSuccessorOperator, ISolutionCreator {
+  public sealed class LinearRegressionSolutionCreator : SingleSuccessorOperator, ISolutionCreator {
     private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
     private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
@@ -45,4 +46,7 @@
     private const string SamplesEndParameterName = "SamplesEnd";
 
+    [StorableConstructor]
+    private LinearRegressionSolutionCreator(bool deserializing) : base(deserializing) { }
+    private LinearRegressionSolutionCreator(LinearRegressionSolutionCreator original, Cloner cloner) : base(original, cloner) { }
     public LinearRegressionSolutionCreator() {
       Parameters.Add(new LookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The resulting solution encoded as a symbolic expression tree."));
@@ -51,7 +55,7 @@
       Parameters.Add(new ValueLookupParameter<IntValue>(SamplesEndParameterName, "The end of the samples on which the linear regression should be applied."));
     }
-    [StorableConstructor]
-    public LinearRegressionSolutionCreator(bool deserializing)
-      : base(deserializing) {
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinearRegressionSolutionCreator(this, cloner);
     }
 
@@ -107,5 +111,5 @@
 
       int retVal = 1;
-      alglib.linreg.lrbuild(ref inputMatrix, nRows, nFeatures, ref retVal, ref lm, ref ar);
+      alglib.linreg.lrbuild(inputMatrix, nRows, nFeatures, ref retVal, lm, ar);
       if (retVal != 1) throw new ArgumentException("Error in calculation of linear regression model");
       rmsError = ar.rmserror;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/BestSupportVectorRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/BestSupportVectorRegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/BestSupportVectorRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -52,8 +53,15 @@
     #endregion
 
+    [StorableConstructor]
+    private BestSupportVectorRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private BestSupportVectorRegressionSolutionAnalyzer(BestSupportVectorRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public BestSupportVectorRegressionSolutionAnalyzer()
       : base() {
       Parameters.Add(new ScopeTreeLookupParameter<SupportVectorMachineModel>(SupportVectorRegressionModelParameterName, "The support vector regression models to analyze."));
       Parameters.Add(new LookupParameter<SupportVectorRegressionSolution>(BestSolutionParameterName, "The best support vector regression solution."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestSupportVectorRegressionSolutionAnalyzer(this, cloner);
     }
 
@@ -68,5 +76,5 @@
                                              where ProblemData.InputVariables.ItemChecked(var)
                                              select var.Value;
-        var solution = new SupportVectorRegressionSolution(ProblemData, SupportVectorMachineModel[i], inputVariables, lowerEstimationLimit, upperEstimationLimit);
+        var solution = new SupportVectorRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(), SupportVectorMachineModel[i], inputVariables, lowerEstimationLimit, upperEstimationLimit);
 
         BestSolutionParameter.ActualValue = solution;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/SupportVectorRegressionSolution.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/SupportVectorRegressionSolution.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/SupportVectorRegression/SupportVectorRegressionSolution.cs	(revision 5275)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -36,10 +37,4 @@
   [StorableClass]
   public sealed class SupportVectorRegressionSolution : DataAnalysisSolution {
-    public SupportVectorRegressionSolution() : base() { }
-    public SupportVectorRegressionSolution(DataAnalysisProblemData problemData, SupportVectorMachineModel model, IEnumerable<string> inputVariables, double lowerEstimationLimit, double upperEstimationLimit)
-      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
-      this.Model = model;
-    }
-
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Function; }
@@ -53,4 +48,37 @@
     public Dataset SupportVectors {
       get { return CalculateSupportVectors(); }
+    }
+
+    private List<double> estimatedValues;
+    public override IEnumerable<double> EstimatedValues {
+      get {
+        if (estimatedValues == null) RecalculateEstimatedValues();
+        return estimatedValues;
+      }
+    }
+
+    public override IEnumerable<double> EstimatedTrainingValues {
+      get {
+        return GetEstimatedValues(ProblemData.TrainingIndizes);
+      }
+    }
+
+    public override IEnumerable<double> EstimatedTestValues {
+      get {
+        return GetEstimatedValues(ProblemData.TestIndizes);
+      }
+    }
+
+    [StorableConstructor]
+    private SupportVectorRegressionSolution(bool deserializing) : base(deserializing) { }
+    private SupportVectorRegressionSolution(SupportVectorRegressionSolution original, Cloner cloner) : base(original, cloner) { }
+    public SupportVectorRegressionSolution() : base() { }
+    public SupportVectorRegressionSolution(DataAnalysisProblemData problemData, SupportVectorMachineModel model, IEnumerable<string> inputVariables, double lowerEstimationLimit, double upperEstimationLimit)
+      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
+      this.Model = model;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorRegressionSolution(this, cloner);
     }
 
@@ -73,5 +101,5 @@
 
     protected override void RecalculateEstimatedValues() {
-      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(ProblemData, 0, ProblemData.Dataset.Rows);
+      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(ProblemData, Enumerable.Range(0, ProblemData.Dataset.Rows));
       SVM.Problem scaledProblem = Scaling.Scale(Model.RangeTransform, problem);
 
@@ -83,28 +111,9 @@
     }
 
-    private List<double> estimatedValues;
-    public override IEnumerable<double> EstimatedValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        return estimatedValues.AsEnumerable();
-      }
-    }
 
-    public override IEnumerable<double> EstimatedTrainingValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        int start = ProblemData.TrainingSamplesStart.Value;
-        int n = ProblemData.TrainingSamplesEnd.Value - start;
-        return estimatedValues.Skip(start).Take(n).ToList();
-      }
-    }
-
-    public override IEnumerable<double> EstimatedTestValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        int start = ProblemData.TestSamplesStart.Value;
-        int n = ProblemData.TestSamplesEnd.Value - start;
-        return estimatedValues.Skip(start).Take(n).ToList();
-      }
+    private IEnumerable<double> GetEstimatedValues(IEnumerable<int> rows) {
+      if (estimatedValues == null) RecalculateEstimatedValues();
+      foreach (int row in rows)
+        yield return estimatedValues[row];
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -40,5 +41,4 @@
     private const string VariableImpactsResultName = "Integrated variable frequencies";
     private const string BestSolutionParameterName = "BestSolution";
-    private const string BestSolutionComplexity = "Best solution complexity";
 
     #region parameter properties
@@ -68,4 +68,7 @@
     #endregion
 
+    [StorableConstructor]
+    private BestSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private BestSymbolicRegressionSolutionAnalyzer(BestSymbolicRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public BestSymbolicRegressionSolutionAnalyzer()
       : base() {
@@ -76,6 +79,10 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestSymbolicRegressionSolutionAnalyzer(this, cloner);
+    }
+
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       if (!Parameters.ContainsKey(VariableFrequenciesParameterName)) {
         Parameters.Add(new LookupParameter<DataTable>(VariableFrequenciesParameterName, "The variable frequencies table to use for the calculation of variable impacts"));
@@ -92,38 +99,27 @@
         var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
           SymbolicExpressionTree[i]);
-        var solution = new SymbolicRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(), model, lowerEstimationLimit, upperEstimationLimit);
+        DataAnalysisProblemData problemDataClone = (DataAnalysisProblemData)ProblemData.Clone();
+        var solution = new SymbolicRegressionSolution(problemDataClone, model, lowerEstimationLimit, upperEstimationLimit);
         solution.Name = BestSolutionParameterName;
         solution.Description = "Best solution on validation partition found over the whole run.";
         BestSolutionParameter.ActualValue = solution;
         BestSolutionQualityParameter.ActualValue = Quality[i];
-        BestSymbolicRegressionSolutionAnalyzer.UpdateSymbolicRegressionBestSolutionResults(solution, ProblemData, Results, VariableFrequencies);
+        BestSymbolicRegressionSolutionAnalyzer.UpdateSymbolicRegressionBestSolutionResults(solution, problemDataClone, Results, VariableFrequencies);
       }
       return BestSolutionParameter.ActualValue;
     }
 
-    public static void UpdateBestSolutionResults(SymbolicRegressionSolution bestSolution, DataAnalysisProblemData problemData, ResultCollection results, IntValue currentGeneration, DataTable variableFrequencies) {
-      RegressionSolutionAnalyzer.UpdateBestSolutionResults(bestSolution, problemData, results, currentGeneration);
-      UpdateSymbolicRegressionBestSolutionResults(bestSolution, problemData, results, variableFrequencies);
+    public static void UpdateBestSolutionResults(SymbolicRegressionSolution solution, DataAnalysisProblemData problemData, ResultCollection results, IntValue currentGeneration, DataTable variableFrequencies) {
+      RegressionSolutionAnalyzer.UpdateBestSolutionResults(solution, problemData, results, currentGeneration);
+      UpdateSymbolicRegressionBestSolutionResults(solution, problemData, results, variableFrequencies);
     }
 
-    private static void UpdateSymbolicRegressionBestSolutionResults(SymbolicRegressionSolution bestSolution, DataAnalysisProblemData problemData, ResultCollection results, DataTable variableFrequencies) {
+    private static void UpdateSymbolicRegressionBestSolutionResults(SymbolicRegressionSolution solution, DataAnalysisProblemData problemData, ResultCollection results, DataTable variableFrequencies) {
       if (results.ContainsKey(BestSolutionInputvariableCountResultName)) {
-        results[BestSolutionInputvariableCountResultName].Value = new IntValue(bestSolution.Model.InputVariables.Count());
+        results[BestSolutionInputvariableCountResultName].Value = new IntValue(solution.Model.InputVariables.Count());
         results[VariableImpactsResultName].Value = CalculateVariableImpacts(variableFrequencies);
-        var sizeTable = (DataTable)results[BestSolutionComplexity].Value;
-        sizeTable.Rows["Best solution size"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Size);
-        sizeTable.Rows["Best solution height"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Height);
-        sizeTable.Rows["Best solution variables"].Values.Add(bestSolution.Model.InputVariables.Count());
       } else {
-        results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(bestSolution.Model.InputVariables.Count())));
+        results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(solution.Model.InputVariables.Count())));
         results.Add(new Result(VariableImpactsResultName, CalculateVariableImpacts(variableFrequencies)));
-        var sizeTable = new DataTable("Best solution complexity");
-        sizeTable.Rows.Add(new DataRow("Best solution size"));
-        sizeTable.Rows.Add(new DataRow("Best solution height"));
-        sizeTable.Rows.Add(new DataRow("Best solution variables"));
-        sizeTable.Rows["Best solution size"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Size);
-        sizeTable.Rows["Best solution height"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Height);
-        sizeTable.Rows["Best solution variables"].Values.Add(bestSolution.Model.InputVariables.Count());
-        results.Add(new Result(BestSolutionComplexity, sizeTable));
       }
     }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -23,4 +23,5 @@
 using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -30,7 +31,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using System;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
@@ -40,18 +39,11 @@
   [Item("FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the validation best scaled symbolic regression solution.")]
   [StorableClass]
-  public sealed class FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer : SingleSuccessorOperator, ISymbolicRegressionAnalyzer {
-    private const string RandomParameterName = "Random";
-    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
-    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
-    private const string ProblemDataParameterName = "ProblemData";
-    private const string ValidationSamplesStartParameterName = "SamplesStart";
-    private const string ValidationSamplesEndParameterName = "SamplesEnd";
-    // private const string QualityParameterName = "Quality";
-    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
-    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
-    private const string EvaluatorParameterName = "Evaluator";
+  public sealed class FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer : SymbolicRegressionValidationAnalyzer, ISymbolicRegressionAnalyzer {
     private const string MaximizationParameterName = "Maximization";
+    private const string CalculateSolutionComplexityParameterName = "CalculateSolutionComplexity";
     private const string BestSolutionParameterName = "Best solution (validation)";
     private const string BestSolutionQualityParameterName = "Best solution quality (validation)";
+    private const string BestSolutionLengthParameterName = "Best solution length (validation)";
+    private const string BestSolutionHeightParameterName = "Best solution height (validiation)";
     private const string CurrentBestValidationQualityParameterName = "Current best validation quality";
     private const string BestSolutionQualityValuesParameterName = "Validation Quality";
@@ -60,94 +52,15 @@
     private const string BestKnownQualityParameterName = "BestKnownQuality";
     private const string GenerationsParameterName = "Generations";
-    private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples";
-
-    private const string TrainingMeanSquaredErrorQualityParameterName = "Mean squared error (training)";
-    private const string MinTrainingMeanSquaredErrorQualityParameterName = "Min mean squared error (training)";
-    private const string MaxTrainingMeanSquaredErrorQualityParameterName = "Max mean squared error (training)";
-    private const string AverageTrainingMeanSquaredErrorQualityParameterName = "Average mean squared error (training)";
-    private const string BestTrainingMeanSquaredErrorQualityParameterName = "Best mean squared error (training)";
-
-    private const string TrainingAverageRelativeErrorQualityParameterName = "Average relative error (training)";
-    private const string MinTrainingAverageRelativeErrorQualityParameterName = "Min average relative error (training)";
-    private const string MaxTrainingAverageRelativeErrorQualityParameterName = "Max average relative error (training)";
-    private const string AverageTrainingAverageRelativeErrorQualityParameterName = "Average average relative error (training)";
-    private const string BestTrainingAverageRelativeErrorQualityParameterName = "Best average relative error (training)";
-
-    private const string TrainingRSquaredQualityParameterName = "R² (training)";
-    private const string MinTrainingRSquaredQualityParameterName = "Min R² (training)";
-    private const string MaxTrainingRSquaredQualityParameterName = "Max R² (training)";
-    private const string AverageTrainingRSquaredQualityParameterName = "Average R² (training)";
-    private const string BestTrainingRSquaredQualityParameterName = "Best R² (training)";
-
-    private const string TestMeanSquaredErrorQualityParameterName = "Mean squared error (test)";
-    private const string MinTestMeanSquaredErrorQualityParameterName = "Min mean squared error (test)";
-    private const string MaxTestMeanSquaredErrorQualityParameterName = "Max mean squared error (test)";
-    private const string AverageTestMeanSquaredErrorQualityParameterName = "Average mean squared error (test)";
-    private const string BestTestMeanSquaredErrorQualityParameterName = "Best mean squared error (test)";
-
-    private const string TestAverageRelativeErrorQualityParameterName = "Average relative error (test)";
-    private const string MinTestAverageRelativeErrorQualityParameterName = "Min average relative error (test)";
-    private const string MaxTestAverageRelativeErrorQualityParameterName = "Max average relative error (test)";
-    private const string AverageTestAverageRelativeErrorQualityParameterName = "Average average relative error (test)";
-    private const string BestTestAverageRelativeErrorQualityParameterName = "Best average relative error (test)";
-
-    private const string TestRSquaredQualityParameterName = "R² (test)";
-    private const string MinTestRSquaredQualityParameterName = "Min R² (test)";
-    private const string MaxTestRSquaredQualityParameterName = "Max R² (test)";
-    private const string AverageTestRSquaredQualityParameterName = "Average R² (test)";
-    private const string BestTestRSquaredQualityParameterName = "Best R² (test)";
-
-    private const string RSquaredValuesParameterName = "R²";
-    private const string MeanSquaredErrorValuesParameterName = "Mean squared error";
-    private const string RelativeErrorValuesParameterName = "Average relative error";
 
     #region parameter properties
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
-    }
-    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
-      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
-    }
-    public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
-      get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
-    }
-    public ILookupParameter<ISymbolicRegressionEvaluator> EvaluatorParameter {
-      get { return (ILookupParameter<ISymbolicRegressionEvaluator>)Parameters[EvaluatorParameterName]; }
-    }
     public ILookupParameter<BoolValue> MaximizationParameter {
       get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; }
     }
-    public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
-      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
-    }
-    public IValueLookupParameter<IntValue> ValidationSamplesStartParameter {
-      get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesStartParameterName]; }
-    }
-    public IValueLookupParameter<IntValue> ValidationSamplesEndParameter {
-      get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesEndParameterName]; }
-    }
-    public IValueParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter {
-      get { return (IValueParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; }
-    }
-
-    public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
-    }
-    public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
+    public IValueParameter<BoolValue> CalculateSolutionComplexityParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[CalculateSolutionComplexityParameterName]; }
     }
     public ILookupParameter<SymbolicRegressionSolution> BestSolutionParameter {
       get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters[BestSolutionParameterName]; }
     }
-    public ILookupParameter<SymbolicRegressionSolution> BestTrainingSolutionParameter {
-      get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters["BestTrainingSolution"]; }
-    }
-    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ScopeTreeLookupParameter<DoubleValue> ValidationQualityParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["ValidationQuality"]; }
-    }
-
     public ILookupParameter<IntValue> GenerationsParameter {
       get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
@@ -156,6 +69,9 @@
       get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionQualityParameterName]; }
     }
-    public ILookupParameter<DataTable> BestSolutionQualityValuesParameter {
-      get { return (ILookupParameter<DataTable>)Parameters[BestSolutionQualityValuesParameterName]; }
+    public ILookupParameter<IntValue> BestSolutionLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionLengthParameterName]; }
+    }
+    public ILookupParameter<IntValue> BestSolutionHeightParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionHeightParameterName]; }
     }
     public ILookupParameter<ResultCollection> ResultsParameter {
@@ -165,8 +81,4 @@
       get { return (ILookupParameter<DoubleValue>)Parameters[BestKnownQualityParameterName]; }
     }
-    public ILookupParameter<DoubleValue> CurrentBestValidationQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters[CurrentBestValidationQualityParameterName]; }
-    }
-
     public ILookupParameter<DataTable> VariableFrequenciesParameter {
       get { return (ILookupParameter<DataTable>)Parameters[VariableFrequenciesParameterName]; }
@@ -175,37 +87,10 @@
     #endregion
     #region properties
-    public IRandom Random {
-      get { return RandomParameter.ActualValue; }
-    }
-    public ItemArray<SymbolicExpressionTree> SymbolicExpressionTree {
-      get { return SymbolicExpressionTreeParameter.ActualValue; }
-    }
-    public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
-      get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; }
-    }
-    public ISymbolicRegressionEvaluator Evaluator {
-      get { return EvaluatorParameter.ActualValue; }
-    }
     public BoolValue Maximization {
       get { return MaximizationParameter.ActualValue; }
     }
-    public DataAnalysisProblemData ProblemData {
-      get { return ProblemDataParameter.ActualValue; }
-    }
-    public IntValue ValidationSamplesStart {
-      get { return ValidationSamplesStartParameter.ActualValue; }
-    }
-    public IntValue ValidationSamplesEnd {
-      get { return ValidationSamplesEndParameter.ActualValue; }
-    }
-    public PercentValue RelativeNumberOfEvaluatedSamples {
-      get { return RelativeNumberOfEvaluatedSamplesParameter.Value; }
-    }
-
-    public DoubleValue UpperEstimationLimit {
-      get { return UpperEstimationLimitParameter.ActualValue; }
-    }
-    public DoubleValue LowerEstimationLimit {
-      get { return LowerEstimationLimitParameter.ActualValue; }
+    public BoolValue CalculateSolutionComplexity {
+      get { return CalculateSolutionComplexityParameter.Value; }
+      set { CalculateSolutionComplexityParameter.Value = value; }
     }
     public ResultCollection Results {
@@ -221,109 +106,69 @@
       get { return BestSolutionQualityParameter.ActualValue; }
     }
+    public IntValue BestSolutionLength {
+      get { return BestSolutionLengthParameter.ActualValue; }
+      set { BestSolutionLengthParameter.ActualValue = value; }
+    }
+    public IntValue BestSolutionHeight {
+      get { return BestSolutionHeightParameter.ActualValue; }
+      set { BestSolutionHeightParameter.ActualValue = value; }
+    }
 
     #endregion
 
+    [StorableConstructor]
+    private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer()
       : base() {
-      Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use."));
-      Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set."));
-      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
       Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
-      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
-      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
-      Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesStartParameterName, "The first index of the validation partition of the data set."));
-      Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesEndParameterName, "The last index of the validation partition of the data set."));
-      Parameters.Add(new ValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index.", new PercentValue(1)));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
-      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
+      Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionComplexityParameterName, "Determines if the length and height of the validation best solution should be calculated.", new BoolValue(false)));
       Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestSolutionParameterName, "The best symbolic regression solution."));
-      Parameters.Add(new LookupParameter<SymbolicRegressionSolution>("BestTrainingSolution"));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality"));
-      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ValidationQuality"));
       Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations calculated so far."));
       Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameterName, "The quality of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<IntValue>(BestSolutionLengthParameterName, "The length of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<IntValue>(BestSolutionHeightParameterName, "The height of the best symbolic regression solution."));
       Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
       Parameters.Add(new LookupParameter<DoubleValue>(BestKnownQualityParameterName, "The best known (validation) quality achieved on the data set."));
-      Parameters.Add(new LookupParameter<DoubleValue>(CurrentBestValidationQualityParameterName, "The quality of the best solution (on the validation set) of the current generation."));
-      Parameters.Add(new LookupParameter<DataTable>(BestSolutionQualityValuesParameterName));
       Parameters.Add(new LookupParameter<DataTable>(VariableFrequenciesParameterName, "The variable frequencies table to use for the calculation of variable impacts"));
     }
 
-    [StorableConstructor]
-    private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      #region compatibility remove before releasing 3.3.1
-      if (!Parameters.ContainsKey(EvaluatorParameterName)) {
-        Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set."));
+      #region compatibility remove before releasing 3.4
+      if (!Parameters.ContainsKey("Evaluator")) {
+        Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>("Evaluator", "The evaluator which should be used to evaluate the solution on the validation set."));
       }
       if (!Parameters.ContainsKey(MaximizationParameterName)) {
         Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
       }
-      if (!Parameters.ContainsKey(BestSolutionQualityValuesParameterName)) {
-        Parameters.Add(new LookupParameter<DataTable>(BestSolutionQualityValuesParameterName));
-      }
-      if (!Parameters.ContainsKey("BestTrainingSolution")) {
-        Parameters.Add(new LookupParameter<SymbolicRegressionSolution>("BestTrainingSolution"));
-      }
-      if (!Parameters.ContainsKey("Quality")) {
-        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality"));
-      }
-      if (!Parameters.ContainsKey("ValidationQuality")) {
-        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ValidationQuality"));
+      if (!Parameters.ContainsKey(CalculateSolutionComplexityParameterName)) {
+        Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionComplexityParameterName, "Determines if the length and height of the validation best solution should be calculated.", new BoolValue(false)));
+      }
+      if (!Parameters.ContainsKey(BestSolutionLengthParameterName)) {
+        Parameters.Add(new LookupParameter<IntValue>(BestSolutionLengthParameterName, "The length of the best symbolic regression solution."));
+      }
+      if (!Parameters.ContainsKey(BestSolutionHeightParameterName)) {
+        Parameters.Add(new LookupParameter<IntValue>(BestSolutionHeightParameterName, "The height of the best symbolic regression solution."));
       }
       #endregion
     }
 
-    public override IOperation Apply() {
-      ItemArray<SymbolicExpressionTree> trees = SymbolicExpressionTree;
-      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
-
-      string targetVariable = ProblemData.TargetVariable.Value;
-
-      // select a random subset of rows in the validation set
-      int validationStart = ValidationSamplesStart.Value;
-      int validationEnd = ValidationSamplesEnd.Value;
-      int seed = Random.Next();
-      int count = (int)((validationEnd - validationStart) * RelativeNumberOfEvaluatedSamples.Value);
-      if (count == 0) count = 1;
-      IEnumerable<int> rows = RandomEnumerable.SampleRandomNumbers(seed, validationStart, validationEnd, count);
-
-      double upperEstimationLimit = UpperEstimationLimit != null ? UpperEstimationLimit.Value : double.PositiveInfinity;
-      double lowerEstimationLimit = LowerEstimationLimit != null ? LowerEstimationLimit.Value : double.NegativeInfinity;
-
+    protected override void Analyze(SymbolicExpressionTree[] trees, double[] validationQuality) {
       double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity;
       SymbolicExpressionTree bestTree = null;
-      SymbolicExpressionTree bestTrainingTree = trees[0];
-      double bestTrainingQuality = qualities[0].Value;
-      ItemArray<DoubleValue> validationQualites = new ItemArray<DoubleValue>(qualities.Length);
+
       for (int i = 0; i < trees.Length; i++) {
-        SymbolicExpressionTree tree = trees[i];
-        double quality = Evaluator.Evaluate(SymbolicExpressionTreeInterpreter, tree,
-          lowerEstimationLimit, upperEstimationLimit,
-          ProblemData.Dataset, targetVariable,
-         rows);
-        validationQualites[i] = new DoubleValue(quality);
+        double quality = validationQuality[i];
         if ((Maximization.Value && quality > bestQuality) ||
             (!Maximization.Value && quality < bestQuality)) {
           bestQuality = quality;
-          bestTree = tree;
+          bestTree = trees[i];
         }
-        if ((Maximization.Value && qualities[i].Value > bestTrainingQuality) ||
-            (!Maximization.Value && qualities[i].Value < bestTrainingQuality)) {
-          bestTrainingQuality = qualities[i].Value;
-          bestTrainingTree = tree;
-        }
-      }
-      ValidationQualityParameter.ActualValue = validationQualites;
-
-      var scaledBestTrainingTree = GetScaledTree(bestTrainingTree);
-
-      SymbolicRegressionSolution bestTrainingSolution = new SymbolicRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(),
-        new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(), scaledBestTrainingTree),
-        lowerEstimationLimit, upperEstimationLimit);
-      bestTrainingSolution.Name = "Best solution (training)";
-      bestTrainingSolution.Description = "The solution of the population with the highest fitness";
+      }
 
       // if the best validation tree is better than the current best solution => update
@@ -333,5 +178,17 @@
         (!Maximization.Value && bestQuality < BestSolutionQuality.Value);
       if (newBest) {
-        var scaledTree = GetScaledTree(bestTree);
+        double lowerEstimationLimit = LowerEstimationLimit.Value;
+        double upperEstimationLimit = UpperEstimationLimit.Value;
+        string targetVariable = ProblemData.TargetVariable.Value;
+
+        // calculate scaling parameters and only for the best tree using the full training set
+        double alpha, beta;
+        SymbolicRegressionScaledMeanSquaredErrorEvaluator.Calculate(SymbolicExpressionTreeInterpreter, bestTree,
+          lowerEstimationLimit, upperEstimationLimit,
+          ProblemData.Dataset, targetVariable,
+          ProblemData.TrainingIndizes, out beta, out alpha);
+
+        // scale tree for solution
+        var scaledTree = SymbolicRegressionSolutionLinearScaler.Scale(bestTree, alpha, beta);
         var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
           scaledTree);
@@ -343,8 +200,17 @@
         BestSolutionQualityParameter.ActualValue = new DoubleValue(bestQuality);
 
+        if (CalculateSolutionComplexity.Value) {
+          BestSolutionLength = new IntValue(solution.Model.SymbolicExpressionTree.Size);
+          BestSolutionHeight = new IntValue(solution.Model.SymbolicExpressionTree.Height);
+          if (!Results.ContainsKey(BestSolutionLengthParameterName)) {
+            Results.Add(new Result(BestSolutionLengthParameterName, "Length of the best solution on the validation set", new IntValue()));
+            Results.Add(new Result(BestSolutionHeightParameterName, "Height of the best solution on the validation set", new IntValue()));
+          }
+          Results[BestSolutionLengthParameterName].Value = BestSolutionLength;
+          Results[BestSolutionHeightParameterName].Value = BestSolutionHeight;
+        }
+
         BestSymbolicRegressionSolutionAnalyzer.UpdateBestSolutionResults(solution, ProblemData, Results, Generations, VariableFrequencies);
       }
-
-      CurrentBestValidationQualityParameter.ActualValue = new DoubleValue(bestQuality);
 
       if (!Results.ContainsKey(BestSolutionQualityValuesParameterName)) {
@@ -352,36 +218,12 @@
         Results.Add(new Result(BestSolutionQualityParameterName, new DoubleValue()));
         Results.Add(new Result(CurrentBestValidationQualityParameterName, new DoubleValue()));
-        Results.Add(new Result("Best solution (training)", bestTrainingSolution));
       }
       Results[BestSolutionQualityParameterName].Value = new DoubleValue(BestSolutionQualityParameter.ActualValue.Value);
       Results[CurrentBestValidationQualityParameterName].Value = new DoubleValue(bestQuality);
-      Results["Best solution (training)"].Value = bestTrainingSolution;
 
       DataTable validationValues = (DataTable)Results[BestSolutionQualityValuesParameterName].Value;
       AddValue(validationValues, BestSolutionQualityParameter.ActualValue.Value, BestSolutionQualityParameterName, BestSolutionQualityParameterName);
       AddValue(validationValues, bestQuality, CurrentBestValidationQualityParameterName, CurrentBestValidationQualityParameterName);
-
-      BestSolutionQualityValuesParameter.ActualValue = validationValues;
-
-      return base.Apply();
-    }
-
-    private SymbolicExpressionTree GetScaledTree(SymbolicExpressionTree tree) {
-      // calculate scaling parameters and only for the best tree using the full training set
-      double alpha, beta;
-      int trainingStart = ProblemData.TrainingSamplesStart.Value;
-      int trainingEnd = ProblemData.TrainingSamplesEnd.Value;
-      IEnumerable<int> trainingRows = Enumerable.Range(trainingStart, trainingEnd - trainingStart);
-      IEnumerable<double> originalValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable.Value, trainingRows);
-      IEnumerable<double> estimatedValues = SymbolicExpressionTreeInterpreter.GetSymbolicExpressionTreeValues(tree, ProblemData.Dataset, trainingRows);
-
-      SymbolicRegressionScaledMeanSquaredErrorEvaluator.CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
-
-      // scale tree for solution
-      return SymbolicRegressionSolutionLinearScaler.Scale(tree, alpha, beta);
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() { }
+    }
 
     private static void AddValue(DataTable table, double data, string name, string description) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs	(revision 5275)
@@ -24,4 +24,5 @@
 using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -118,4 +119,7 @@
     #endregion
 
+    [StorableConstructor]
+    private SymbolicRegressionModelQualityAnalyzer(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionModelQualityAnalyzer(SymbolicRegressionModelQualityAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionModelQualityAnalyzer()
       : base() {
@@ -131,12 +135,11 @@
     }
 
-    [StorableConstructor]
-    private SymbolicRegressionModelQualityAnalyzer(bool deserializing) : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionModelQualityAnalyzer(this, cloner);
+    }
 
     public override IOperation Apply() {
       Analyze(SymbolicExpressionTreeParameter.ActualValue, SymbolicExpressionTreeInterpreterParameter.ActualValue,
         UpperEstimationLimit.Value, LowerEstimationLimit.Value, ProblemDataParameter.ActualValue,
-        ProblemDataParameter.ActualValue.TrainingSamplesStart.Value, ProblemDataParameter.ActualValue.TrainingSamplesEnd.Value,
-        ProblemDataParameter.ActualValue.TestSamplesStart.Value, ProblemDataParameter.ActualValue.TestSamplesEnd.Value,
         ResultsParameter.ActualValue);
       return base.Apply();
@@ -145,8 +148,8 @@
     public static void Analyze(IEnumerable<SymbolicExpressionTree> trees, ISymbolicExpressionTreeInterpreter interpreter,
       double upperEstimationLimit, double lowerEstimationLimit,
-      DataAnalysisProblemData problemData, int trainingStart, int trainingEnd, int testStart, int testEnd, ResultCollection results) {
+      DataAnalysisProblemData problemData, ResultCollection results) {
       int targetVariableIndex = problemData.Dataset.GetVariableIndex(problemData.TargetVariable.Value);
-      IEnumerable<double> originalTrainingValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, trainingStart, trainingEnd);
-      IEnumerable<double> originalTestValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, testStart, testEnd);
+      IEnumerable<double> originalTrainingValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, problemData.TrainingIndizes);
+      IEnumerable<double> originalTestValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, problemData.TestIndizes);
       List<double> trainingMse = new List<double>();
       List<double> trainingR2 = new List<double>();
@@ -162,5 +165,5 @@
       foreach (var tree in trees) {
         #region training
-        var estimatedTrainingValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(trainingStart, trainingEnd - trainingStart));
+        var estimatedTrainingValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, problemData.TrainingIndizes);
         mseEvaluator.Reset();
         r2Evaluator.Reset();
@@ -184,5 +187,5 @@
         #endregion
         #region test
-        var estimatedTestValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(testStart, testEnd - testStart));
+        var estimatedTestValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, problemData.TestIndizes);
 
         mseEvaluator.Reset();
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs	(revision 5275)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -35,4 +37,5 @@
   [Item("SymbolicRegressionModelQualityCalculator", "An operator to calculate the quality values of a symbolic regression solution symbolic expression tree encoding.")]
   [StorableClass]
+  [Obsolete("This class should not be used anymore because of performance reasons and will therefore not be updated.")]
   public sealed class SymbolicRegressionModelQualityCalculator : AlgorithmOperator {
     private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
@@ -81,4 +84,7 @@
     #endregion
 
+    [StorableConstructor]
+    private SymbolicRegressionModelQualityCalculator(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionModelQualityCalculator(SymbolicRegressionModelQualityCalculator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionModelQualityCalculator()
       : base() {
@@ -136,4 +142,7 @@
 
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionModelQualityCalculator(this, cloner);
+    }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionOverfittingAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionOverfittingAnalyzer.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionOverfittingAnalyzer.cs	(revision 5275)
@@ -0,0 +1,134 @@
+#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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using System;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
+  [Item("SymbolicRegressionOverfittingAnalyzer", "Calculates and tracks correlation of training and validation fitness of symbolic regression models.")]
+  [StorableClass]
+  public sealed class SymbolicRegressionOverfittingAnalyzer : SymbolicRegressionValidationAnalyzer, ISymbolicRegressionAnalyzer {
+    private const string MaximizationParameterName = "Maximization";
+    private const string QualityParameterName = "Quality";
+    private const string TrainingValidationCorrelationParameterName = "TrainingValidationCorrelation";
+    private const string TrainingValidationCorrelationTableParameterName = "TrainingValidationCorrelationTable";
+    private const string LowerCorrelationThresholdParameterName = "LowerCorrelationThreshold";
+    private const string UpperCorrelationThresholdParameterName = "UpperCorrelationThreshold";
+    private const string OverfittingParameterName = "IsOverfitting";
+    private const string ResultsParameterName = "Results";
+
+    #region parameter properties
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<BoolValue> MaximizationParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> TrainingValidationQualityCorrelationParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[TrainingValidationCorrelationParameterName]; }
+    }
+    public ILookupParameter<DataTable> TrainingValidationQualityCorrelationTableParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[TrainingValidationCorrelationTableParameterName]; }
+    }
+    public IValueLookupParameter<DoubleValue> LowerCorrelationThresholdParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerCorrelationThresholdParameterName]; }
+    }
+    public IValueLookupParameter<DoubleValue> UpperCorrelationThresholdParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperCorrelationThresholdParameterName]; }
+    }
+    public ILookupParameter<BoolValue> OverfittingParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[OverfittingParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    #endregion
+    #region properties
+    public BoolValue Maximization {
+      get { return MaximizationParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private SymbolicRegressionOverfittingAnalyzer(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionOverfittingAnalyzer(SymbolicRegressionOverfittingAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SymbolicRegressionOverfittingAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "Training fitness"));
+      Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
+      Parameters.Add(new LookupParameter<DoubleValue>(TrainingValidationCorrelationParameterName, "Correlation of training and validation fitnesses"));
+      Parameters.Add(new LookupParameter<DataTable>(TrainingValidationCorrelationTableParameterName, "Data table of training and validation fitness correlation values over the whole run."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerCorrelationThresholdParameterName, "Lower threshold for correlation value that marks the boundary from non-overfitting to overfitting.", new DoubleValue(0.65)));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperCorrelationThresholdParameterName, "Upper threshold for correlation value that marks the boundary from overfitting to non-overfitting.", new DoubleValue(0.75)));
+      Parameters.Add(new LookupParameter<BoolValue>(OverfittingParameterName, "Boolean indicator for overfitting."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionOverfittingAnalyzer(this, cloner);
+    }
+
+    protected override void Analyze(SymbolicExpressionTree[] trees, double[] validationQuality) {
+      double[] trainingQuality = QualityParameter.ActualValue.Select(x => x.Value).ToArray();
+
+      double r = alglib.spearmancorr2(trainingQuality, validationQuality);
+
+      TrainingValidationQualityCorrelationParameter.ActualValue = new DoubleValue(r);
+
+      if (TrainingValidationQualityCorrelationTableParameter.ActualValue == null) {
+        var dataTable = new DataTable("Training and validation fitness correlation table", "Data table of training and validation fitness correlation values over the whole run.");
+        dataTable.Rows.Add(new DataRow("Training and validation fitness correlation", "Training and validation fitness correlation values"));
+        TrainingValidationQualityCorrelationTableParameter.ActualValue = dataTable;
+        ResultsParameter.ActualValue.Add(new Result(TrainingValidationCorrelationTableParameterName, dataTable));
+      }
+
+      TrainingValidationQualityCorrelationTableParameter.ActualValue.Rows["Training and validation fitness correlation"].Values.Add(r);
+
+      double correlationThreshold;
+      if (OverfittingParameter.ActualValue != null && OverfittingParameter.ActualValue.Value) {
+        // if is already overfitting => have to reach the upper threshold to switch back to non-overfitting state
+        correlationThreshold = UpperCorrelationThresholdParameter.ActualValue.Value;
+      } else {
+        // if currently in non-overfitting state => have to reach to lower threshold to switch to overfitting state
+        correlationThreshold = LowerCorrelationThresholdParameter.ActualValue.Value;
+      }
+      bool overfitting = r < correlationThreshold;
+
+      OverfittingParameter.ActualValue = new BoolValue(overfitting);
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -53,4 +54,7 @@
     }
 
+    [StorableConstructor]
+    private SymbolicRegressionSolutionLinearScaler(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionSolutionLinearScaler(SymbolicRegressionSolutionLinearScaler original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionSolutionLinearScaler()
       : base() {
@@ -59,4 +63,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>(AlphaParameterName, "Alpha parameter for linear transformation."));
       Parameters.Add(new LookupParameter<DoubleValue>(BetaParameterName, "Beta parameter for linear transformation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionSolutionLinearScaler(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionTournamentPruning.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionTournamentPruning.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionTournamentPruning.cs	(revision 5275)
@@ -33,4 +33,5 @@
 using System;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
@@ -192,4 +193,7 @@
     [StorableConstructor]
     protected SymbolicRegressionTournamentPruning(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionTournamentPruning(SymbolicRegressionTournamentPruning original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SymbolicRegressionTournamentPruning()
       : base() {
@@ -218,4 +222,8 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("RelativeNumberOfEvaluatedRows", new PercentValue(1.0)));
       Parameters.Add(new ValueLookupParameter<IntValue>("MinimalTreeSize", new IntValue(15)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionTournamentPruning(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionValidationAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionValidationAnalyzer.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionValidationAnalyzer.cs	(revision 5275)
@@ -0,0 +1,171 @@
+#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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
+  /// <summary>
+  /// A base class for operators that analyze the validation fitness of symbolic regression models.
+  /// </summary>
+  [Item("SymbolicRegressionValidationAnalyzer", "A base class for operators that analyze the validation fitness of symbolic regression models.")]
+  [StorableClass]
+  public abstract class SymbolicRegressionValidationAnalyzer : SingleSuccessorOperator {
+    private const string RandomParameterName = "Random";
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string ValidationSamplesStartParameterName = "SamplesStart";
+    private const string ValidationSamplesEndParameterName = "SamplesEnd";
+    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
+    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
+    private const string EvaluatorParameterName = "Evaluator";
+    private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples";
+
+    #region parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
+    }
+    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
+      get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
+    }
+    public ILookupParameter<ISymbolicRegressionEvaluator> EvaluatorParameter {
+      get { return (ILookupParameter<ISymbolicRegressionEvaluator>)Parameters[EvaluatorParameterName]; }
+    }
+    public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
+      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    public IValueLookupParameter<IntValue> ValidationSamplesStartParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesStartParameterName]; }
+    }
+    public IValueLookupParameter<IntValue> ValidationSamplesEndParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesEndParameterName]; }
+    }
+    public IValueParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter {
+      get { return (IValueParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; }
+    }
+
+    public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
+    }
+    public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
+    }
+    #endregion
+    #region properties
+    public IRandom Random {
+      get { return RandomParameter.ActualValue; }
+    }
+    public ItemArray<SymbolicExpressionTree> SymbolicExpressionTree {
+      get { return SymbolicExpressionTreeParameter.ActualValue; }
+    }
+    public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
+      get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; }
+    }
+    public ISymbolicRegressionEvaluator Evaluator {
+      get { return EvaluatorParameter.ActualValue; }
+    }
+    public DataAnalysisProblemData ProblemData {
+      get { return ProblemDataParameter.ActualValue; }
+    }
+    public IntValue ValidiationSamplesStart {
+      get { return ValidationSamplesStartParameter.ActualValue; }
+    }
+    public IntValue ValidationSamplesEnd {
+      get { return ValidationSamplesEndParameter.ActualValue; }
+    }
+    public PercentValue RelativeNumberOfEvaluatedSamples {
+      get { return RelativeNumberOfEvaluatedSamplesParameter.Value; }
+    }
+
+    public DoubleValue UpperEstimationLimit {
+      get { return UpperEstimationLimitParameter.ActualValue; }
+    }
+    public DoubleValue LowerEstimationLimit {
+      get { return LowerEstimationLimitParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected SymbolicRegressionValidationAnalyzer(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionValidationAnalyzer(SymbolicRegressionValidationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SymbolicRegressionValidationAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use."));
+      Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set."));
+      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
+      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
+      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
+      Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesStartParameterName, "The first index of the validation partition of the data set."));
+      Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesEndParameterName, "The last index of the validation partition of the data set."));
+      Parameters.Add(new ValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index.", new PercentValue(1)));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public override IOperation Apply() {
+      var trees = SymbolicExpressionTree.ToArray();
+
+      string targetVariable = ProblemData.TargetVariable.Value;
+
+      // select a random subset of rows in the validation set
+      int validationStart = ValidiationSamplesStart.Value;
+      int validationEnd = ValidationSamplesEnd.Value;
+      int seed = Random.Next();
+      int count = (int)((validationEnd - validationStart) * RelativeNumberOfEvaluatedSamples.Value);
+      if (count == 0) count = 1;
+      IEnumerable<int> rows = RandomEnumerable.SampleRandomNumbers(seed, validationStart, validationEnd, count)
+        .Where(row => row < ProblemData.TestSamplesStart.Value || ProblemData.TestSamplesEnd.Value <= row);
+
+      double upperEstimationLimit = UpperEstimationLimit != null ? UpperEstimationLimit.Value : double.PositiveInfinity;
+      double lowerEstimationLimit = LowerEstimationLimit != null ? LowerEstimationLimit.Value : double.NegativeInfinity;
+
+      double[] validationQuality = new double[trees.Count()];
+      for (int i = 0; i < validationQuality.Length; i++) {
+        validationQuality[i] = Evaluator.Evaluate(SymbolicExpressionTreeInterpreter, trees[i],
+            lowerEstimationLimit, upperEstimationLimit,
+            ProblemData.Dataset, targetVariable,
+           rows);
+      }
+
+      Analyze(trees, validationQuality);
+      return base.Apply();
+    }
+
+    protected abstract void Analyze(SymbolicExpressionTree[] trees, double[] validationQuality);
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionVariableFrequencyAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionVariableFrequencyAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionVariableFrequencyAnalyzer.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
@@ -60,4 +61,7 @@
     #endregion
 
+    [StorableConstructor]
+    private SymbolicRegressionVariableFrequencyAnalyzer(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionVariableFrequencyAnalyzer(SymbolicRegressionVariableFrequencyAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionVariableFrequencyAnalyzer()
       : base() {
@@ -68,15 +72,24 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionVariableFrequencyAnalyzer(this, cloner);
+    }
+
     public override IOperation Apply() {
       ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue;
       DataAnalysisProblemData problemData = ProblemDataParameter.ActualValue;
-      var inputVariables = problemData.InputVariables.Select(x => x.Value);
+      var inputVariables = problemData.InputVariables.CheckedItems.Select(x => x.Value.Value);
       ResultCollection results = ResultsParameter.ActualValue;
 
       if (VariableFrequencies == null) {
         VariableFrequencies = new DataTable("Variable frequencies", "Relative frequency of variable references aggregated over the whole population.");
+        VariableFrequencies.VisualProperties.XAxisTitle = "Generation";
+        VariableFrequencies.VisualProperties.YAxisTitle = "Relative Variable Frequency";
         // add a data row for each input variable
-        foreach (var inputVariable in inputVariables)
-          VariableFrequencies.Rows.Add(new DataRow(inputVariable));
+        foreach (var inputVariable in inputVariables) {
+          DataRow row = new DataRow(inputVariable);
+          row.VisualProperties.StartIndexZero = true;
+          VariableFrequencies.Rows.Add(row);
+        }
         results.Add(new Result("Variable frequencies", VariableFrequencies));
       }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/TrainingBestScaledSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/TrainingBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/TrainingBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -0,0 +1,378 @@
+#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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
+
+namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
+  /// <summary>
+  /// An operator that analyzes the training best scaled symbolic regression solution.
+  /// </summary>
+  [Item("TrainingBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the training best scaled symbolic regression solution.")]
+  [StorableClass]
+  public sealed class TrainingBestScaledSymbolicRegressionSolutionAnalyzer : SingleSuccessorOperator, ISymbolicRegressionAnalyzer {
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string QualityParameterName = "Quality";
+    private const string MaximizationParameterName = "Maximization";
+    private const string CalculateSolutionComplexityParameterName = "CalculateSolutionComplexity";
+    private const string CalculateSolutionAccuracyParameterName = "CalculateSolutionAccuracy";
+    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
+    private const string ProblemDataParameterName = "DataAnalysisProblemData";
+    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
+    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
+    private const string BestSolutionParameterName = "Best training solution";
+    private const string BestSolutionQualityParameterName = "Best training solution quality";
+    private const string BestSolutionLengthParameterName = "Best training solution length";
+    private const string BestSolutionHeightParameterName = "Best training solution height";
+    private const string BestSolutionVariablesParameterName = "Best training solution variables";
+    private const string BestSolutionTrainingRSquaredParameterName = "Best training solution R² (training)";
+    private const string BestSolutionTestRSquaredParameterName = "Best training solution R² (test)";
+    private const string BestSolutionTrainingMseParameterName = "Best training solution mean squared error (training)";
+    private const string BestSolutionTestMseParameterName = "Best training solution mean squared error (test)";
+    private const string BestSolutionTrainingRelativeErrorParameterName = "Best training solution relative error (training)";
+    private const string BestSolutionTestRelativeErrorParameterName = "Best training solution relative error (test)";
+    private const string ResultsParameterName = "Results";
+
+    #region parameter properties
+    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<BoolValue> MaximizationParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; }
+    }
+    public IValueParameter<BoolValue> CalculateSolutionComplexityParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[CalculateSolutionComplexityParameterName]; }
+    }
+    public IValueParameter<BoolValue> CalculateSolutionAccuracyParameter {
+      get { return (IValueParameter<BoolValue>)Parameters[CalculateSolutionAccuracyParameterName]; }
+    }
+    public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
+      get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
+    }
+    public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
+      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
+    }
+    public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
+    }
+
+    public ILookupParameter<SymbolicRegressionSolution> BestSolutionParameter {
+      get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters[BestSolutionParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionQualityParameterName]; }
+    }
+    public ILookupParameter<IntValue> BestSolutionLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionLengthParameterName]; }
+    }
+    public ILookupParameter<IntValue> BestSolutionHeightParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionHeightParameterName]; }
+    }
+    public ILookupParameter<IntValue> BestSolutionVariablesParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionVariablesParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTrainingRSquaredParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTrainingRSquaredParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTestRSquaredParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTestRSquaredParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTrainingMseParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTrainingMseParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTestMseParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTestMseParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTrainingRelativeErrorParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTrainingRelativeErrorParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> BestSolutionTestRelativeErrorParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionTestRelativeErrorParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+    #endregion
+    #region properties
+    public ItemArray<SymbolicExpressionTree> SymbolicExpressionTree {
+      get { return SymbolicExpressionTreeParameter.ActualValue; }
+    }
+    public ItemArray<DoubleValue> Quality {
+      get { return QualityParameter.ActualValue; }
+    }
+    public BoolValue Maximization {
+      get { return MaximizationParameter.ActualValue; }
+    }
+    public BoolValue CalculateSolutionComplexity {
+      get { return CalculateSolutionComplexityParameter.Value; }
+      set { CalculateSolutionComplexityParameter.Value = value; }
+    }
+    public BoolValue CalculateSolutionAccuracy {
+      get { return CalculateSolutionAccuracyParameter.Value; }
+      set { CalculateSolutionAccuracyParameter.Value = value; }
+    }
+    public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
+      get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; }
+    }
+    public DataAnalysisProblemData ProblemData {
+      get { return ProblemDataParameter.ActualValue; }
+    }
+    public DoubleValue UpperEstimationLimit {
+      get { return UpperEstimationLimitParameter.ActualValue; }
+    }
+    public DoubleValue LowerEstimationLimit {
+      get { return LowerEstimationLimitParameter.ActualValue; }
+    }
+    public ResultCollection Results {
+      get { return ResultsParameter.ActualValue; }
+    }
+    public SymbolicRegressionSolution BestSolution {
+      get { return BestSolutionParameter.ActualValue; }
+      set { BestSolutionParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionQuality {
+      get { return BestSolutionQualityParameter.ActualValue; }
+      set { BestSolutionQualityParameter.ActualValue = value; }
+    }
+    public IntValue BestSolutionLength {
+      get { return BestSolutionLengthParameter.ActualValue; }
+      set { BestSolutionLengthParameter.ActualValue = value; }
+    }
+    public IntValue BestSolutionHeight {
+      get { return BestSolutionHeightParameter.ActualValue; }
+      set { BestSolutionHeightParameter.ActualValue = value; }
+    }
+    public IntValue BestSolutionVariables {
+      get { return BestSolutionVariablesParameter.ActualValue; }
+      set { BestSolutionVariablesParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTrainingRSquared {
+      get { return BestSolutionTrainingRSquaredParameter.ActualValue; }
+      set { BestSolutionTrainingRSquaredParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTestRSquared {
+      get { return BestSolutionTestRSquaredParameter.ActualValue; }
+      set { BestSolutionTestRSquaredParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTrainingMse {
+      get { return BestSolutionTrainingMseParameter.ActualValue; }
+      set { BestSolutionTrainingMseParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTestMse {
+      get { return BestSolutionTestMseParameter.ActualValue; }
+      set { BestSolutionTestMseParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTrainingRelativeError {
+      get { return BestSolutionTrainingRelativeErrorParameter.ActualValue; }
+      set { BestSolutionTrainingRelativeErrorParameter.ActualValue = value; }
+    }
+    public DoubleValue BestSolutionTestRelativeError {
+      get { return BestSolutionTestRelativeErrorParameter.ActualValue; }
+      set { BestSolutionTestRelativeErrorParameter.ActualValue = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private TrainingBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private TrainingBestScaledSymbolicRegressionSolutionAnalyzer(TrainingBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public TrainingBestScaledSymbolicRegressionSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
+      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The qualities of the symbolic expression trees to analyze."));
+      Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionComplexityParameterName, "Determines if the length and height of the training best solution should be calculated.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionAccuracyParameterName, "Determines if the accuracy of the training best solution on the training and test set should be calculated.", new BoolValue(false)));
+      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
+      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
+      Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestSolutionParameterName, "The best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameterName, "The quality of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<IntValue>(BestSolutionLengthParameterName, "The length of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<IntValue>(BestSolutionHeightParameterName, "The height of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<IntValue>(BestSolutionVariablesParameterName, "The number of variables used by the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTrainingRSquaredParameterName, "The R² value on the training set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTestRSquaredParameterName, "The R² value on the test set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTrainingMseParameterName, "The mean squared error on the training set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTestMseParameterName, "The mean squared error value on the test set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTrainingRelativeErrorParameterName, "The relative error on the training set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionTestRelativeErrorParameterName, "The relative error value on the test set of the best symbolic regression solution."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TrainingBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public override IOperation Apply() {
+      #region find best tree
+      double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity;
+      SymbolicExpressionTree bestTree = null;
+      SymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray();
+      double[] quality = Quality.Select(x => x.Value).ToArray();
+      for (int i = 0; i < tree.Length; i++) {
+        if ((Maximization.Value && quality[i] > bestQuality) ||
+            (!Maximization.Value && quality[i] < bestQuality)) {
+          bestQuality = quality[i];
+          bestTree = tree[i];
+        }
+      }
+      #endregion
+
+      #region update best solution
+      // if the best tree is better than the current best solution => update
+      bool newBest =
+        BestSolutionQuality == null ||
+        (Maximization.Value && bestQuality > BestSolutionQuality.Value) ||
+        (!Maximization.Value && bestQuality < BestSolutionQuality.Value);
+      if (newBest) {
+        double lowerEstimationLimit = LowerEstimationLimit.Value;
+        double upperEstimationLimit = UpperEstimationLimit.Value;
+        string targetVariable = ProblemData.TargetVariable.Value;
+
+        // calculate scaling parameters and only for the best tree using the full training set
+        double alpha, beta;
+        SymbolicRegressionScaledMeanSquaredErrorEvaluator.Calculate(SymbolicExpressionTreeInterpreter, bestTree,
+          lowerEstimationLimit, upperEstimationLimit,
+          ProblemData.Dataset, targetVariable,
+          ProblemData.TrainingIndizes, out beta, out alpha);
+
+        // scale tree for solution
+        var scaledTree = SymbolicRegressionSolutionLinearScaler.Scale(bestTree, alpha, beta);
+        var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
+          scaledTree);
+        var solution = new SymbolicRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(), model, lowerEstimationLimit, upperEstimationLimit);
+        solution.Name = BestSolutionParameterName;
+        solution.Description = "Best solution on training partition found over the whole run.";
+
+        BestSolution = solution;
+        BestSolutionQuality = new DoubleValue(bestQuality);
+
+        if (CalculateSolutionComplexity.Value) {
+          BestSolutionLength = new IntValue(solution.Model.SymbolicExpressionTree.Size);
+          BestSolutionHeight = new IntValue(solution.Model.SymbolicExpressionTree.Height);
+          BestSolutionVariables = new IntValue(solution.Model.InputVariables.Count());
+          if (!Results.ContainsKey(BestSolutionLengthParameterName)) {
+            Results.Add(new Result(BestSolutionLengthParameterName, "Length of the best solution on the training set.", BestSolutionLength));
+            Results.Add(new Result(BestSolutionHeightParameterName, "Height of the best solution on the training set.", BestSolutionHeight));
+            Results.Add(new Result(BestSolutionVariablesParameterName, "Number of variables used by the best solution on the training set.", BestSolutionVariables));
+          } else {
+            Results[BestSolutionLengthParameterName].Value = BestSolutionLength;
+            Results[BestSolutionHeightParameterName].Value = BestSolutionHeight;
+            Results[BestSolutionVariablesParameterName].Value = BestSolutionVariables;
+          }
+        }
+
+        if (CalculateSolutionAccuracy.Value) {
+          #region update R2,MSE, Rel Error
+          IEnumerable<double> trainingValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable.Value, ProblemData.TrainingIndizes);
+          IEnumerable<double> testValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable.Value, ProblemData.TestIndizes);
+          OnlineMeanSquaredErrorEvaluator mseEvaluator = new OnlineMeanSquaredErrorEvaluator();
+          OnlineMeanAbsolutePercentageErrorEvaluator relErrorEvaluator = new OnlineMeanAbsolutePercentageErrorEvaluator();
+          OnlinePearsonsRSquaredEvaluator r2Evaluator = new OnlinePearsonsRSquaredEvaluator();
+
+          #region training
+          var originalEnumerator = trainingValues.GetEnumerator();
+          var estimatedEnumerator = solution.EstimatedTrainingValues.GetEnumerator();
+          while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
+            mseEvaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+            r2Evaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+            relErrorEvaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+          }
+          double trainingR2 = r2Evaluator.RSquared;
+          double trainingMse = mseEvaluator.MeanSquaredError;
+          double trainingRelError = relErrorEvaluator.MeanAbsolutePercentageError;
+          #endregion
+
+          mseEvaluator.Reset();
+          relErrorEvaluator.Reset();
+          r2Evaluator.Reset();
+
+          #region test
+          originalEnumerator = testValues.GetEnumerator();
+          estimatedEnumerator = solution.EstimatedTestValues.GetEnumerator();
+          while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
+            mseEvaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+            r2Evaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+            relErrorEvaluator.Add(originalEnumerator.Current, estimatedEnumerator.Current);
+          }
+          double testR2 = r2Evaluator.RSquared;
+          double testMse = mseEvaluator.MeanSquaredError;
+          double testRelError = relErrorEvaluator.MeanAbsolutePercentageError;
+          #endregion
+          BestSolutionTrainingRSquared = new DoubleValue(trainingR2);
+          BestSolutionTestRSquared = new DoubleValue(testR2);
+          BestSolutionTrainingMse = new DoubleValue(trainingMse);
+          BestSolutionTestMse = new DoubleValue(testMse);
+          BestSolutionTrainingRelativeError = new DoubleValue(trainingRelError);
+          BestSolutionTestRelativeError = new DoubleValue(testRelError);
+
+          if (!Results.ContainsKey(BestSolutionTrainingRSquaredParameterName)) {
+            Results.Add(new Result(BestSolutionTrainingRSquaredParameterName, BestSolutionTrainingRSquared));
+            Results.Add(new Result(BestSolutionTestRSquaredParameterName, BestSolutionTestRSquared));
+            Results.Add(new Result(BestSolutionTrainingMseParameterName, BestSolutionTrainingMse));
+            Results.Add(new Result(BestSolutionTestMseParameterName, BestSolutionTestMse));
+            Results.Add(new Result(BestSolutionTrainingRelativeErrorParameterName, BestSolutionTrainingRelativeError));
+            Results.Add(new Result(BestSolutionTestRelativeErrorParameterName, BestSolutionTestRelativeError));
+          } else {
+            Results[BestSolutionTrainingRSquaredParameterName].Value = BestSolutionTrainingRSquared;
+            Results[BestSolutionTestRSquaredParameterName].Value = BestSolutionTestRSquared;
+            Results[BestSolutionTrainingMseParameterName].Value = BestSolutionTrainingMse;
+            Results[BestSolutionTestMseParameterName].Value = BestSolutionTestMse;
+            Results[BestSolutionTrainingRelativeErrorParameterName].Value = BestSolutionTrainingRelativeError;
+            Results[BestSolutionTestRelativeErrorParameterName].Value = BestSolutionTestRelativeError;
+          }
+          #endregion
+        }
+
+        if (!Results.ContainsKey(BestSolutionQualityParameterName)) {
+          Results.Add(new Result(BestSolutionQualityParameterName, BestSolutionQuality));
+          Results.Add(new Result(BestSolutionParameterName, BestSolution));
+        } else {
+          Results[BestSolutionQualityParameterName].Value = BestSolutionQuality;
+          Results[BestSolutionParameterName].Value = BestSolution;
+        }
+      }
+      #endregion
+      return base.Apply();
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs	(revision 5275)
@@ -39,4 +39,5 @@
   [Item("ValidationBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the validation best scaled symbolic regression solution.")]
   [StorableClass]
+  [Obsolete("This class should not be used anymore because of performance reasons and will therefore not be updated.")]
   public sealed class ValidationBestScaledSymbolicRegressionSolutionAnalyzer : AlgorithmOperator, ISymbolicRegressionAnalyzer {
     private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
@@ -134,4 +135,10 @@
     private ResultsCollector resultsCollector;
 
+    [StorableConstructor]
+    private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(ValidationBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      Initialize();
+    }
     public ValidationBestScaledSymbolicRegressionSolutionAnalyzer()
       : base() {
@@ -248,17 +255,16 @@
     }
 
-    [StorableConstructor]
-    private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValidationBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
     private void Initialize() {
       SymbolicExpressionTreeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeParameter_DepthChanged);
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ValidationBestScaledSymbolicRegressionSolutionAnalyzer clone = (ValidationBestScaledSymbolicRegressionSolutionAnalyzer)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
-    }
 
     private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionEvaluator.cs	(revision 5275)
@@ -20,6 +20,7 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -102,4 +103,7 @@
     #endregion
 
+    [StorableConstructor]
+    protected MultiObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveSymbolicRegressionEvaluator(MultiObjectiveSymbolicRegressionEvaluator original, Cloner cloner) : base(original, cloner) { }
     public MultiObjectiveSymbolicRegressionEvaluator()
       : base() {
@@ -114,13 +118,8 @@
     }
 
-    [StorableConstructor]
-    protected MultiObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
-    [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-    }
-
     public override IOperation Apply() {
       int seed = Random.Next();
-      IEnumerable<int> rows = SingleObjectiveSymbolicRegressionEvaluator.GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value);
+      IEnumerable<int> rows = SingleObjectiveSymbolicRegressionEvaluator.GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value)
+         .Where(i => i < RegressionProblemData.TestSamplesStart.Value || RegressionProblemData.TestSamplesEnd.Value <= i);
       double[] qualities = Evaluate(SymbolicExpressionTreeInterpreter, SymbolicExpressionTree, RegressionProblemData.Dataset,
         RegressionProblemData.TargetVariable, rows);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator.cs	(revision 5275)
@@ -20,6 +20,6 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -27,5 +27,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
@@ -34,5 +33,5 @@
   [Item("MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator", "Calculates the mean squared error and the number of variables of a symbolic regression solution.")]
   [StorableClass]
-  public class MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
+  public sealed class MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
     private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
     private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
@@ -54,8 +53,17 @@
     }
     #endregion
+    [StorableConstructor]
+    private MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
+    private MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator()
       : base() {
       Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper limit that should be used as cut off value for the output values of symbolic expression trees."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator.cs	(revision 5275)
@@ -20,6 +20,6 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -27,5 +27,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
@@ -34,5 +33,5 @@
   [Item("MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator", "Calculates the correlation coefficient r² and the number of variables of a symbolic regression solution.")]
   [StorableClass]
-  public class MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
+  public sealed class MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
     private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
     private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
@@ -54,8 +53,17 @@
     }
     #endregion
+    [StorableConstructor]
+    private MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(bool deserializing) : base(deserializing) { }
+    private MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator()
       : base() {
       Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper limit that should be used as cut off value for the output values of symbolic expression trees."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicRegressionEvaluator.cs	(revision 5275)
@@ -22,4 +22,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -114,4 +116,9 @@
     #endregion
 
+    [StorableConstructor]
+    protected SingleObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveSymbolicRegressionEvaluator(SingleObjectiveSymbolicRegressionEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SingleObjectiveSymbolicRegressionEvaluator()
       : base() {
@@ -128,6 +135,5 @@
     }
 
-    [StorableConstructor]
-    protected SingleObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
+
     [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
     private void AfterDeserialization() {
@@ -140,5 +146,6 @@
     public override IOperation Apply() {
       int seed = Random.Next();
-      IEnumerable<int> rows = GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value);
+      IEnumerable<int> rows = GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value)
+          .Where(i => i < RegressionProblemData.TestSamplesStart.Value || RegressionProblemData.TestSamplesEnd.Value <= i);
       double quality = Evaluate(SymbolicExpressionTreeInterpreter, SymbolicExpressionTree, LowerEstimationLimit.Value, UpperEstimationLimit.Value,
         RegressionProblemData.Dataset,
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionMeanSquaredErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionMeanSquaredErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionMeanSquaredErrorEvaluator.cs	(revision 5275)
@@ -22,8 +22,7 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
@@ -35,6 +34,13 @@
   public class SymbolicRegressionMeanSquaredErrorEvaluator : SingleObjectiveSymbolicRegressionEvaluator {
 
-    public SymbolicRegressionMeanSquaredErrorEvaluator()
-      : base() {
+    [StorableConstructor]
+    protected SymbolicRegressionMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionMeanSquaredErrorEvaluator(SymbolicRegressionMeanSquaredErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SymbolicRegressionMeanSquaredErrorEvaluator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionMeanSquaredErrorEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionPearsonsRSquaredEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionPearsonsRSquaredEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionPearsonsRSquaredEvaluator.cs	(revision 5275)
@@ -22,8 +22,7 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
@@ -34,11 +33,17 @@
   [StorableClass]
   public class SymbolicRegressionPearsonsRSquaredEvaluator : SingleObjectiveSymbolicRegressionEvaluator {
-    public SymbolicRegressionPearsonsRSquaredEvaluator()
-      : base() {
+    [StorableConstructor]
+    protected SymbolicRegressionPearsonsRSquaredEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionPearsonsRSquaredEvaluator(SymbolicRegressionPearsonsRSquaredEvaluator original, Cloner cloner)
+      : base(original, cloner) {
     }
+    public SymbolicRegressionPearsonsRSquaredEvaluator() : base() { }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionPearsonsRSquaredEvaluator(this, cloner);
+    }
     public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
-      double r2 = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows);
-      return r2;
+      double mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows);
+      return mse;
     }
 
@@ -54,5 +59,5 @@
         double original = originalEnumerator.Current;
         if (double.IsNaN(estimated))
-          return 0.0;
+          estimated = upperEstimationLimit;
         else
           estimated = Math.Min(upperEstimationLimit, Math.Max(lowerEstimationLimit, estimated));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs	(revision 5275)
@@ -34,5 +34,5 @@
   [Item("SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator", "Calculates the mean and the variance of the squared errors of a linearly scaled symbolic regression solution.")]
   [StorableClass]
-  public class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
+  public sealed class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
     private const string QualityVarianceParameterName = "QualityVariance";
     private const string QualitySamplesParameterName = "QualitySamples";
@@ -90,4 +90,7 @@
     }
     #endregion
+    [StorableConstructor]
+    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator()
       : base() {
@@ -102,4 +105,8 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(this, cloner);
+    }
+
     public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
       double alpha, beta;
@@ -108,16 +115,24 @@
       double bias, variance, covariance;
       double mse;
-      if (ApplyScaling.Value) {
-        mse = Calculate(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
-        Alpha = new DoubleValue(alpha);
-        Beta = new DoubleValue(beta);
+      if (ExecutionContext != null) {
+        if (ApplyScaling.Value) {
+          mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
+          Alpha = new DoubleValue(alpha);
+          Beta = new DoubleValue(beta);
+        } else {
+          mse = CalculateWithScaling(interpreter, solution,lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
+        }
+        QualityVariance = new DoubleValue(varianceSE);
+        QualitySamples = new IntValue(count);
+        DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE);
+        DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE);
+        DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE);
       } else {
-        mse = CalculateWithScaling(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
-      }
-      QualityVariance = new DoubleValue(varianceSE);
-      QualitySamples = new IntValue(count);
-      DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE);
-      DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE);
-      DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE);
+        if (ApplyScalingParameter.Value != null && ApplyScalingParameter.Value.Value)
+          mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
+        else
+          mse = CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
+      }
+
       return mse;
     }
@@ -126,5 +141,5 @@
       IEnumerable<double> originalValues = dataset.GetEnumeratedVariableValues(targetVariable, rows);
       IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, dataset, rows);
-      SymbolicRegressionScaledMeanSquaredErrorEvaluator.CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
+      CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
 
       return CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, beta, alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
@@ -174,4 +189,48 @@
       }
     }
+
+    /// <summary>
+    /// Calculates linear scaling parameters in one pass.
+    /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer.
+    /// http://www.springerlink.com/content/x035121165125175/
+    /// </summary>
+    public static void CalculateScalingParameters(IEnumerable<double> original, IEnumerable<double> estimated, out double beta, out double alpha) {
+      IEnumerator<double> originalEnumerator = original.GetEnumerator();
+      IEnumerator<double> estimatedEnumerator = estimated.GetEnumerator();
+      OnlineMeanAndVarianceCalculator yVarianceCalculator = new OnlineMeanAndVarianceCalculator();
+      OnlineMeanAndVarianceCalculator tMeanCalculator = new OnlineMeanAndVarianceCalculator();
+      OnlineCovarianceEvaluator ytCovarianceEvaluator = new OnlineCovarianceEvaluator();
+      int cnt = 0;
+
+      while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
+        double y = estimatedEnumerator.Current;
+        double t = originalEnumerator.Current;
+        if (IsValidValue(t) && IsValidValue(y)) {
+          tMeanCalculator.Add(t);
+          yVarianceCalculator.Add(y);
+          ytCovarianceEvaluator.Add(y, t);
+
+          cnt++;
+        }
+      }
+
+      if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())
+        throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match.");
+      if (cnt < 2) {
+        alpha = 0;
+        beta = 1;
+      } else {
+        if (yVarianceCalculator.Variance.IsAlmost(0.0))
+          beta = 1;
+        else
+          beta = ytCovarianceEvaluator.Covariance / yVarianceCalculator.Variance;
+
+        alpha = tMeanCalculator.Mean - beta * yVarianceCalculator.Mean;
+      }
+    }
+
+    private static bool IsValidValue(double d) {
+      return !double.IsInfinity(d) && !double.IsNaN(d) && d > -1.0E07 && d < 1.0E07;  // don't consider very large or very small values for scaling
+    }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanSquaredErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanSquaredErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanSquaredErrorEvaluator.cs	(revision 5275)
@@ -34,5 +34,5 @@
   [Item("SymbolicRegressionScaledMeanSquaredErrorEvaluator", "Calculates the mean squared error of a linearly scaled symbolic regression solution.")]
   [StorableClass]
-  public class SymbolicRegressionScaledMeanSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
+  public sealed class SymbolicRegressionScaledMeanSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
 
     #region parameter properties
@@ -54,4 +54,7 @@
     }
     #endregion
+    [StorableConstructor]
+    private SymbolicRegressionScaledMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionScaledMeanSquaredErrorEvaluator(SymbolicRegressionScaledMeanSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicRegressionScaledMeanSquaredErrorEvaluator()
       : base() {
@@ -60,9 +63,15 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionScaledMeanSquaredErrorEvaluator(this, cloner);
+    }
+
     public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
       double alpha, beta;
       double mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha);
-      AlphaParameter.ActualValue = new DoubleValue(alpha);
-      BetaParameter.ActualValue = new DoubleValue(beta);
+      if (ExecutionContext != null) {
+        AlphaParameter.ActualValue = new DoubleValue(alpha);
+        BetaParameter.ActualValue = new DoubleValue(beta);
+      }
       return mse;
     }
@@ -100,8 +109,16 @@
     }
 
+    /// <summary>
+    /// Calculates linear scaling parameters in one pass.
+    /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer.
+    /// http://www.springerlink.com/content/x035121165125175/
+    /// </summary>
     public static void CalculateScalingParameters(IEnumerable<double> original, IEnumerable<double> estimated, out double beta, out double alpha) {
       IEnumerator<double> originalEnumerator = original.GetEnumerator();
       IEnumerator<double> estimatedEnumerator = estimated.GetEnumerator();
-      OnlineLinearScalingCalculator linearScalingCalculator = new OnlineLinearScalingCalculator();
+      OnlineMeanAndVarianceCalculator yVarianceCalculator = new OnlineMeanAndVarianceCalculator();
+      OnlineMeanAndVarianceCalculator tMeanCalculator = new OnlineMeanAndVarianceCalculator();
+      OnlineCovarianceEvaluator ytCovarianceEvaluator = new OnlineCovarianceEvaluator();
+      int cnt = 0;
 
       while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
@@ -109,5 +126,9 @@
         double t = originalEnumerator.Current;
         if (IsValidValue(t) && IsValidValue(y)) {
-          linearScalingCalculator.Add(t, y);
+          tMeanCalculator.Add(t);
+          yVarianceCalculator.Add(y);
+          ytCovarianceEvaluator.Add(y, t);
+
+          cnt++;
         }
       }
@@ -115,7 +136,14 @@
       if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())
         throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match.");
-      else {
-        beta = linearScalingCalculator.Beta;
-        alpha = linearScalingCalculator.Alpha;
+      if (cnt < 2) {
+        alpha = 0;
+        beta = 1;
+      } else {
+        if (yVarianceCalculator.PopulationVariance.IsAlmost(0.0))
+          beta = 1;
+        else
+          beta = ytCovarianceEvaluator.Covariance / yVarianceCalculator.PopulationVariance;
+
+        alpha = tMeanCalculator.Mean - beta * yVarianceCalculator.Mean;
       }
     }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Interfaces/ISymbolicRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Interfaces/ISymbolicRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Interfaces/ISymbolicRegressionEvaluator.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -25,5 +26,4 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/MultiObjectiveSymbolicRegressionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/MultiObjectiveSymbolicRegressionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/MultiObjectiveSymbolicRegressionProblem.cs	(revision 5275)
@@ -21,19 +21,10 @@
 
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Analyzers;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Interfaces;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers;
-using HeuristicLab.Problems.DataAnalysis.Symbolic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
@@ -71,7 +62,11 @@
     #endregion
 
-
     [StorableConstructor]
     protected MultiObjectiveSymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveSymbolicRegressionProblem(MultiObjectiveSymbolicRegressionProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
     public MultiObjectiveSymbolicRegressionProblem()
       : base() {
@@ -89,8 +84,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MultiObjectiveSymbolicRegressionProblem clone = (MultiObjectiveSymbolicRegressionProblem)base.Clone(cloner);
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new MultiObjectiveSymbolicRegressionProblem(this, cloner);
     }
 
@@ -112,5 +104,6 @@
     }
 
-    protected virtual void OnEvaluatorChanged(EventArgs e) {
+    protected override void OnEvaluatorChanged(EventArgs e) {
+      base.OnEvaluatorChanged(e);
       ParameterizeEvaluator();
       RaiseEvaluatorChanged(e);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SimpleSymbolicRegressionEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SimpleSymbolicRegressionEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SimpleSymbolicRegressionEvaluator.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,5 +34,5 @@
   [Item("SimpleSymbolicRegressionEvaluator", "Evaluates a symbolic regression solution and outputs a matrix of target and estimated values.")]
   [StorableClass]
-  public class SimpleSymbolicRegressionEvaluator : SingleSuccessorOperator {
+  public sealed class SimpleSymbolicRegressionEvaluator : SingleSuccessorOperator {
     private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
     private const string FunctionTreeParameterName = "FunctionTree";
@@ -100,4 +101,7 @@
     #endregion
 
+    [StorableConstructor]
+    private SimpleSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
+    private SimpleSymbolicRegressionEvaluator(SimpleSymbolicRegressionEvaluator original, Cloner cloner) : base(original, cloner) { }
     public SimpleSymbolicRegressionEvaluator()
       : base() {
@@ -110,4 +114,8 @@
       Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
       Parameters.Add(new LookupParameter<DoubleMatrix>(ValuesParameterName, "The matrix of target and estimated values as generated by the symbolic regression solution."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleSymbolicRegressionEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 5275)
@@ -32,10 +32,14 @@
   [StorableClass]
   [Item("SymbolicRegressionModel", "A symbolic regression model represents an entity that provides estimated values based on input values.")]
-  public class SymbolicRegressionModel : NamedItem, IDataAnalysisModel {
-    private SymbolicRegressionModel() : base() { } // for cloning
+  public sealed class SymbolicRegressionModel : NamedItem, IDataAnalysisModel {
     [StorableConstructor]
-    protected SymbolicRegressionModel(bool deserializing)
-      : base(deserializing) {
+    private SymbolicRegressionModel(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionModel(SymbolicRegressionModel original, Cloner cloner)
+      : base(original, cloner) {
+      tree = (SymbolicExpressionTree)cloner.Clone(original.tree);
+      interpreter = (ISymbolicExpressionTreeInterpreter)cloner.Clone(original.interpreter);
+      inputVariables = new List<string>(original.inputVariables);
     }
+
     public SymbolicRegressionModel(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree tree)
       : base() {
@@ -43,4 +47,14 @@
       this.interpreter = interpreter;
       this.inputVariables = tree.IterateNodesPrefix().OfType<VariableTreeNode>().Select(var => var.VariableName).Distinct().ToList();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionModel(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (inputVariables == null)
+        this.inputVariables = tree.IterateNodesPrefix().OfType<VariableTreeNode>().Select(var => var.VariableName).Distinct().ToList();
     }
 
@@ -62,13 +76,8 @@
 
     public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, int start, int end) {
-      return interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(start, end - start));
+      return GetEstimatedValues(problemData, Enumerable.Range(start, end - start));
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      var clone = (SymbolicRegressionModel)base.Clone(cloner);
-      clone.tree = (SymbolicExpressionTree)cloner.Clone(tree);
-      clone.interpreter = (ISymbolicExpressionTreeInterpreter)cloner.Clone(interpreter);
-      clone.inputVariables = new List<string>(inputVariables);
-      return clone;
+    public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, IEnumerable<int> rows) {
+      return interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs	(revision 5275)
@@ -34,5 +34,5 @@
   [Creatable("Problems")]
   [StorableClass]
-  public class SymbolicRegressionProblem : SymbolicRegressionProblemBase, ISingleObjectiveProblem {
+  public sealed class SymbolicRegressionProblem : SymbolicRegressionProblemBase, ISingleObjectiveDataAnalysisProblem {
 
     #region Parameter Properties
@@ -74,5 +74,11 @@
 
     [StorableConstructor]
-    protected SymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
+    private SymbolicRegressionProblem(SymbolicRegressionProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
+
     public SymbolicRegressionProblem()
       : base() {
@@ -81,6 +87,4 @@
       Parameters.Add(new ValueParameter<ISymbolicRegressionEvaluator>("Evaluator", "The operator which should be used to evaluate symbolic regression solutions.", evaluator));
       Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The minimal error value that reached by symbolic regression solutions for the problem."));
-
-      evaluator.QualityParameter.ActualName = "TrainingPearsonR2";
 
       InitializeOperators();
@@ -92,8 +96,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicRegressionProblem clone = (SymbolicRegressionProblem)base.Clone(cloner);
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new SymbolicRegressionProblem(this, cloner);
     }
 
@@ -146,4 +147,5 @@
     private void InitializeOperators() {
       AddOperator(new FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer());
+      AddOperator(new SymbolicRegressionOverfittingAnalyzer());
       ParameterizeAnalyzers();
     }
@@ -159,15 +161,20 @@
       foreach (var analyzer in Analyzers) {
         analyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
+        var validationSolutionAnalyzer = analyzer as SymbolicRegressionValidationAnalyzer;
+        if (validationSolutionAnalyzer != null) {
+          validationSolutionAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
+          validationSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
+          validationSolutionAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
+          validationSolutionAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
+          validationSolutionAnalyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
+          validationSolutionAnalyzer.ValidationSamplesStartParameter.Value = ValidationSamplesStart;
+          validationSolutionAnalyzer.ValidationSamplesEndParameter.Value = ValidationSamplesEnd;
+        }
+
         var fixedBestValidationSolutionAnalyzer = analyzer as FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer;
         if (fixedBestValidationSolutionAnalyzer != null) {
-          fixedBestValidationSolutionAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
-          fixedBestValidationSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
-          fixedBestValidationSolutionAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
-          fixedBestValidationSolutionAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
-          fixedBestValidationSolutionAnalyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
-          fixedBestValidationSolutionAnalyzer.ValidationSamplesStartParameter.Value = ValidationSamplesStart;
-          fixedBestValidationSolutionAnalyzer.ValidationSamplesEndParameter.Value = ValidationSamplesEnd;
           fixedBestValidationSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
         }
+
         var bestValidationSolutionAnalyzer = analyzer as ValidationBestScaledSymbolicRegressionSolutionAnalyzer;
         if (bestValidationSolutionAnalyzer != null) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs	(revision 5275)
@@ -125,10 +125,11 @@
     }
     public IntValue TrainingSamplesStart {
-      get { return new IntValue(DataAnalysisProblemData.TrainingSamplesStart.Value); }
+      get { return new IntValue(DataAnalysisProblemData.TrainingIndizes.First()); }
     }
     public IntValue TrainingSamplesEnd {
       get {
-        return new IntValue((DataAnalysisProblemData.TrainingSamplesStart.Value +
-          DataAnalysisProblemData.TrainingSamplesEnd.Value) / 2);
+        int endIndex = (int)(DataAnalysisProblemData.TrainingIndizes.Count() * (1.0 - DataAnalysisProblemData.ValidationPercentage.Value) - 1);
+        if (endIndex < 0) endIndex = 0;
+        return new IntValue(DataAnalysisProblemData.TrainingIndizes.ElementAt(endIndex));
       }
     }
@@ -137,5 +138,5 @@
     }
     public IntValue ValidationSamplesEnd {
-      get { return new IntValue(DataAnalysisProblemData.TrainingSamplesEnd.Value); }
+      get { return new IntValue(DataAnalysisProblemData.TrainingIndizes.Last() + 1); }
     }
     public IntValue TestSamplesStart {
@@ -152,4 +153,10 @@
     [StorableConstructor]
     protected SymbolicRegressionProblemBase(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionProblemBase(SymbolicRegressionProblemBase original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      RegisterParameterValueEvents();
+      RegisterParameterEvents();
+    }
     public SymbolicRegressionProblemBase()
       : base() {
@@ -164,9 +171,7 @@
       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)));
+      Parameters.Add(new ValueParameter<IntValue>("MaxExpressionDepth", "Maximal depth of the symbolic expression. The minimum depth needed for the algorithm is 3 because two levels are reserved for the ProgramRoot and the Start symbol.", new IntValue(10)));
       Parameters.Add(new ValueParameter<IntValue>("MaxFunctionDefiningBranches", "Maximal number of automatically defined functions.", (IntValue)new IntValue(0).AsReadOnly()));
       Parameters.Add(new ValueParameter<IntValue>("MaxFunctionArguments", "Maximal number of arguments of automatically defined functions.", (IntValue)new IntValue(0).AsReadOnly()));
-
-      creator.SymbolicExpressionTreeParameter.ActualName = "SymbolicRegressionModel";
 
       ParameterizeSolutionCreator();
@@ -175,27 +180,21 @@
       UpdateEstimationLimits();
       InitializeOperators();
+      RegisterParameterValueEvents();
       RegisterParameterEvents();
-      RegisterParameterValueEvents();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicRegressionProblemBase clone = (SymbolicRegressionProblemBase)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
-    }
-
-    private void RegisterParameterValueEvents() {
+    }
+
+    private void RegisterParameterEvents() {
       MaxFunctionArgumentsParameter.ValueChanged += new EventHandler(ArchitectureParameter_ValueChanged);
       MaxFunctionDefiningBranchesParameter.ValueChanged += new EventHandler(ArchitectureParameter_ValueChanged);
+      MaxExpressionDepthParameter.ValueChanged += new EventHandler(MaxExpressionDepthParameter_ValueChanged);
       SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
       FunctionTreeGrammarParameter.ValueChanged += new EventHandler(FunctionTreeGrammarParameter_ValueChanged);
-    }
-
-    private void RegisterParameterEvents() {
+      SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);
+    }
+
+    private void RegisterParameterValueEvents() {
       MaxFunctionArgumentsParameter.Value.ValueChanged += new EventHandler(ArchitectureParameterValue_ValueChanged);
       MaxFunctionDefiningBranchesParameter.Value.ValueChanged += new EventHandler(ArchitectureParameterValue_ValueChanged);
-      SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);
+      MaxExpressionDepthParameter.Value.ValueChanged += new EventHandler(MaxExpressionDepthParameterValue_ValueChanged);
     }
 
@@ -253,4 +252,13 @@
       OnArchitectureParameterChanged(e);
     }
+
+    private void MaxExpressionDepthParameter_ValueChanged(object sender, EventArgs e) {
+      MaxExpressionDepthParameterValue_ValueChanged(sender, e);
+      MaxExpressionDepthParameter.Value.ValueChanged += MaxExpressionDepthParameterValue_ValueChanged;
+    }
+    private void MaxExpressionDepthParameterValue_ValueChanged(object sender, EventArgs e) {
+      if (MaxExpressionDepth != null && MaxExpressionDepth.Value < 3)
+        MaxExpressionDepth.Value = 3;
+    }
     #endregion
 
@@ -262,6 +270,6 @@
       if (operators == null) InitializeOperators();
       #endregion
+      RegisterParameterValueEvents();
       RegisterParameterEvents();
-      RegisterParameterValueEvents();
     }
 
@@ -325,14 +333,4 @@
           varFreqAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
         }
-        var pruningOperator = analyzer as SymbolicRegressionTournamentPruning;
-        if (pruningOperator != null) {
-          pruningOperator.SamplesStartParameter.Value = TrainingSamplesStart;
-          pruningOperator.SamplesEndParameter.Value = TrainingSamplesEnd;
-          pruningOperator.DataAnalysisProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
-          pruningOperator.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
-          pruningOperator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
-          pruningOperator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
-          pruningOperator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
-        }
       }
       foreach (ISymbolicExpressionTreeAnalyzer analyzer in Operators.OfType<ISymbolicExpressionTreeAnalyzer>()) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 5275)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -34,13 +35,5 @@
   [Item("SymbolicRegressionSolution", "Represents a solution for a symbolic regression problem which can be visualized in the GUI.")]
   [StorableClass]
-  public sealed class SymbolicRegressionSolution : DataAnalysisSolution {
-    public SymbolicRegressionSolution() : base() { } // for cloning
-    [StorableConstructor]
-    public SymbolicRegressionSolution(bool deserializing) : base(deserializing) { }
-    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
-      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
-      this.Model = model;
-    }
-
+  public class SymbolicRegressionSolution : DataAnalysisSolution {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Function; }
@@ -50,4 +43,34 @@
       get { return (SymbolicRegressionModel)base.Model; }
       set { base.Model = value; }
+    }
+
+    protected List<double> estimatedValues;
+    public override IEnumerable<double> EstimatedValues {
+      get {
+        if (estimatedValues == null) RecalculateEstimatedValues();
+        return estimatedValues;
+      }
+    }
+
+    public override IEnumerable<double> EstimatedTrainingValues {
+      get { return GetEstimatedValues(ProblemData.TrainingIndizes); }
+    }
+
+    public override IEnumerable<double> EstimatedTestValues {
+      get { return GetEstimatedValues(ProblemData.TestIndizes); }
+    }
+
+    [StorableConstructor]
+    protected SymbolicRegressionSolution(bool deserializing) : base(deserializing) { }
+    protected SymbolicRegressionSolution(SymbolicRegressionSolution original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
+      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
+      this.Model = model;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicRegressionSolution(this, cloner);
     }
 
@@ -65,28 +88,8 @@
     }
 
-    private List<double> estimatedValues;
-    public override IEnumerable<double> EstimatedValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        return estimatedValues.AsEnumerable();
-      }
-    }
-
-    public override IEnumerable<double> EstimatedTrainingValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        int start = ProblemData.TrainingSamplesStart.Value;
-        int n = ProblemData.TrainingSamplesEnd.Value - start;
-        return estimatedValues.Skip(start).Take(n).ToList();
-      }
-    }
-
-    public override IEnumerable<double> EstimatedTestValues {
-      get {
-        if (estimatedValues == null) RecalculateEstimatedValues();
-        int start = ProblemData.TestSamplesStart.Value;
-        int n = ProblemData.TestSamplesEnd.Value - start;
-        return estimatedValues.Skip(start).Take(n).ToList();
-      }
+    public virtual IEnumerable<double> GetEstimatedValues(IEnumerable<int> rows) {
+      if (estimatedValues == null) RecalculateEstimatedValues();
+      foreach (int row in rows)
+        yield return estimatedValues[row];
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataCorrelationsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataCorrelationsView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataCorrelationsView.cs	(revision 5275)
@@ -55,5 +55,5 @@
             double[] var0 = ds.GetEnumeratedVariableValues(a).ToArray();
             double[] var1 = ds.GetEnumeratedVariableValues(b).ToArray();
-            double r = alglib.correlation.spearmanrankcorrelation(var0, var1, var0.Length);
+            double r = alglib.spearmancorr2(var0, var1, var0.Length);
             double bothtails, temp;
             bothtails = temp = 0.0;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisProblemDataView.cs	(revision 5275)
@@ -40,4 +40,9 @@
     }
 
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      importButton.Enabled = Enabled && !ReadOnly && !Locked;
+    }
+
     private void importButton_Click(object sender, EventArgs e) {
       if (openFileDialog == null) openFileDialog = new OpenFileDialog();
@@ -46,5 +51,4 @@
         try {
           Content.ImportFromFile(openFileDialog.FileName);
-          importButton.Enabled = false;
         }
         catch (Exception ex) {
@@ -53,4 +57,6 @@
       }
     }
+
+
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisSolutionView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisSolutionView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/DataAnalysisSolutionView.Designer.cs	(revision 5275)
@@ -45,9 +45,8 @@
     private void InitializeComponent() {
       this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.dataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.modelTabPage = new System.Windows.Forms.TabPage();
+      this.modelViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.tabControl = new System.Windows.Forms.TabControl();
-      this.modelViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.viewHost1 = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.dataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.dataTabPage.SuspendLayout();
       this.modelTabPage.SuspendLayout();
@@ -66,4 +65,19 @@
       this.dataTabPage.UseVisualStyleBackColor = true;
       // 
+      // dataViewHost
+      // 
+      this.dataViewHost.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.dataViewHost.Caption = "DataAnalysisSolution Data View";
+      this.dataViewHost.Content = null;
+      this.dataViewHost.Enabled = false;
+      this.dataViewHost.Location = new System.Drawing.Point(6, 6);
+      this.dataViewHost.Name = "dataViewHost";
+      this.dataViewHost.ReadOnly = false;
+      this.dataViewHost.Size = new System.Drawing.Size(360, 224);
+      this.dataViewHost.TabIndex = 2;
+      this.dataViewHost.ViewType = null;
+      // 
       // modelTabPage
       // 
@@ -76,4 +90,19 @@
       this.modelTabPage.Text = "Model";
       this.modelTabPage.UseVisualStyleBackColor = true;
+      // 
+      // modelViewHost
+      // 
+      this.modelViewHost.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.modelViewHost.Caption = "DataAnalysisSolution Model View";
+      this.modelViewHost.Content = null;
+      this.modelViewHost.Enabled = false;
+      this.modelViewHost.Location = new System.Drawing.Point(6, 6);
+      this.modelViewHost.Name = "modelViewHost";
+      this.modelViewHost.ReadOnly = false;
+      this.modelViewHost.Size = new System.Drawing.Size(360, 224);
+      this.modelViewHost.TabIndex = 1;
+      this.modelViewHost.ViewType = null;
       // 
       // tabControl
@@ -89,43 +118,4 @@
       this.tabControl.Size = new System.Drawing.Size(380, 262);
       this.tabControl.TabIndex = 1;
-      // 
-      // modelViewHost
-      // 
-      this.modelViewHost.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.modelViewHost.Caption = "DataAnalysisSolution Model View";
-      this.modelViewHost.Content = null;
-      this.modelViewHost.Location = new System.Drawing.Point(6, 6);
-      this.modelViewHost.Name = "modelViewHost";
-      this.modelViewHost.ReadOnly = false;
-      this.modelViewHost.Size = new System.Drawing.Size(360, 224);
-      this.modelViewHost.TabIndex = 1;
-      this.modelViewHost.ViewType = null;
-      // 
-      // viewHost1
-      // 
-      this.viewHost1.Caption = "View";
-      this.viewHost1.Content = null;
-      this.viewHost1.Location = new System.Drawing.Point(6, 6);
-      this.viewHost1.Name = "viewHost1";
-      this.viewHost1.ReadOnly = false;
-      this.viewHost1.Size = new System.Drawing.Size(360, 224);
-      this.viewHost1.TabIndex = 1;
-      this.viewHost1.ViewType = null;
-      // 
-      // dataViewHost
-      // 
-      this.dataViewHost.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.dataViewHost.Caption = "DataAnalysisSolution Data View";
-      this.dataViewHost.Content = null;
-      this.dataViewHost.Location = new System.Drawing.Point(6, 6);
-      this.dataViewHost.Name = "dataViewHost";
-      this.dataViewHost.ReadOnly = false;
-      this.dataViewHost.Size = new System.Drawing.Size(360, 224);
-      this.dataViewHost.TabIndex = 2;
-      this.dataViewHost.ViewType = null;
       // 
       // DataAnalysisSolutionView
@@ -149,5 +139,4 @@
     protected System.Windows.Forms.TabPage modelTabPage;
     protected HeuristicLab.MainForm.WindowsForms.ViewHost dataViewHost;
-    private HeuristicLab.MainForm.WindowsForms.ViewHost viewHost1;
     protected HeuristicLab.MainForm.WindowsForms.ViewHost modelViewHost;
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/EstimatedValuesView.cs	(revision 5275)
@@ -47,4 +47,6 @@
       InitializeComponent();
       matrixView = new StringConvertibleMatrixView();
+      matrixView.ShowRowsAndColumnsTextBox = false;
+      matrixView.ShowStatisticalInformation = false;
       matrixView.Dock = DockStyle.Fill;
       this.Controls.Add(matrixView);
@@ -82,10 +84,17 @@
         DoubleMatrix matrix = null;
         if (Content != null) {
-          double[,] values =
-          MatrixExtensions<double>.Create(
-            Content.ProblemData.Dataset.GetVariableValues(Content.ProblemData.TargetVariable.Value),
-            Content.EstimatedValues.ToArray());
+          double[,] values = new double[Content.ProblemData.Dataset.Rows, 4];
+
+          double[] target = Content.ProblemData.Dataset.GetVariableValues(Content.ProblemData.TargetVariable.Value);
+          double[] estimated = Content.EstimatedValues.ToArray();
+          for (int row = 0; row < target.Length; row++) {
+            values[row, 0] = target[row];
+            values[row, 1] = estimated[row];
+            values[row, 2] = estimated[row] - target[row];
+            values[row, 3] = estimated[row] / target[row] - 1;
+          }
+
           matrix = new DoubleMatrix(values);
-          matrix.ColumnNames = new string[] { "Original", "Estimated" };
+          matrix.ColumnNames = new string[] { "Original", "Estimated", "Error", "Rel. Error" };
         }
         matrixView.Content = matrix;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLab.Problems.DataAnalysis.Views-3.3.csproj	(revision 5275)
@@ -92,5 +92,64 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -99,5 +158,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.Windows.Forms.DataVisualization" />
     <Reference Include="System.Xml.Linq">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
@@ -113,97 +172,143 @@
     <None Include="HeuristicLabProblemsDataAnalysisViewsPlugin.cs.frame" />
     <None Include="Properties\AssemblyInfo.frame" />
-    <Compile Include="RunCollectionValidationTrajectoryView.cs" />
+    <Compile Include="RunCollectionValidationTrajectoryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="RunCollectionValidationTrajectoryView.Designer.cs">
       <DependentUpon>RunCollectionValidationTrajectoryView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionValidationStatisticsView.cs" />
+    <Compile Include="RunCollectionValidationStatisticsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="RunCollectionValidationStatisticsView.Designer.cs">
       <DependentUpon>RunCollectionValidationStatisticsView.cs</DependentUpon>
     </Compile>
-    <Compile Include="DataAnalysisProblemDataCorrelationsView.cs" />
+    <Compile Include="DataAnalysisProblemDataCorrelationsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="DataAnalysisProblemDataCorrelationsView.Designer.cs">
       <DependentUpon>DataAnalysisProblemDataCorrelationsView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionMonteCarloVariableImpactView.cs" />
+    <Compile Include="RunCollectionMonteCarloVariableImpactView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="RunCollectionMonteCarloVariableImpactView.Designer.cs">
       <DependentUpon>RunCollectionMonteCarloVariableImpactView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionWinklerVariableImpactView.cs" />
+    <Compile Include="RunCollectionWinklerVariableImpactView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="RunCollectionWinklerVariableImpactView.Designer.cs">
       <DependentUpon>RunCollectionWinklerVariableImpactView.cs</DependentUpon>
     </Compile>
-    <Compile Include="DataAnalysisSolutionView.cs" />
+    <Compile Include="DataAnalysisSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="DataAnalysisSolutionView.Designer.cs">
       <DependentUpon>DataAnalysisSolutionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ResultsView.cs" />
+    <Compile Include="ResultsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="ResultsView.Designer.cs">
       <DependentUpon>ResultsView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionVariableImpactView.cs" />
+    <Compile Include="RunCollectionVariableImpactView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="RunCollectionVariableImpactView.Designer.cs">
       <DependentUpon>RunCollectionVariableImpactView.cs</DependentUpon>
     </Compile>
-    <Compile Include="SupportVectorRegressionSolutionView.cs" />
+    <Compile Include="SupportVectorRegressionSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="SupportVectorRegressionSolutionView.Designer.cs">
       <DependentUpon>SupportVectorRegressionSolutionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="SupportVectorMachineModelView.cs" />
+    <Compile Include="SupportVectorMachineModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="SupportVectorMachineModelView.Designer.cs">
       <DependentUpon>SupportVectorMachineModelView.cs</DependentUpon>
     </Compile>
-    <Compile Include="EstimatedValuesView.cs" />
+    <Compile Include="EstimatedValuesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="EstimatedValuesView.Designer.cs">
       <DependentUpon>EstimatedValuesView.cs</DependentUpon>
     </Compile>
-    <Compile Include="DataAnalysisProblemDataView.cs" />
+    <Compile Include="DataAnalysisProblemDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="DataAnalysisProblemDataView.Designer.cs">
       <DependentUpon>DataAnalysisProblemDataView.cs</DependentUpon>
     </Compile>
     <Compile Include="HeuristicLabProblemsDataAnalysisViewsPlugin.cs" />
-    <Compile Include="LineChartView.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" />
+    <Compile Include="ScatterPlotView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="ScatterPlotView.Designer.cs">
       <DependentUpon>ScatterPlotView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\LatexSymbolicExpressionTreeView.cs" />
+    <Compile Include="Symbolic\LatexSymbolicExpressionTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\LatexSymbolicExpressionTreeView.Designer.cs">
       <DependentUpon>LatexSymbolicExpressionTreeView.cs</DependentUpon>
     </Compile>
     <Compile Include="Symbolic\SymbolicExpressionTreeLatexFormatter.cs" />
-    <Compile Include="Symbolic\GraphvizSymbolicExpressionTreeView.cs" />
+    <Compile Include="Symbolic\GraphvizSymbolicExpressionTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\GraphvizSymbolicExpressionTreeView.Designer.cs">
       <DependentUpon>GraphvizSymbolicExpressionTreeView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\InteractiveSymbolicRegressionSolutionSimplifierView.cs" />
+    <Compile Include="Symbolic\InteractiveSymbolicRegressionSolutionSimplifierView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\InteractiveSymbolicRegressionSolutionSimplifierView.Designer.cs">
       <DependentUpon>InteractiveSymbolicRegressionSolutionSimplifierView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\SimplifiedSymbolicExpressionModelView.cs" />
+    <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" />
+    <Compile Include="Symbolic\SymbolicExpressionModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\SymbolicExpressionModelView.designer.cs">
       <DependentUpon>SymbolicExpressionModelView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\SymbolicRegressionSolutionView.cs" />
+    <Compile Include="Symbolic\SymbolicRegressionSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\SymbolicRegressionSolutionView.Designer.cs">
       <DependentUpon>SymbolicRegressionSolutionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\Symbols\ConstantView.cs" />
+    <Compile Include="Symbolic\Symbols\ConstantView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\Symbols\ConstantView.Designer.cs">
       <DependentUpon>ConstantView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Symbolic\Symbols\LaggedVariableView.cs" />
+    <Compile Include="Symbolic\Symbols\LaggedVariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\Symbols\LaggedVariableView.Designer.cs">
       <DependentUpon>LaggedVariableView.cs</DependentUpon>
     </Compile>
     <Compile Include="Symbolic\SymbolicExpressionTreeGraphvizFormatter.cs" />
-    <Compile Include="Symbolic\Symbols\VariableView.cs" />
+    <Compile Include="Symbolic\Symbols\VariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="Symbolic\Symbols\VariableView.Designer.cs">
       <DependentUpon>VariableView.cs</DependentUpon>
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLabProblemsDataAnalysisViewsPlugin.cs.frame
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLabProblemsDataAnalysisViewsPlugin.cs.frame	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/HeuristicLabProblemsDataAnalysisViewsPlugin.cs.frame	(revision 5275)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis.Views","3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Views-3.3.dll", PluginFileType.Assembly)]
-    [PluginDependency("HeuristicLab.ALGLIB","2.5.0.0")]
+    [PluginDependency("HeuristicLab.ALGLIB","3.1")]
   [PluginDependency("HeuristicLab.Collections", "3.3.0.0")]
   [PluginDependency("HeuristicLab.Common", "3.3.0.0")]
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.Designer.cs	(revision 5275)
@@ -46,5 +46,5 @@
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
       this.SuspendLayout();
@@ -63,6 +63,7 @@
       this.chart.Size = new System.Drawing.Size(358, 225);
       this.chart.TabIndex = 0;
+      this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.Chart_MouseDoubleClick);
       // 
-      // QualityLineChart
+      // LineChartView
       // 
       this.AllowDrop = true;
@@ -70,5 +71,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.chart);
-      this.Name = "QualityLineChart";
+      this.Name = "LineChartView";
       this.Size = new System.Drawing.Size(358, 225);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
@@ -79,5 +80,5 @@
     #endregion
 
-    private System.Windows.Forms.DataVisualization.Charting.Chart chart;
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs	(revision 5275)
@@ -43,4 +43,5 @@
       InitializeComponent();
       //configure axis
+      this.chart.CustomizeAllChartAreas();
       this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
       this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
@@ -120,4 +121,14 @@
       }
     }
+
+    private void Chart_MouseDoubleClick(object sender, MouseEventArgs e) {
+      HitTestResult result = chart.HitTest(e.X, e.Y);
+      if (result.ChartArea != null && (result.ChartElementType == ChartElementType.PlottingArea ||
+                                       result.ChartElementType == ChartElementType.Gridlines) ||
+                                       result.ChartElementType == ChartElementType.StripLines) {
+        foreach (var axis in result.ChartArea.Axes)
+          axis.ScaleView.ZoomReset(int.MaxValue);
+      }
+    }
     #endregion
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ResultsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ResultsView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ResultsView.cs	(revision 5275)
@@ -31,5 +31,5 @@
   [View("Results View")]
   public partial class ResultsView : AsynchronousContentView {
-    private List<string> rowNames = new List<string>() { "MeanSquaredError", "CoefficientOfDetermination", "MeanAbsolutePercentageError" };
+    private List<string> rowNames = new List<string>() { "Mean squared error", "Pearson's R²", "Average relative error" };
     private List<string> columnNames = new List<string>() { "Training", "Test" };
 
@@ -77,6 +77,6 @@
         matrix.SortableView = false;
 
-        IEnumerable<double> originalTrainingValues = Content.ProblemData.Dataset.GetVariableValues(Content.ProblemData.TargetVariable.Value, Content.ProblemData.TrainingSamplesStart.Value, Content.ProblemData.TrainingSamplesEnd.Value);
-        IEnumerable<double> originalTestValues = Content.ProblemData.Dataset.GetVariableValues(Content.ProblemData.TargetVariable.Value, Content.ProblemData.TestSamplesStart.Value, Content.ProblemData.TestSamplesEnd.Value);
+        IEnumerable<double> originalTrainingValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(Content.ProblemData.TargetVariable.Value, Content.ProblemData.TrainingIndizes);
+        IEnumerable<double> originalTestValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(Content.ProblemData.TargetVariable.Value, Content.ProblemData.TestIndizes);
         matrix[0, 0] = SimpleMSEEvaluator.Calculate(originalTrainingValues, Content.EstimatedTrainingValues);
         matrix[0, 1] = SimpleMSEEvaluator.Calculate(originalTestValues, Content.EstimatedTestValues);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionMonteCarloVariableImpactView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionMonteCarloVariableImpactView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionMonteCarloVariableImpactView.cs	(revision 5275)
@@ -23,5 +23,4 @@
 using System.Linq;
 using System.Windows.Forms;
-using alglib;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationStatisticsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationStatisticsView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationStatisticsView.cs	(revision 5275)
@@ -23,5 +23,4 @@
 using System.Linq;
 using System.Windows.Forms;
-using alglib;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationTrajectoryView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationTrajectoryView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionValidationTrajectoryView.cs	(revision 5275)
@@ -23,5 +23,4 @@
 using System.Linq;
 using System.Windows.Forms;
-using alglib;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionVariableImpactView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionVariableImpactView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionVariableImpactView.cs	(revision 5275)
@@ -20,8 +20,8 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Forms;
-using alglib;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
@@ -29,10 +29,9 @@
 using HeuristicLab.MainForm.WindowsForms;
 using HeuristicLab.Optimization;
-using System;
 
 namespace HeuristicLab.Problems.DataAnalysis.Views {
   [Content(typeof(RunCollection), false)]
   [View("RunCollection Variable Impact View")]
-  public partial class RunCollectionVariableImpactView : AsynchronousContentView {
+  public sealed partial class RunCollectionVariableImpactView : AsynchronousContentView {
     private const string variableImpactResultName = "Integrated variable frequencies";
     public RunCollectionVariableImpactView() {
@@ -45,16 +44,49 @@
     }
 
+    #region events
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      this.Content.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      this.Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      this.Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      RegisterRunEvents(Content);
     }
     protected override void DeregisterContentEvents() {
       base.RegisterContentEvents();
-      this.Content.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      this.Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      this.Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
-    }
+      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      DeregisterRunEvents(Content);
+    }
+    private void RegisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs)
+        run.Changed += new EventHandler(Run_Changed);
+    }
+    private void DeregisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs)
+        run.Changed -= new EventHandler(Run_Changed);
+    }
+    private void Content_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      RegisterRunEvents(e.Items);
+      UpdateData();
+    }
+    private void Content_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.Items);
+      UpdateData();
+    }
+    private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.OldItems);
+      RegisterRunEvents(e.Items);
+      UpdateData();
+    }
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (!Content.UpdateOfRunsInProgress) UpdateData();
+    }
+    private void Run_Changed(object sender, EventArgs e) {
+      if (!Content.UpdateOfRunsInProgress) UpdateData();
+    }
+    #endregion
 
     protected override void OnContentChanged() {
@@ -62,13 +94,4 @@
       this.UpdateData();
     }
-    private void Content_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      this.UpdateData();
-    }
-    private void Content_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      this.UpdateData();
-    }
-    private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      this.UpdateData();
-    }
 
     private void UpdateData() {
@@ -76,8 +99,8 @@
     }
 
-    public DoubleMatrix CalculateVariableImpactMatrix() {
+    private DoubleMatrix CalculateVariableImpactMatrix() {
       DoubleMatrix matrix = null;
       if (Content != null) {
-        List<IRun> runsWithVariables = Content.Where(r => r.Results.ContainsKey(variableImpactResultName)).ToList();
+        List<IRun> runsWithVariables = Content.Where(r => r.Visible && r.Results.ContainsKey(variableImpactResultName)).ToList();
         IEnumerable<DoubleMatrix> allVariableImpacts = (from run in runsWithVariables
                                                         select run.Results[variableImpactResultName]).Cast<DoubleMatrix>();
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionWinklerVariableImpactView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionWinklerVariableImpactView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/RunCollectionWinklerVariableImpactView.cs	(revision 5275)
@@ -23,5 +23,4 @@
 using System.Linq;
 using System.Windows.Forms;
-using alglib;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
@@ -140,5 +139,5 @@
             z[i] = rowValues[i] - referenceValues[i];
           }
-          alglib.wsr.wilcoxonsignedranktest(z, z.Length, 0.0, ref bothTails, ref leftTail, ref rightTail);
+          alglib.wilcoxonsignedranktest(z, z.Length, 0.0, out bothTails, out leftTail, out rightTail);
           matrix[row, columnIndex + 3] = bothTails;
         }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 5275)
@@ -47,5 +47,5 @@
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
       this.SuspendLayout();
@@ -82,5 +82,5 @@
     #endregion
 
-    private System.Windows.Forms.DataVisualization.Charting.Chart chart;
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs	(revision 5275)
@@ -61,5 +61,6 @@
       this.chart.AxisViewChanged += new EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(chart_AxisViewChanged);
 
-      //configure axis                  
+      //configure axis 
+      this.chart.CustomizeAllChartAreas();
       this.chart.ChartAreas[0].AxisX.Title = "Estimated Values";
       this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
@@ -127,8 +128,4 @@
         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(Content.EstimatedValues.ToArray(), "",
@@ -136,14 +133,20 @@
         if (this.chart.Series[TRAINING_SERIES].Points.Count > 0)
           this.chart.Series[TRAINING_SERIES].Points.DataBindXY(Content.EstimatedTrainingValues.ToArray(), "",
-            dataset.GetVariableValues(targetVariableName, trainingStart, trainingEnd), "");
+            dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TrainingIndizes).ToArray(), "");
         if (this.chart.Series[TEST_SERIES].Points.Count > 0)
           this.chart.Series[TEST_SERIES].Points.DataBindXY(Content.EstimatedTestValues.ToArray(), "",
-            dataset.GetVariableValues(targetVariableName, testStart, testEnd), "");
+           dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TestIndizes).ToArray(), "");
 
         double max = Math.Max(Content.EstimatedValues.Max(), dataset.GetVariableValues(targetVariableName).Max());
         double min = Math.Min(Content.EstimatedValues.Min(), dataset.GetVariableValues(targetVariableName).Min());
 
-        max = Math.Ceiling(max) * 1.2;
-        min = Math.Floor(min) * 0.8;
+        max = max + 0.2 * Math.Abs(max);
+        min = min - 0.2 * Math.Abs(min);
+
+        double interestingValuesRange = max - min;
+        int digits = Math.Max(0, 3 - (int)Math.Log10(interestingValuesRange));
+
+        max = Math.Round(max, digits);
+        min = Math.Round(min, digits);
 
         this.chart.ChartAreas[0].AxisX.Maximum = max;
@@ -168,9 +171,4 @@
       } 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;
@@ -178,14 +176,14 @@
         switch (series.Name) {
           case ALL_SERIES:
-            predictedValues = Content.EstimatedValues;
-            targetValues = dataset.GetVariableValues(targetVariableName);
+            predictedValues = Content.EstimatedValues.ToArray();
+            targetValues = Content.ProblemData.Dataset.GetVariableValues(targetVariableName);
             break;
           case TRAINING_SERIES:
-            predictedValues = Content.EstimatedTrainingValues;
-            targetValues = dataset.GetVariableValues(targetVariableName, trainingStart, trainingEnd);
+            predictedValues = Content.EstimatedTrainingValues.ToArray();
+            targetValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TrainingIndizes).ToArray();
             break;
           case TEST_SERIES:
-            predictedValues = Content.EstimatedTestValues;
-            targetValues = dataset.GetVariableValues(targetVariableName, testStart, testEnd);
+            predictedValues = Content.EstimatedTestValues.ToArray();
+            targetValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TestIndizes).ToArray();
             break;
         }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicRegressionSolutionView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicRegressionSolutionView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicRegressionSolutionView.Designer.cs	(revision 5275)
@@ -63,4 +63,8 @@
       this.modelTabPage.Size = new System.Drawing.Size(372, 207);
       // 
+      // dataViewHost
+      // 
+      this.dataViewHost.Size = new System.Drawing.Size(360, 195);
+      // 
       // modelViewHost
       // 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.Designer.cs	(revision 5275)
@@ -54,5 +54,5 @@
       this.valueChangeSigmaTextBox = new System.Windows.Forms.TextBox();
       this.meanWeightChangeLabel = new System.Windows.Forms.Label();
-      this.valueChangeNuTextBox = new System.Windows.Forms.TextBox();
+      this.valueChangeMuTextBox = new System.Windows.Forms.TextBox();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.initializationGroupBox.SuspendLayout();
@@ -146,5 +146,5 @@
       this.mutationGroupBox.Controls.Add(this.valueChangeSigmaTextBox);
       this.mutationGroupBox.Controls.Add(this.meanWeightChangeLabel);
-      this.mutationGroupBox.Controls.Add(this.valueChangeNuTextBox);
+      this.mutationGroupBox.Controls.Add(this.valueChangeMuTextBox);
       this.mutationGroupBox.Location = new System.Drawing.Point(3, 158);
       this.mutationGroupBox.Name = "mutationGroupBox";
@@ -183,20 +183,20 @@
       this.meanWeightChangeLabel.Location = new System.Drawing.Point(6, 22);
       this.meanWeightChangeLabel.Name = "meanWeightChangeLabel";
-      this.meanWeightChangeLabel.Size = new System.Drawing.Size(97, 13);
+      this.meanWeightChangeLabel.Size = new System.Drawing.Size(99, 13);
       this.meanWeightChangeLabel.TabIndex = 6;
-      this.meanWeightChangeLabel.Text = "Value change (nu):";
-      this.toolTip.SetToolTip(this.meanWeightChangeLabel, "The nu (mean) parameter for the normal distribution to sample the value change.");
-      // 
-      // valueChangeNuTextBox
-      // 
-      this.valueChangeNuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.errorProvider.SetIconAlignment(this.valueChangeNuTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.valueChangeNuTextBox.Location = new System.Drawing.Point(136, 19);
-      this.valueChangeNuTextBox.Name = "valueChangeNuTextBox";
-      this.valueChangeNuTextBox.Size = new System.Drawing.Size(178, 20);
-      this.valueChangeNuTextBox.TabIndex = 7;
-      this.toolTip.SetToolTip(this.valueChangeNuTextBox, "The nu (mean) parameter for the normal distribution to sample the value change.");
-      this.valueChangeNuTextBox.TextChanged += new System.EventHandler(this.valueChangeNuTextBox_TextChanged);
+      this.meanWeightChangeLabel.Text = "Value change (mu):";
+      this.toolTip.SetToolTip(this.meanWeightChangeLabel, "The mu (mean) parameter for the normal distribution to sample the value change.");
+      // 
+      // valueChangeMuTextBox
+      // 
+      this.valueChangeMuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.errorProvider.SetIconAlignment(this.valueChangeMuTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.valueChangeMuTextBox.Location = new System.Drawing.Point(136, 19);
+      this.valueChangeMuTextBox.Name = "valueChangeMuTextBox";
+      this.valueChangeMuTextBox.Size = new System.Drawing.Size(178, 20);
+      this.valueChangeMuTextBox.TabIndex = 7;
+      this.toolTip.SetToolTip(this.valueChangeMuTextBox, "The mu (mean) parameter for the normal distribution to sample the value change.");
+      this.valueChangeMuTextBox.TextChanged += new System.EventHandler(this.valueChangeMuTextBox_TextChanged);
       // 
       // ConstantView
@@ -237,5 +237,5 @@
     private System.Windows.Forms.TextBox valueChangeSigmaTextBox;
     private System.Windows.Forms.Label meanWeightChangeLabel;
-    private System.Windows.Forms.TextBox valueChangeNuTextBox;
+    private System.Windows.Forms.TextBox valueChangeMuTextBox;
 
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/ConstantView.cs	(revision 5275)
@@ -58,7 +58,11 @@
       base.SetEnabledStateOfControls();
       minValueTextBox.Enabled = Content != null;
+      minValueTextBox.ReadOnly = ReadOnly;
       maxValueTextBox.Enabled = Content != null;
-      valueChangeNuTextBox.Enabled = Content != null;
+      maxValueTextBox.ReadOnly = ReadOnly;
+      valueChangeMuTextBox.Enabled = Content != null;
+      valueChangeMuTextBox.ReadOnly = ReadOnly;
       valueChangeSigmaTextBox.Enabled = Content != null;
+      valueChangeSigmaTextBox.ReadOnly = ReadOnly;
     }
 
@@ -89,11 +93,11 @@
     }
 
-    private void valueChangeNuTextBox_TextChanged(object sender, EventArgs e) {
+    private void valueChangeMuTextBox_TextChanged(object sender, EventArgs e) {
       double nu;
-      if (double.TryParse(valueChangeNuTextBox.Text, out nu)) {
-        Content.ManipulatorNu = nu;
-        errorProvider.SetError(valueChangeNuTextBox, string.Empty);
+      if (double.TryParse(valueChangeMuTextBox.Text, out nu)) {
+        Content.ManipulatorMu = nu;
+        errorProvider.SetError(valueChangeMuTextBox, string.Empty);
       } else {
-        errorProvider.SetError(valueChangeNuTextBox, "Invalid value");
+        errorProvider.SetError(valueChangeMuTextBox, "Invalid value");
       }
     }
@@ -120,5 +124,5 @@
         minValueTextBox.Text = Content.MinValue.ToString();
         maxValueTextBox.Text = Content.MaxValue.ToString();
-        valueChangeNuTextBox.Text = Content.ManipulatorNu.ToString();
+        valueChangeMuTextBox.Text = Content.ManipulatorMu.ToString();
         valueChangeSigmaTextBox.Text = Content.ManipulatorSigma.ToString();
       }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/LaggedVariableView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/LaggedVariableView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/LaggedVariableView.cs	(revision 5275)
@@ -57,5 +57,7 @@
       base.SetEnabledStateOfControls();
       minTimeOffsetTextBox.Enabled = Content != null;
+      minTimeOffsetTextBox.ReadOnly = ReadOnly;
       maxTimeOffsetTextBox.Enabled = Content != null;
+      maxTimeOffsetTextBox.ReadOnly = ReadOnly;
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.Designer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.Designer.cs	(revision 5275)
@@ -45,6 +45,6 @@
     /// </summary>
     private void InitializeComponent() {
-      this.weightNuLabel = new System.Windows.Forms.Label();
-      this.weightNuTextBox = new System.Windows.Forms.TextBox();
+      this.weightMuLabel = new System.Windows.Forms.Label();
+      this.weightMuTextBox = new System.Windows.Forms.TextBox();
       this.initializationGroupBox = new System.Windows.Forms.GroupBox();
       this.weightSigmaLabel = new System.Windows.Forms.Label();
@@ -54,5 +54,5 @@
       this.weightChangeSigmaTextBox = new System.Windows.Forms.TextBox();
       this.meanWeightChangeLabel = new System.Windows.Forms.Label();
-      this.weightChangeNuTextBox = new System.Windows.Forms.TextBox();
+      this.weightChangeMuTextBox = new System.Windows.Forms.TextBox();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.initializationGroupBox.SuspendLayout();
@@ -66,4 +66,5 @@
       // initialFrequencyTextBox
       // 
+      this.errorProvider.SetIconAlignment(this.initialFrequencyTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.initialFrequencyTextBox.Size = new System.Drawing.Size(203, 20);
       // 
@@ -76,27 +77,28 @@
       // descriptionTextBox
       // 
+      this.errorProvider.SetIconAlignment(this.descriptionTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.descriptionTextBox.Size = new System.Drawing.Size(203, 20);
       // 
-      // weightNuLabel
-      // 
-      this.weightNuLabel.AutoSize = true;
-      this.weightNuLabel.Location = new System.Drawing.Point(6, 22);
-      this.weightNuLabel.Name = "weightNuLabel";
-      this.weightNuLabel.Size = new System.Drawing.Size(65, 13);
-      this.weightNuLabel.TabIndex = 6;
-      this.weightNuLabel.Text = "Weight (nu):";
-      this.toolTip.SetToolTip(this.weightNuLabel, "The nu (mean) parameter of the normal distribution to use for initial weights.");
-      // 
-      // weightNuTextBox
-      // 
-      this.weightNuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.weightNuTextBox.Location = new System.Drawing.Point(92, 19);
-      this.weightNuTextBox.Name = "weightNuTextBox";
-      this.weightNuTextBox.Size = new System.Drawing.Size(201, 20);
-      this.weightNuTextBox.TabIndex = 7;
-      this.toolTip.SetToolTip(this.weightNuTextBox, "The nu (mean) parameter of the normal distribution from which to sample the initi" +
+      // weightMuLabel
+      // 
+      this.weightMuLabel.AutoSize = true;
+      this.weightMuLabel.Location = new System.Drawing.Point(6, 22);
+      this.weightMuLabel.Name = "weightMuLabel";
+      this.weightMuLabel.Size = new System.Drawing.Size(67, 13);
+      this.weightMuLabel.TabIndex = 6;
+      this.weightMuLabel.Text = "Weight (mu):";
+      this.toolTip.SetToolTip(this.weightMuLabel, "The mu (mean) parameter of the normal distribution to use for initial weights.");
+      // 
+      // weightMuTextBox
+      // 
+      this.weightMuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.weightMuTextBox.Location = new System.Drawing.Point(92, 19);
+      this.weightMuTextBox.Name = "weightMuTextBox";
+      this.weightMuTextBox.Size = new System.Drawing.Size(201, 20);
+      this.weightMuTextBox.TabIndex = 7;
+      this.toolTip.SetToolTip(this.weightMuTextBox, "The mu (mean) parameter of the normal distribution from which to sample the initi" +
               "al weights.");
-      this.weightNuTextBox.TextChanged += new System.EventHandler(this.weightNuTextBox_TextChanged);
+      this.weightMuTextBox.TextChanged += new System.EventHandler(this.weightMuTextBox_TextChanged);
       // 
       // initializationGroupBox
@@ -106,6 +108,6 @@
       this.initializationGroupBox.Controls.Add(this.weightSigmaLabel);
       this.initializationGroupBox.Controls.Add(this.weightSigmaTextBox);
-      this.initializationGroupBox.Controls.Add(this.weightNuLabel);
-      this.initializationGroupBox.Controls.Add(this.weightNuTextBox);
+      this.initializationGroupBox.Controls.Add(this.weightMuLabel);
+      this.initializationGroupBox.Controls.Add(this.weightMuTextBox);
       this.initializationGroupBox.Location = new System.Drawing.Point(3, 79);
       this.initializationGroupBox.Name = "initializationGroupBox";
@@ -144,5 +146,5 @@
       this.mutationGroupBox.Controls.Add(this.weightChangeSigmaTextBox);
       this.mutationGroupBox.Controls.Add(this.meanWeightChangeLabel);
-      this.mutationGroupBox.Controls.Add(this.weightChangeNuTextBox);
+      this.mutationGroupBox.Controls.Add(this.weightChangeMuTextBox);
       this.mutationGroupBox.Location = new System.Drawing.Point(3, 158);
       this.mutationGroupBox.Name = "mutationGroupBox";
@@ -180,21 +182,21 @@
       this.meanWeightChangeLabel.Location = new System.Drawing.Point(6, 22);
       this.meanWeightChangeLabel.Name = "meanWeightChangeLabel";
-      this.meanWeightChangeLabel.Size = new System.Drawing.Size(104, 13);
+      this.meanWeightChangeLabel.Size = new System.Drawing.Size(106, 13);
       this.meanWeightChangeLabel.TabIndex = 6;
-      this.meanWeightChangeLabel.Text = "Weight change (nu):";
+      this.meanWeightChangeLabel.Text = "Weight change (mu):";
       this.toolTip.SetToolTip(this.meanWeightChangeLabel, "The nu (mean) parameter for the normal distribution to sample the change in weigh" +
               "t.");
       // 
-      // weightChangeNuTextBox
-      // 
-      this.weightChangeNuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.weightChangeNuTextBox.Location = new System.Drawing.Point(131, 19);
-      this.weightChangeNuTextBox.Name = "weightChangeNuTextBox";
-      this.weightChangeNuTextBox.Size = new System.Drawing.Size(162, 20);
-      this.weightChangeNuTextBox.TabIndex = 7;
-      this.toolTip.SetToolTip(this.weightChangeNuTextBox, "The nu (mean) parameter for the normal distribution to sample the change in weigh" +
+      // weightChangeMuTextBox
+      // 
+      this.weightChangeMuTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.weightChangeMuTextBox.Location = new System.Drawing.Point(131, 19);
+      this.weightChangeMuTextBox.Name = "weightChangeMuTextBox";
+      this.weightChangeMuTextBox.Size = new System.Drawing.Size(162, 20);
+      this.weightChangeMuTextBox.TabIndex = 7;
+      this.toolTip.SetToolTip(this.weightChangeMuTextBox, "The mu (mean) parameter for the normal distribution to sample the change in weigh" +
               "t.");
-      this.weightChangeNuTextBox.TextChanged += new System.EventHandler(this.weightChangeNuTextBox_TextChanged);
+      this.weightChangeMuTextBox.TextChanged += new System.EventHandler(this.weightChangeMuTextBox_TextChanged);
       // 
       // VariableView
@@ -226,6 +228,6 @@
     #endregion
 
-    private System.Windows.Forms.Label weightNuLabel;
-    private System.Windows.Forms.TextBox weightNuTextBox;
+    private System.Windows.Forms.Label weightMuLabel;
+    private System.Windows.Forms.TextBox weightMuTextBox;
     protected System.Windows.Forms.GroupBox initializationGroupBox;
     private System.Windows.Forms.Label weightSigmaLabel;
@@ -235,5 +237,5 @@
     private System.Windows.Forms.TextBox weightChangeSigmaTextBox;
     private System.Windows.Forms.Label meanWeightChangeLabel;
-    private System.Windows.Forms.TextBox weightChangeNuTextBox;
+    private System.Windows.Forms.TextBox weightChangeMuTextBox;
 
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/Symbols/VariableView.cs	(revision 5275)
@@ -57,8 +57,12 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      weightNuTextBox.Enabled = Content != null;
+      weightMuTextBox.Enabled = Content != null;
+      weightMuTextBox.ReadOnly = ReadOnly;
       weightSigmaTextBox.Enabled = Content != null;
-      weightChangeNuTextBox.Enabled = Content != null;
+      weightSigmaTextBox.ReadOnly = ReadOnly;
+      weightChangeMuTextBox.Enabled = Content != null;
+      weightChangeMuTextBox.ReadOnly = ReadOnly;
       weightChangeSigmaTextBox.Enabled = Content != null;
+      weightChangeSigmaTextBox.ReadOnly = ReadOnly;
     }
 
@@ -70,11 +74,11 @@
 
     #region control event handlers
-    private void weightNuTextBox_TextChanged(object sender, EventArgs e) {
+    private void weightMuTextBox_TextChanged(object sender, EventArgs e) {
       double nu;
-      if (double.TryParse(weightNuTextBox.Text, out nu)) {
-        Content.WeightNu = nu;
-        errorProvider.SetError(weightNuTextBox, string.Empty);
+      if (double.TryParse(weightMuTextBox.Text, out nu)) {
+        Content.WeightMu = nu;
+        errorProvider.SetError(weightMuTextBox, string.Empty);
       } else {
-        errorProvider.SetError(weightNuTextBox, "Invalid value");
+        errorProvider.SetError(weightMuTextBox, "Invalid value");
       }
     }
@@ -89,11 +93,11 @@
     }
 
-    private void weightChangeNuTextBox_TextChanged(object sender, EventArgs e) {
+    private void weightChangeMuTextBox_TextChanged(object sender, EventArgs e) {
       double nu;
-      if (double.TryParse(weightChangeNuTextBox.Text, out nu)) {
-        Content.WeightManipulatorNu = nu;
-        errorProvider.SetError(weightChangeNuTextBox, string.Empty);
+      if (double.TryParse(weightChangeMuTextBox.Text, out nu)) {
+        Content.WeightManipulatorMu = nu;
+        errorProvider.SetError(weightChangeMuTextBox, string.Empty);
       } else {
-        errorProvider.SetError(weightChangeNuTextBox, "Invalid value");
+        errorProvider.SetError(weightChangeMuTextBox, "Invalid value");
       }
     }
@@ -113,12 +117,12 @@
     private void UpdateControl() {
       if (Content == null) {
-        weightNuTextBox.Text = string.Empty;
+        weightMuTextBox.Text = string.Empty;
         weightSigmaTextBox.Text = string.Empty;
-        weightNuTextBox.Text = string.Empty;
+        weightMuTextBox.Text = string.Empty;
         weightChangeSigmaTextBox.Text = string.Empty;
       } else {
-        weightNuTextBox.Text = Content.WeightNu.ToString();
+        weightMuTextBox.Text = Content.WeightMu.ToString();
         weightSigmaTextBox.Text = Content.WeightSigma.ToString();
-        weightChangeNuTextBox.Text = Content.WeightManipulatorNu.ToString();
+        weightChangeMuTextBox.Text = Content.WeightManipulatorMu.ToString();
         weightChangeSigmaTextBox.Text = Content.WeightManipulatorSigma.ToString();
       }
Index: anches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/CsvFileParser.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/CsvFileParser.cs	(revision 5274)
+++ 	(revision )
@@ -1,316 +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.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  public class CsvFileParser {
-    private const string VARIABLENAMES = "VARIABLENAMES";
-    private Tokenizer tokenizer;
-    private List<string> variableNames;
-    private List<List<double>> rowValues;
-
-    private int rows;
-    public int Rows {
-      get { return rows; }
-      set { rows = value; }
-    }
-
-    private int columns;
-    public int Columns {
-      get { return columns; }
-      set { columns = value; }
-    }
-
-    private double[,] values;
-    public double[,] Values {
-      get {
-        return values;
-      }
-    }
-
-    public IEnumerable<string> VariableNames {
-      get {
-        if (variableNames.Count > 0) return variableNames;
-        else {
-          string[] names = new string[columns];
-          for (int i = 0; i < names.Length; i++) {
-            names[i] = "X" + i.ToString("000");
-          }
-          return names;
-        }
-      }
-    }
-
-    public CsvFileParser() {
-      rowValues = new List<List<double>>();
-      variableNames = new List<string>();
-    }
-
-    private void Reset() {
-      variableNames.Clear();
-      rowValues.Clear();
-    }
-
-    public void Parse(string fileName) {
-      TryParse(fileName);
-      // translate the list of samples into a DoubleMatrixData item
-      rows = rowValues.Count;
-      columns = rowValues[0].Count;
-      values = new double[rows, columns];
-
-      int rowIndex = 0;
-      int columnIndex = 0;
-      foreach (List<double> row in rowValues) {
-        columnIndex = 0;
-        foreach (double element in row) {
-          values[rowIndex, columnIndex++] = element;
-        }
-        rowIndex++;
-      }
-    }
-
-    private void TryParse(string fileName) {
-      Exception lastEx = null;
-      NumberFormatInfo[] possibleFormats = new NumberFormatInfo[] { CultureInfo.InvariantCulture.NumberFormat };
-      foreach (NumberFormatInfo numberFormat in possibleFormats) {
-        using (StreamReader reader = new StreamReader(fileName)) {
-          tokenizer = new Tokenizer(reader, numberFormat);
-          try {
-            // parse the file
-            Parse();
-            return; // parsed without errors -> return;
-          }
-          catch (DataFormatException ex) {
-            lastEx = ex;
-          }
-        }
-      }
-      // all number formats threw an exception -> rethrow the last exception
-      throw lastEx;
-    }
-
-    #region tokenizer
-    internal enum TokenTypeEnum {
-      NewLine, Separator, String, Double
-    }
-
-    internal class Token {
-      public TokenTypeEnum type;
-      public string stringValue;
-      public double doubleValue;
-
-      public Token(TokenTypeEnum type, string value) {
-        this.type = type;
-        stringValue = value;
-        doubleValue = 0.0;
-      }
-
-      public override string ToString() {
-        return stringValue;
-      }
-    }
-
-
-    internal class Tokenizer {
-      private StreamReader reader;
-      private List<Token> tokens;
-      private NumberFormatInfo numberFormatInfo;
-
-      private int currentLineNumber = 0;
-      public int CurrentLineNumber {
-        get { return currentLineNumber; }
-        private set { currentLineNumber = value; }
-      }
-      private string currentLine;
-      public string CurrentLine {
-        get { return currentLine; }
-        private set { currentLine = value; }
-      }
-
-      private Token newlineToken;
-      public Token NewlineToken {
-        get { return newlineToken; }
-        private set { newlineToken = value; }
-      }
-      private Token separatorToken;
-      public Token SeparatorToken {
-        get { return separatorToken; }
-        private set { separatorToken = value; }
-      }
-
-      public Tokenizer(StreamReader reader, NumberFormatInfo numberFormatInfo, char separator) {
-        this.reader = reader;
-        this.numberFormatInfo = numberFormatInfo;
-        separatorToken = new Token(TokenTypeEnum.Separator, separator.ToString());
-        newlineToken = new Token(TokenTypeEnum.NewLine, Environment.NewLine);
-        tokens = new List<Token>();
-        ReadNextTokens();
-      }
-      public Tokenizer(StreamReader reader, NumberFormatInfo numberFormatInfo)
-        : this(reader, numberFormatInfo, ';') {
-      }
-
-      private void ReadNextTokens() {
-        if (!reader.EndOfStream) {
-          CurrentLine = reader.ReadLine();
-          var newTokens = from str in Split(CurrentLine)
-                          let trimmedStr = str.Trim()
-                          where !string.IsNullOrEmpty(trimmedStr)
-                          select MakeToken(trimmedStr.Trim());
-
-          tokens.AddRange(newTokens);
-          tokens.Add(NewlineToken);
-          CurrentLineNumber++;
-        }
-      }
-
-      private IEnumerable<string> Split(string line) {
-        StringBuilder subStr = new StringBuilder();
-        foreach (char c in line) {
-          if (c == ';') {
-            yield return subStr.ToString();
-            subStr = new StringBuilder();
-            yield return c.ToString();
-          } else {
-            subStr.Append(c);
-          }
-        }
-        yield return subStr.ToString();
-      }
-
-      private Token MakeToken(string strToken) {
-        Token token = new Token(TokenTypeEnum.String, strToken);
-        if (strToken.Equals(SeparatorToken.stringValue)) {
-          return SeparatorToken;
-        } else if (double.TryParse(strToken, NumberStyles.Float, numberFormatInfo, out token.doubleValue)) {
-          token.type = TokenTypeEnum.Double;
-          return token;
-        }
-
-        // couldn't parse the token as an int or float number so return a string token
-        return token;
-      }
-
-      public Token Peek() {
-        return tokens[0];
-      }
-
-      public Token Next() {
-        Token next = tokens[0];
-        tokens.RemoveAt(0);
-        if (tokens.Count == 0) {
-          ReadNextTokens();
-        }
-        return next;
-      }
-
-      public bool HasNext() {
-        return tokens.Count > 0 || !reader.EndOfStream;
-      }
-    }
-    #endregion
-
-    #region parsing
-    private void Parse() {
-      ParseVariableNames();
-      if (!tokenizer.HasNext()) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
-      ParseValues();
-      if (rowValues.Count == 0) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
-    }
-
-    private void ParseValues() {
-      while (tokenizer.HasNext()) {
-        List<double> row = new List<double>();
-        row.Add(NextValue(tokenizer));
-        while (tokenizer.HasNext() && tokenizer.Peek() == tokenizer.SeparatorToken) {
-          Expect(tokenizer.SeparatorToken);
-          row.Add(NextValue(tokenizer));
-        }
-        Expect(tokenizer.NewlineToken);
-        // all rows have to have the same number of values            
-        // the first row defines how many samples are needed
-        if (rowValues.Count > 0 && rowValues[0].Count != row.Count) {
-          Error("The first row of the dataset has " + rowValues[0].Count + " columns." +
-            "\nLine " + tokenizer.CurrentLineNumber + " has " + row.Count + " columns.", "", tokenizer.CurrentLineNumber);
-        }
-        // add the current row to the collection of rows and start a new row
-        rowValues.Add(row);
-        row = new List<double>();
-      }
-    }
-
-    private double NextValue(Tokenizer tokenizer) {
-      if (tokenizer.Peek() == tokenizer.SeparatorToken || tokenizer.Peek() == tokenizer.NewlineToken) return double.NaN;
-      Token current = tokenizer.Next();
-      if (current.type == TokenTypeEnum.Separator || current.type == TokenTypeEnum.String) {
-        return double.NaN;
-      } else if (current.type == TokenTypeEnum.Double) {
-        // just take the value
-        return current.doubleValue;
-      }
-      // found an unexpected token => throw error 
-      Error("Unexpected token.", current.stringValue, tokenizer.CurrentLineNumber);
-      // this line is never executed because Error() throws an exception
-      throw new InvalidOperationException();
-    }
-
-    private void ParseVariableNames() {
-      // if the first line doesn't start with a double value then we assume that the
-      // first line contains variable names
-      if (tokenizer.HasNext() && tokenizer.Peek().type != TokenTypeEnum.Double) {
-
-        List<Token> tokens = new List<Token>();
-        Token valueToken;
-        valueToken = tokenizer.Next();
-        tokens.Add(valueToken);
-        while (tokenizer.HasNext() && tokenizer.Peek() == tokenizer.SeparatorToken) {
-          Expect(tokenizer.SeparatorToken);
-          valueToken = tokenizer.Next();
-          if (valueToken != tokenizer.NewlineToken) {
-            tokens.Add(valueToken);
-          }
-        }
-        if (valueToken != tokenizer.NewlineToken) {
-          Expect(tokenizer.NewlineToken);
-        }
-        variableNames = tokens.Select(x => x.stringValue.Trim()).ToList();
-      }
-    }
-
-    private void Expect(Token expectedToken) {
-      Token actualToken = tokenizer.Next();
-      if (actualToken != expectedToken) {
-        Error("Expected: " + expectedToken, actualToken.stringValue, tokenizer.CurrentLineNumber);
-      }
-    }
-
-    private void Error(string message, string token, int lineNumber) {
-      throw new DataFormatException("Error while parsing.\n" + message, token, lineNumber);
-    }
-    #endregion
-  }
-}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblem.cs	(revision 5275)
@@ -35,9 +35,10 @@
   public class DataAnalysisProblem : ParameterizedNamedItem, IDataAnalysisProblem, IStorableContent {
     private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
+
+    public string Filename { get; set; }
+
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Type; }
     }
-
-    public string Filename { get; set; }
 
     #region Parameter Properties
@@ -54,4 +55,10 @@
     [StorableConstructor]
     protected DataAnalysisProblem(bool deserializing) : base(deserializing) { }
+    protected DataAnalysisProblem(DataAnalysisProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEvents();
+      RegisterParameterValueEvents();
+    }
+
     public DataAnalysisProblem()
       : base() {
@@ -62,5 +69,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       RegisterParameterEvents();
       RegisterParameterValueEvents();
@@ -90,8 +97,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DataAnalysisProblem clone = (DataAnalysisProblem)base.Clone(cloner);
-      clone.RegisterParameterEvents();
-      clone.RegisterParameterValueEvents();
-      return clone;
+      return new DataAnalysisProblem(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblemData.cs	(revision 5275)
@@ -34,10 +34,8 @@
   [StorableClass]
   public class DataAnalysisProblemData : ParameterizedNamedItem, IStorableContent {
-    private bool suppressEvents = false;
-
+    protected bool suppressEvents = false;
     #region IStorableContent Members
     public string Filename { get; set; }
     #endregion
-
     #region default data
     // y = x^4 + x^3 + x^2 + x
@@ -71,6 +69,6 @@
     #endregion
     #region parameter properties
-    public IValueParameter<Dataset> DatasetParameter {
-      get { return (IValueParameter<Dataset>)Parameters["Dataset"]; }
+    public ValueParameter<Dataset> DatasetParameter {
+      get { return (ValueParameter<Dataset>)Parameters["Dataset"]; }
     }
     public IValueParameter<StringValue> TargetVariableParameter {
@@ -92,9 +90,12 @@
       get { return (IValueParameter<IntValue>)Parameters["TestSamplesEnd"]; }
     }
+    public IValueParameter<PercentValue> ValidationPercentageParameter {
+      get { return (IValueParameter<PercentValue>)Parameters["ValidationPercentage"]; }
+    }
     #endregion
 
     #region properties
     public Dataset Dataset {
-      get { return (Dataset)DatasetParameter.Value; }
+      get { return DatasetParameter.Value; }
       set {
         if (value != Dataset) {
@@ -105,5 +106,5 @@
     }
     public StringValue TargetVariable {
-      get { return (StringValue)TargetVariableParameter.Value; }
+      get { return TargetVariableParameter.Value; }
       set {
         if (value != TargetVariableParameter.Value) {
@@ -115,5 +116,5 @@
     }
     public ICheckedItemList<StringValue> InputVariables {
-      get { return (ICheckedItemList<StringValue>)InputVariablesParameter.Value; }
+      get { return InputVariablesParameter.Value; }
       set {
         if (value != InputVariables) {
@@ -125,5 +126,5 @@
     }
     public IntValue TrainingSamplesStart {
-      get { return (IntValue)TrainingSamplesStartParameter.Value; }
+      get { return TrainingSamplesStartParameter.Value; }
       set {
         if (value != TrainingSamplesStart) {
@@ -135,5 +136,5 @@
     }
     public IntValue TrainingSamplesEnd {
-      get { return (IntValue)TrainingSamplesEndParameter.Value; }
+      get { return TrainingSamplesEndParameter.Value; }
       set {
         if (value != TrainingSamplesEnd) {
@@ -145,5 +146,5 @@
     }
     public IntValue TestSamplesStart {
-      get { return (IntValue)TestSamplesStartParameter.Value; }
+      get { return TestSamplesStartParameter.Value; }
       set {
         if (value != TestSamplesStart) {
@@ -155,5 +156,5 @@
     }
     public IntValue TestSamplesEnd {
-      get { return (IntValue)TestSamplesEndParameter.Value; }
+      get { return TestSamplesEndParameter.Value; }
       set {
         if (value != TestSamplesEnd) {
@@ -164,6 +165,37 @@
       }
     }
-    #endregion
-
+    public PercentValue ValidationPercentage {
+      get { return ValidationPercentageParameter.Value; }
+      set {
+        if (value != ValidationPercentage) {
+          if (value == null) throw new ArgumentNullException();
+          if (value.Value < 0 || value.Value > 1) throw new ArgumentException("ValidationPercentage must be between 0 and 1.");
+          if (ValidationPercentage != null) DeregisterValueTypeEventHandlers(ValidationPercentage);
+          ValidationPercentageParameter.Value = value;
+        }
+      }
+    }
+
+    public IEnumerable<int> TrainingIndizes {
+      get {
+        return Enumerable.Range(TrainingSamplesStart.Value, TrainingSamplesEnd.Value - TrainingSamplesStart.Value)
+                         .Where(i => i >= 0 && i < Dataset.Rows && (i < TestSamplesStart.Value || TestSamplesEnd.Value <= i));
+      }
+    }
+    public IEnumerable<int> TestIndizes {
+      get {
+        return Enumerable.Range(TestSamplesStart.Value, TestSamplesEnd.Value - TestSamplesStart.Value)
+           .Where(i => i >= 0 && i < Dataset.Rows);
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected DataAnalysisProblemData(bool deserializing) : base(deserializing) { }
+    protected DataAnalysisProblemData(DataAnalysisProblemData original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEventHandlers();
+      RegisterParameterValueEventHandlers();
+    }
     public DataAnalysisProblemData()
       : base() {
@@ -181,4 +213,7 @@
       Parameters.Add(new ValueParameter<IntValue>("TestSamplesStart", new IntValue(15)));
       Parameters.Add(new ValueParameter<IntValue>("TestSamplesEnd", new IntValue(25)));
+      Parameters.Add(new ValueParameter<PercentValue>("ValidationPercentage", "The relative amount of the training samples that should be used as validation set.", new PercentValue(0.5)));
+
+      DatasetParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
       RegisterParameterEventHandlers();
       RegisterParameterValueEventHandlers();
@@ -187,5 +222,5 @@
     public DataAnalysisProblemData(Dataset dataset, IEnumerable<string> inputVariables, string targetVariable,
       int trainingSamplesStart, int trainingSamplesEnd, int testSamplesStart, int testSamplesEnd) {
-      var inputVariablesList = new CheckedItemList<StringValue>(inputVariables.Select(x => new StringValue(x)));
+      var inputVariablesList = new CheckedItemList<StringValue>(inputVariables.Select(x => new StringValue(x)).ToList());
       StringValue targetVariableValue = new StringValue(targetVariable);
       var validTargetVariables = new ItemSet<StringValue>();
@@ -201,13 +236,21 @@
       Parameters.Add(new ValueParameter<IntValue>("TestSamplesStart", new IntValue(testSamplesStart)));
       Parameters.Add(new ValueParameter<IntValue>("TestSamplesEnd", new IntValue(testSamplesEnd)));
+      Parameters.Add(new ValueParameter<PercentValue>("ValidationPercentage", "The relative amount of the training samples that should be used as validation set.", new PercentValue(0.5)));
+
+      DatasetParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
       RegisterParameterEventHandlers();
       RegisterParameterValueEventHandlers();
     }
 
-    [StorableConstructor]
-    private DataAnalysisProblemData(bool deserializing) : base(deserializing) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DataAnalysisProblemData(this, cloner);
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("ValidationPercentage"))
+        Parameters.Add(new ValueParameter<PercentValue>("ValidationPercentage", "The relative amount of the training samples that should be used as validation set.", new PercentValue(0.5)));
+
+      DatasetParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
       RegisterParameterEventHandlers();
       RegisterParameterValueEventHandlers();
@@ -217,5 +260,14 @@
     public event EventHandler ProblemDataChanged;
     protected virtual void OnProblemDataChanged(EventArgs e) {
-      if (!suppressEvents) {
+      if (TrainingSamplesStart.Value < 0) TrainingSamplesStart.Value = 0;
+      else if (TestSamplesStart.Value < 0) TestSamplesStart.Value = 0;
+      else if (TrainingSamplesEnd.Value > Dataset.Rows - 1) TrainingSamplesEnd.Value = Dataset.Rows - 1;
+      else if (TestSamplesEnd.Value > Dataset.Rows - 1) TestSamplesEnd.Value = Dataset.Rows - 1;
+      else if (TrainingSamplesStart.Value > TrainingSamplesEnd.Value) TrainingSamplesStart.Value = TestSamplesEnd.Value;
+      else if (TestSamplesStart.Value > TestSamplesEnd.Value) TestSamplesStart.Value = TestSamplesEnd.Value;
+      else if (ValidationPercentage.Value < 0) ValidationPercentage.Value = 0;
+      else if (ValidationPercentage.Value > 1) ValidationPercentage.Value = 1;
+      else if (!TrainingIndizes.Any()) throw new ArgumentException("No training samples are available.");
+      else if (!suppressEvents) {
         var listeners = ProblemDataChanged;
         if (listeners != null) listeners(this, e);
@@ -231,4 +283,5 @@
       TestSamplesStartParameter.ValueChanged += new EventHandler(TestSamplesStartParameter_ValueChanged);
       TestSamplesEndParameter.ValueChanged += new EventHandler(TestSamplesEndParameter_ValueChanged);
+      ValidationPercentageParameter.ValueChanged += new EventHandler(ValidationPercentageParameter_ValueChanged);
     }
 
@@ -240,4 +293,5 @@
       RegisterValueTypeEventHandlers(TestSamplesStart);
       RegisterValueTypeEventHandlers(TestSamplesEnd);
+      RegisterValueTypeEventHandlers(ValidationPercentage);
     }
 
@@ -271,4 +325,8 @@
     private void TestSamplesEndParameter_ValueChanged(object sender, EventArgs e) {
       RegisterValueTypeEventHandlers(TestSamplesEnd);
+      OnProblemDataChanged(EventArgs.Empty);
+    }
+    private void ValidationPercentageParameter_ValueChanged(object sender, EventArgs e) {
+      RegisterValueTypeEventHandlers(ValidationPercentage);
       OnProblemDataChanged(EventArgs.Empty);
     }
@@ -338,5 +396,5 @@
 
     public virtual void ImportFromFile(string fileName) {
-      var csvFileParser = new CsvFileParser();
+      var csvFileParser = new TableFileParser();
       csvFileParser.Parse(fileName);
       suppressEvents = true;
@@ -352,17 +410,10 @@
       InputVariables.SetItemCheckedState(variableNames.First(), false);
       int middle = (int)(csvFileParser.Rows * 0.5);
+      TrainingSamplesEnd = new IntValue(middle);
       TrainingSamplesStart = new IntValue(0);
-      TrainingSamplesEnd = new IntValue(middle);
+      TestSamplesEnd = new IntValue(csvFileParser.Rows);
       TestSamplesStart = new IntValue(middle);
-      TestSamplesEnd = new IntValue(csvFileParser.Rows);
       suppressEvents = false;
       OnProblemDataChanged(EventArgs.Empty);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      DataAnalysisProblemData clone = (DataAnalysisProblemData)base.Clone(cloner);
-      clone.RegisterParameterEventHandlers();
-      clone.RegisterParameterValueEventHandlers();
-      return clone;
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs	(revision 5275)
@@ -38,5 +38,14 @@
     #endregion
 
-
+    [StorableConstructor]
+    protected DataAnalysisSolution(bool deserializing) : base(deserializing) { }
+    protected DataAnalysisSolution(DataAnalysisSolution original, Cloner cloner)
+      : base(original, cloner) {
+      problemData = (DataAnalysisProblemData)cloner.Clone(original.problemData);
+      model = (IDataAnalysisModel)cloner.Clone(original.model);
+      lowerEstimationLimit = original.lowerEstimationLimit;
+      upperEstimationLimit = original.upperEstimationLimit;
+      AfterDeserialization();
+    }
     protected DataAnalysisSolution()
       : base() { }
@@ -47,11 +56,9 @@
       this.lowerEstimationLimit = lowerEstimationLimit;
       this.upperEstimationLimit = upperEstimationLimit;
-      Initialize();
+      AfterDeserialization();
     }
 
-    [StorableConstructor]
-    protected DataAnalysisSolution(bool deserializing) : base(deserializing) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       if (problemData != null)
         RegisterProblemDataEvents();
@@ -134,5 +141,4 @@
     public event EventHandler ProblemDataChanged;
     protected virtual void OnProblemDataChanged() {
-      RecalculateEstimatedValues();
       var listeners = ProblemDataChanged;
       if (listeners != null)
@@ -142,7 +148,7 @@
     public event EventHandler ModelChanged;
     protected virtual void OnModelChanged() {
-      EventHandler handler = ModelChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      EventHandler listeners = ModelChanged;
+      if (listeners != null)
+        listeners(this, EventArgs.Empty);
     }
 
@@ -155,14 +161,4 @@
     #endregion
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      DataAnalysisSolution clone = (DataAnalysisSolution)base.Clone(cloner);
-      clone.problemData = (DataAnalysisProblemData)cloner.Clone(problemData);
-      clone.model = (IDataAnalysisModel)cloner.Clone(model);
-      clone.lowerEstimationLimit = lowerEstimationLimit;
-      clone.upperEstimationLimit = upperEstimationLimit;
-      clone.Initialize();
-
-      return clone;
-    }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataFormatException.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataFormatException.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/DataFormatException.cs	(revision 5275)
@@ -21,6 +21,8 @@
 
 using System;
+using System.Runtime.Serialization;
 
 namespace HeuristicLab.Problems.DataAnalysis {
+  [Serializable]
   public class DataFormatException : Exception {
     private int line;
@@ -37,4 +39,6 @@
       this.line = line;
     }
+
+    public DataFormatException(SerializationInfo info, StreamingContext context) : base(info, context) { }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 5275)
@@ -32,14 +32,11 @@
   [StorableClass]
   public sealed class Dataset : NamedItem, IStringConvertibleMatrix {
-    // empty constructor for cloning
-    private Dataset()
-      : base() {
-    }
-
     [StorableConstructor]
-    private Dataset(bool deserializing)
-      : base(deserializing) {
-    }
-
+    private Dataset(bool deserializing) : base(deserializing) { }
+    private Dataset(Dataset original, Cloner cloner)
+      : base(original, cloner) {
+      variableNames = original.variableNames;
+      data = original.data;
+    }
     public Dataset(IEnumerable<string> variableNames, double[,] data)
       : base() {
@@ -122,6 +119,4 @@
     }
 
-
-
     public string GetVariableName(int variableIndex) {
       return variableNames[variableIndex];
@@ -140,8 +135,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Dataset clone = (Dataset)base.Clone(cloner);
-      clone.variableNames = variableNames;
-      clone.data = data;
-      return clone;
+      return new Dataset(this, cloner);
     }
 
@@ -195,26 +187,37 @@
     }
 
+    public event EventHandler ColumnsChanged;
+    private void OnColumnsChanged() {
+      var handler = ColumnsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    private void OnRowsChanged() {
+      var handler = RowsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     private void OnColumnNamesChanged() {
-      EventHandler handler = ColumnNamesChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      EventHandler listeners = ColumnNamesChanged;
+      if (listeners != null)
+        listeners(this, EventArgs.Empty);
     }
     public event EventHandler RowNamesChanged;
     private void OnRowNamesChanged() {
-      EventHandler handler = RowNamesChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      EventHandler listeners = RowNamesChanged;
+      if (listeners != null)
+        listeners(this, EventArgs.Empty);
     }
     public event EventHandler SortableViewChanged;
     private void OnSortableViewChanged() {
-      EventHandler handler = SortableViewChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      EventHandler listeners = SortableViewChanged;
+      if (listeners != null)
+        listeners(this, EventArgs.Empty);
     }
     public event EventHandler<EventArgs<int, int>> ItemChanged;
     private void OnItemChanged(int rowIndex, int columnIndex) {
-      if (ItemChanged != null)
-        ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
+      var listeners = ItemChanged;
+      if (listeners != null)
+        listeners(this, new EventArgs<int, int>(rowIndex, columnIndex));
       OnToStringChanged();
     }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/OnlineCovarianceEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/OnlineCovarianceEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/OnlineCovarianceEvaluator.cs	(revision 5275)
@@ -25,5 +25,5 @@
   public class OnlineCovarianceEvaluator : IOnlineEvaluator {
 
-    private double xMean, yMean, Cn;
+    private double originalMean, estimatedMean, Cn;
     private int n;
     public double Covariance {
@@ -47,22 +47,21 @@
       n = 0;
       Cn = 0.0;
-      xMean = 0.0;
-      yMean = 0.0;
+      originalMean = 0.0;
+      estimatedMean = 0.0;
     }
 
-    public void Add(double x, double y) {
-      if (double.IsNaN(x) || double.IsInfinity(x) ||
-          double.IsNaN(y) || double.IsInfinity(y)) {
+    public void Add(double original, double estimated) {
+      if (double.IsNaN(estimated) || double.IsInfinity(estimated) ||
+          double.IsNaN(original) || double.IsInfinity(original)) {
         throw new ArgumentException("Covariance is not defined for series containing NaN or infinity elements");
       } else {
         n++;
         // online calculation of tMean
-
-        xMean = xMean + (x - xMean) / n;
-        double deltaY = y - yMean; // delta = (y - yMean(n-1))
-        yMean = yMean + deltaY / n;
+        originalMean = originalMean + (original - originalMean) / n;
+        double delta = estimated - estimatedMean; // delta = (y - yMean(n-1))
+        estimatedMean = estimatedMean + delta / n;
 
         // online calculation of covariance
-        Cn = Cn + deltaY * (x - xMean); // C(n) = C(n-1) + (y - yMean(n-1)) (x - xMean(n))
+        Cn = Cn + delta * (original - originalMean); // C(n) = C(n-1) + (y - yMean(n-1)) (t - tMean(n))       
       }
     }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleEvaluator.cs	(revision 5275)
@@ -20,8 +20,10 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -32,4 +34,9 @@
     public ILookupParameter<DoubleMatrix> ValuesParameter {
       get { return (ILookupParameter<DoubleMatrix>)Parameters["Values"]; }
+    }
+    [StorableConstructor]
+    protected SimpleEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleEvaluator(SimpleEvaluator original, Cloner cloner)
+      : base(original, cloner) {
     }
     public SimpleEvaluator()
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMSEEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMSEEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMSEEvaluator.cs	(revision 5275)
@@ -23,7 +23,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -34,4 +36,12 @@
     }
 
+    [StorableConstructor]
+    protected SimpleMSEEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleMSEEvaluator(SimpleMSEEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleMSEEvaluator(this, cloner);
+    }
     public SimpleMSEEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("MeanSquaredError", "The mean squared error of estimated values."));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageErrorEvaluator.cs	(revision 5275)
@@ -23,7 +23,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -33,4 +35,9 @@
     }
 
+    [StorableConstructor]
+    protected SimpleMeanAbsolutePercentageErrorEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleMeanAbsolutePercentageErrorEvaluator(SimpleMeanAbsolutePercentageErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SimpleMeanAbsolutePercentageErrorEvaluator() {
       Parameters.Add(new LookupParameter<PercentValue>("AverageRelativeError", "The average relative error of estimated values."));
@@ -43,4 +50,8 @@
                       select values[i, ESTIMATION_INDEX];
       AverageRelativeErrorParameter.ActualValue = new PercentValue(Calculate(original, estimated));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleMeanAbsolutePercentageErrorEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageOfRangeErrorEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageOfRangeErrorEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleMeanAbsolutePercentageOfRangeErrorEvaluator.cs	(revision 5275)
@@ -27,4 +27,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -35,4 +36,9 @@
     }
 
+    [StorableConstructor]
+    protected SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(SimpleMeanAbsolutePercentageOfRangeErrorEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SimpleMeanAbsolutePercentageOfRangeErrorEvaluator() {
       Parameters.Add(new LookupParameter<PercentValue>("AveragePercentageOfRangeError", "The average relative (percentage of range) error of estimated values."));
@@ -45,4 +51,8 @@
                       select values[i, ESTIMATION_INDEX];
       AveragePercentageOfRangeErrorParameter.ActualValue = new PercentValue(Calculate(original, estimated));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleNMSEEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleNMSEEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleNMSEEvaluator.cs	(revision 5275)
@@ -23,7 +23,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -34,4 +36,12 @@
     }
 
+    [StorableConstructor]
+    protected SimpleNMSEEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleNMSEEvaluator(SimpleNMSEEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleNMSEEvaluator(this, cloner);
+    }
     public SimpleNMSEEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("NormalizedMeanSquaredError", "The normalized mean squared error (divided by variance) of estimated values."));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleRSquaredEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleRSquaredEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleRSquaredEvaluator.cs	(revision 5275)
@@ -23,7 +23,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -32,5 +34,12 @@
       get { return (ILookupParameter<DoubleValue>)Parameters["RSquared"]; }
     }
-
+    [StorableConstructor]
+    protected SimpleRSquaredEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleRSquaredEvaluator(SimpleRSquaredEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleRSquaredEvaluator(this, cloner);
+    }
     public SimpleRSquaredEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("RSquared", "The squared Pearson's Product Moment Correlation (R²) of estimated values and original values."));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleVarianceAccountedForEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleVarianceAccountedForEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleVarianceAccountedForEvaluator.cs	(revision 5275)
@@ -27,4 +27,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.DataAnalysis.Evaluators {
@@ -40,4 +41,12 @@
     }
 
+    [StorableConstructor]
+    protected SimpleVarianceAccountedForEvaluator(bool deserializing) : base(deserializing) { }
+    protected SimpleVarianceAccountedForEvaluator(SimpleVarianceAccountedForEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleVarianceAccountedForEvaluator(this, cloner);
+    }
     public SimpleVarianceAccountedForEvaluator() {
       Parameters.Add(new LookupParameter<DoubleValue>("VarianceAccountedFor", "The variance of the original values accounted for by the estimated values (VAF(y,y') = 1 - var(y-y') / var(y) )."));
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj	(revision 5275)
@@ -107,4 +107,7 @@
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Core-3.3">
       <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
@@ -158,4 +161,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Interfaces\ISingleObjectiveDataAnalysisProblem.cs" />
+    <Compile Include="TableFileParser.cs" />
     <None Include="HeuristicLab.snk" />
     <None Include="HeuristicLabProblemsDataAnalysisPlugin.cs.frame" />
@@ -166,5 +171,4 @@
     <Compile Include="Evaluators\OnlineNormalizedMeanSquaredErrorEvaluator.cs" />
     <Compile Include="DataAnalysisSolution.cs" />
-    <Compile Include="CsvFileParser.cs" />
     <Compile Include="DataAnalysisProblem.cs" />
     <Compile Include="DataAnalysisProblemData.cs" />
@@ -269,3 +273,7 @@
 SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabProblemsDataAnalysisPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabProblemsDataAnalysisPlugin.cs"</PreBuildEvent>
   </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame	(revision 5275)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis","3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "2.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.1")]
   [PluginDependency("HeuristicLab.Collections", "3.3.0.0")]
   [PluginDependency("HeuristicLab.Common", "3.3.0.0")]
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IDataAnalysisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IDataAnalysisProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/IDataAnalysisProblem.cs	(revision 5275)
@@ -24,4 +24,5 @@
 namespace HeuristicLab.Problems.DataAnalysis {
   public interface IDataAnalysisProblem : IProblem {
+    DataAnalysisProblemData DataAnalysisProblemData { get; }
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/ISingleObjectiveDataAnalysisProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/ISingleObjectiveDataAnalysisProblem.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Interfaces/ISingleObjectiveDataAnalysisProblem.cs	(revision 5275)
@@ -0,0 +1,26 @@
+#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 HeuristicLab.Optimization;
+namespace HeuristicLab.Problems.DataAnalysis {
+  public interface ISingleObjectiveDataAnalysisProblem : ISingleObjectiveProblem, IDataAnalysisProblem {
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressure.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressure.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressure.cs	(revision 5275)
@@ -32,4 +32,5 @@
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -80,5 +81,6 @@
     }
 
-    public CovariantParsimonyPressure(bool deserializing) : base(deserializing) { }
+    protected CovariantParsimonyPressure(bool deserializing) : base(deserializing) { }
+    protected CovariantParsimonyPressure(CovariantParsimonyPressure original, Cloner clone) : base(original, clone) { }
     public CovariantParsimonyPressure()
       : base() {
@@ -98,4 +100,9 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("InvertComplexityAdaption"));
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovariantParsimonyPressure(this, cloner);
+    }
+
 
     [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressureAdder.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressureAdder.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/CovariantParsimonyPressureAdder.cs	(revision 5275)
@@ -32,4 +32,5 @@
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -66,5 +67,6 @@
 
     [StorableConstructor]
-    public CovariantParsimonyPressureAdder(bool deserializing) : base(deserializing) { }
+    protected CovariantParsimonyPressureAdder(bool deserializing) : base(deserializing) { }
+    protected CovariantParsimonyPressureAdder(CovariantParsimonyPressureAdder original, Cloner cloner) : base(original, cloner) { }
     public CovariantParsimonyPressureAdder()
       : base() {
@@ -79,5 +81,7 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("ApplyParsimonyPressure"));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovariantParsimonyPressureAdder(this, cloner);
+    }
     [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
     private void AfterDeserialization() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqComparator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqComparator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqComparator.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -81,4 +82,9 @@
     }
 
+    [StorableConstructor]
+    protected DynOpEqComparator(bool deserializing) : base(deserializing) { }
+    protected DynOpEqComparator(DynOpEqComparator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DynOpEqComparator()
       : base() {
@@ -100,4 +106,7 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DynOpEqComparator(this, cloner);
+    }
     public override IOperation Apply() {
       if (ResultParameter.ActualValue == null || ResultParameter.ActualValue.Value == true) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqHistogramInitializer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqHistogramInitializer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynOpEqHistogramInitializer.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -63,4 +64,9 @@
     }
 
+    [StorableConstructor]
+    protected DynOpEqHistogramInitializer(bool deserializing) : base(deserializing) { }
+    protected DynOpEqHistogramInitializer(DynOpEqHistogramInitializer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DynOpEqHistogramInitializer()
       : base() {
@@ -75,5 +81,7 @@
       Parameters.Add(new LookupParameter<BoolValue>("Maximization"));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DynOpEqHistogramInitializer(this, cloner);
+    }
     public override IOperation Apply() {
       if (BinCapacityParameter.ActualValue == null) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitComparator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitComparator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitComparator.cs	(revision 5275)
@@ -29,4 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -65,4 +66,10 @@
     }
 
+    [StorableConstructor]
+    protected DynamicDepthLimitComparator(bool deserializing) : base(deserializing) { }
+    protected DynamicDepthLimitComparator(DynamicDepthLimitComparator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
     public DynamicDepthLimitComparator()
       : base() {
@@ -77,4 +84,8 @@
       Parameters.Add(new ValueParameter<DoubleValue>("cLower", "", new DoubleValue(0.03)));
       Parameters.Add(new ValueParameter<DoubleValue>("cRaise", "", new DoubleValue(0.015)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DynamicDepthLimitComparator(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitInitializer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitInitializer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/DynamicDepthLimitInitializer.cs	(revision 5275)
@@ -29,4 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -41,8 +42,16 @@
     }
 
+    [StorableConstructor]
+    protected DynamicDepthLimitInitializer(bool deserializing) : base(deserializing) { }
+    protected DynamicDepthLimitInitializer(DynamicDepthLimitInitializer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DynamicDepthLimitInitializer()
       : base() {
       Parameters.Add(new ValueLookupParameter<IntValue>("DynamicDepthLimit", "The current depth limit."));
       Parameters.Add(new ValueLookupParameter<IntValue>("InitialDepthLimit", "The initial depth limit."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DynamicDepthLimitInitializer(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/WeightedParentsQualityVarianceComparator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/WeightedParentsQualityVarianceComparator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Operators/WeightedParentsQualityVarianceComparator.cs	(revision 5275)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.Operators {
@@ -61,4 +62,9 @@
     }
 
+    [StorableConstructor]
+    protected WeightedParentsQualityVarianceComparator(bool deserializing) : base(deserializing) { }
+    protected WeightedParentsQualityVarianceComparator(WeightedParentsQualityVarianceComparator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public WeightedParentsQualityVarianceComparator()
       : base() {
@@ -75,5 +81,7 @@
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("RightSideSamples", "The number of samples used to calculate the quality of the parent."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new WeightedParentsQualityVarianceComparator(this, cloner);
+    }
     public override IOperation Apply() {
       double leftQuality = LeftSideParameter.ActualValue.Value;
@@ -114,9 +122,9 @@
       double stat = (xmean - ymean) / Math.Sqrt(xvar / n + yvar / m);
       double c = xvar / n / (xvar / n + yvar / m);
-      double df = (n - 1) * (m - 1) / ((m - 1) * AP.Math.Sqr(c) + (n - 1) * (1 - AP.Math.Sqr(c)));
+      double df = (n - 1) * (m - 1) / ((m - 1) * alglib.math.sqr(c) + (n - 1) * (1 - alglib.math.sqr(c)));
       if ((double)(stat) > (double)(0))
-        p = 1 - 0.5 * ibetaf.incompletebeta(df / 2, 0.5, df / (df + AP.Math.Sqr(stat)));
+        p = 1 - 0.5 * alglib.ibetaf.incompletebeta(df / 2, 0.5, df / (df + alglib.math.sqr(stat)));
       else
-        p = 0.5 * ibetaf.incompletebeta(df / 2, 0.5, df / (df + AP.Math.Sqr(stat)));
+        p = 0.5 * alglib.ibetaf.incompletebeta(df / 2, 0.5, df / (df + alglib.math.sqr(stat)));
       double bothtails = 2 * Math.Min(p, 1 - p);
       double lefttail = p;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer.cs	(revision 5275)
@@ -30,4 +30,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem {
@@ -89,5 +90,9 @@
 
     #endregion
-
+    [StorableConstructor]
+    protected SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer(SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer()
       : base() {
@@ -103,5 +108,7 @@
       Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best support vector solution should be stored."));
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer(this, cloner);
+    }
     public override IOperation Apply() {
       var points = ParameterVectorParameter.ActualValue;
@@ -124,5 +131,5 @@
       if (bestModel == null) {
         bestModel = SupportVectorMachineModelCreator.TrainModel(DataAnalysisProblemData,
-          DataAnalysisProblemData.TrainingSamplesStart.Value, DataAnalysisProblemData.TrainingSamplesEnd.Value,
+          DataAnalysisProblemData.TrainingIndizes,
           SvmType.Value, KernelType.Value, cost, nu, gamma, 0.0);
         BestSolutionParameter.ActualValue = bestModel;
@@ -153,5 +160,5 @@
         if (BestSolutionQualityParameter.ActualValue.Value > bestQuality) {
           bestModel = SupportVectorMachineModelCreator.TrainModel(DataAnalysisProblemData,
-            DataAnalysisProblemData.TrainingSamplesStart.Value, DataAnalysisProblemData.TrainingSamplesEnd.Value,
+            DataAnalysisProblemData.TrainingIndizes,
             SvmType.Value, KernelType.Value, cost, nu, gamma, 0.0);
           BestSolutionParameter.ActualValue = bestModel;
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentEvaluator.cs	(revision 5275)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem {
@@ -107,5 +108,9 @@
     }
     #endregion
-
+    [StorableConstructor]
+    protected SupportVectorMachineParameterAdjustmentEvaluator(bool deserializing) : base(deserializing) { }
+    protected SupportVectorMachineParameterAdjustmentEvaluator(SupportVectorMachineParameterAdjustmentEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public SupportVectorMachineParameterAdjustmentEvaluator()
       : base() {
@@ -130,4 +135,7 @@
       evaluator.Successor = null;
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorMachineParameterAdjustmentEvaluator(this, cloner);
+    }
 
     public override IOperation Apply() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentProblem.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentProblem.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentProblem.cs	(revision 5275)
@@ -130,4 +130,15 @@
     [StorableConstructor]
     private SupportVectorMachineParameterAdjustmentProblem(bool deserializing) : base(deserializing) { }
+    private SupportVectorMachineParameterAdjustmentProblem(SupportVectorMachineParameterAdjustmentProblem original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Where(x => IsNotFieldReferenced(x)).Select(x => (IOperator)cloner.Clone(x)).ToList();
+      strategyVectorCreator = (StdDevStrategyVectorCreator)cloner.Clone(original.strategyVectorCreator);
+      operators.Add(strategyVectorCreator);
+      strategyVectorCrossover = (StdDevStrategyVectorCrossover)cloner.Clone(original.strategyVectorCrossover);
+      operators.Add(strategyVectorCrossover);
+      strategyVectorManipulator = (StdDevStrategyVectorManipulator)cloner.Clone(original.strategyVectorManipulator);
+      operators.Add(strategyVectorManipulator);
+      AttachEventHandlers();
+    }
     public SupportVectorMachineParameterAdjustmentProblem()
       : base() {
@@ -167,16 +178,6 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SupportVectorMachineParameterAdjustmentProblem clone = (SupportVectorMachineParameterAdjustmentProblem)base.Clone(cloner);
-      clone.operators = operators.Where(x => IsNotFieldReferenced(x)).Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.strategyVectorCreator = (StdDevStrategyVectorCreator)cloner.Clone(strategyVectorCreator);
-      clone.operators.Add(clone.strategyVectorCreator);
-      clone.strategyVectorCrossover = (StdDevStrategyVectorCrossover)cloner.Clone(strategyVectorCrossover);
-      clone.operators.Add(strategyVectorCrossover);
-      clone.strategyVectorManipulator = (StdDevStrategyVectorManipulator)cloner.Clone(strategyVectorManipulator);
-      clone.operators.Add(strategyVectorManipulator);
-      clone.AttachEventHandlers();
-      return clone;
-    }
-
+      return new SupportVectorMachineParameterAdjustmentProblem(this, cloner);
+    }
     private bool IsNotFieldReferenced(IOperator x) {
       return !(x == strategyVectorCreator
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineCrossValidationEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineCrossValidationEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineCrossValidationEvaluator.cs	(revision 5275)
@@ -21,5 +21,7 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -125,4 +127,10 @@
     #endregion
 
+    [StorableConstructor]
+    protected SupportVectorMachineCrossValidationEvaluator(bool deserializing) : base(deserializing) { }
+
+    protected SupportVectorMachineCrossValidationEvaluator(SupportVectorMachineCrossValidationEvaluator original,
+      Cloner cloner)
+      : base(original, cloner) { }
     public SupportVectorMachineCrossValidationEvaluator()
       : base() {
@@ -142,15 +150,27 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorMachineCrossValidationEvaluator(this, cloner);
+    }
+
     public override IOperation Apply() {
-      double reductionRatio = 1.0;
+      double reductionRatio = 1.0; // TODO: make parameter
       if (ActualSamplesParameter.ActualValue != null)
         reductionRatio = ActualSamplesParameter.ActualValue.Value;
-
-      int reducedRows = (int)((SamplesEnd.Value - SamplesStart.Value) * reductionRatio);
+      IEnumerable<int> rows =
+        Enumerable.Range(SamplesStart.Value, SamplesEnd.Value - SamplesStart.Value)
+        .Where(i => i < DataAnalysisProblemData.TestSamplesStart.Value || DataAnalysisProblemData.TestSamplesEnd.Value <= i);
+
+      // create a new DataAnalysisProblemData instance
       DataAnalysisProblemData reducedProblemData = (DataAnalysisProblemData)DataAnalysisProblemData.Clone();
-      reducedProblemData.Dataset = CreateReducedDataset(RandomParameter.ActualValue, reducedProblemData.Dataset, reductionRatio, SamplesStart.Value, SamplesEnd.Value);
+      reducedProblemData.Dataset =
+        CreateReducedDataset(RandomParameter.ActualValue, reducedProblemData.Dataset, rows, reductionRatio);
+      reducedProblemData.TrainingSamplesStart.Value = 0;
+      reducedProblemData.TrainingSamplesEnd.Value = reducedProblemData.Dataset.Rows;
+      reducedProblemData.TestSamplesStart.Value = reducedProblemData.Dataset.Rows;
+      reducedProblemData.TestSamplesEnd.Value = reducedProblemData.Dataset.Rows;
+      reducedProblemData.ValidationPercentage.Value = 0;
 
       double quality = PerformCrossValidation(reducedProblemData,
-                             SamplesStart.Value, SamplesStart.Value + reducedRows,
                              SvmType.Value, KernelType.Value,
                              Cost.Value, Nu.Value, Gamma.Value, Epsilon.Value, NumberOfFolds.Value);
@@ -160,6 +180,6 @@
     }
 
-    private Dataset CreateReducedDataset(IRandom random, Dataset dataset, double reductionRatio, int start, int end) {
-      int n = (int)((end - start) * reductionRatio);
+    private Dataset CreateReducedDataset(IRandom random, Dataset dataset, IEnumerable<int> rowIndices, double reductionRatio) {
+
       // must not make a fink:
       // => select n rows randomly from start..end
@@ -168,24 +188,28 @@
 
       // all possible rowIndexes from start..end
-      int[] rowIndexes = Enumerable.Range(start, end - start).ToArray();
+      int[] rowIndexArr = rowIndices.ToArray();
+      int n = (int)Math.Max(1.0, rowIndexArr.Length * reductionRatio);
 
       // knuth shuffle
-      for (int i = rowIndexes.Length - 1; i > 0; i--) {
+      for (int i = rowIndexArr.Length - 1; i > 0; i--) {
         int j = random.Next(0, i);
         // swap
-        int tmp = rowIndexes[i];
-        rowIndexes[i] = rowIndexes[j];
-        rowIndexes[j] = tmp;
+        int tmp = rowIndexArr[i];
+        rowIndexArr[i] = rowIndexArr[j];
+        rowIndexArr[j] = tmp;
       }
 
       // take the first n indexes (selected n rowIndexes from start..end)
       // now order by index
-      var orderedRandomIndexes = rowIndexes.Take(n).OrderBy(x => x).ToArray();
-
-      // now build a dataset collecting the rows from orderedRandomIndexes into the dataset starting at index start
-      double[,] reducedData = dataset.GetClonedData();
+      int[] orderedRandomIndexes =
+        rowIndexArr.Take(n)
+        .OrderBy(x => x)
+        .ToArray();
+
+      // now build a dataset containing only rows from orderedRandomIndexes 
+      double[,] reducedData = new double[n, dataset.Columns];
       for (int i = 0; i < n; i++) {
         for (int column = 0; column < dataset.Columns; column++) {
-          reducedData[start + i, column] = dataset[orderedRandomIndexes[i], column];
+          reducedData[i, column] = dataset[orderedRandomIndexes[i], column];
         }
       }
@@ -198,10 +222,10 @@
       double cost, double nu, double gamma, double epsilon,
       int nFolds) {
-      return PerformCrossValidation(problemData, problemData.TrainingSamplesStart.Value, problemData.TrainingSamplesEnd.Value, svmType, kernelType, cost, nu, gamma, epsilon, nFolds);
+      return PerformCrossValidation(problemData, problemData.TrainingIndizes, svmType, kernelType, cost, nu, gamma, epsilon, nFolds);
     }
 
     public static double PerformCrossValidation(
       DataAnalysisProblemData problemData,
-      int start, int end,
+      IEnumerable<int> rowIndices,
       string svmType, string kernelType,
       double cost, double nu, double gamma, double epsilon,
@@ -221,5 +245,5 @@
 
 
-      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, start, end);
+      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, rowIndices);
       SVM.RangeTransform rangeTransform = SVM.RangeTransform.Compute(problem);
       SVM.Problem scaledProblem = Scaling.Scale(rangeTransform, problem);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModel.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 5275)
@@ -36,8 +36,14 @@
   [StorableClass]
   [Item("SupportVectorMachineModel", "Represents a support vector machine model.")]
-  public class SupportVectorMachineModel : NamedItem, IDataAnalysisModel {
-    public SupportVectorMachineModel()
-      : base() {
+  public sealed class SupportVectorMachineModel : NamedItem, IDataAnalysisModel {
+    [StorableConstructor]
+    private SupportVectorMachineModel(bool deserializing) : base(deserializing) { }
+    private SupportVectorMachineModel(SupportVectorMachineModel original, Cloner cloner)
+      : base(original, cloner) {
+      // only using a shallow copy here! (gkronber)
+      this.model = original.model;
+      this.rangeTransform = original.rangeTransform;
     }
+    public SupportVectorMachineModel() : base() { }
 
     private SVM.Model model;
@@ -72,9 +78,10 @@
 
     public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, int start, int end) {
-      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, start, end);
+      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, Enumerable.Range(start, end - start));
       SVM.Problem scaledProblem = Scaling.Scale(RangeTransform, problem);
 
       return (from row in Enumerable.Range(0, scaledProblem.Count)
-              select SVM.Prediction.Predict(Model, scaledProblem.X[row])).ToList();
+              select SVM.Prediction.Predict(Model, scaledProblem.X[row]))
+              .ToList();
     }
 
@@ -130,9 +137,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SupportVectorMachineModel clone = (SupportVectorMachineModel)base.Clone(cloner);
-      // beware we are only using a shallow copy here! (gkronber)
-      clone.model = model;
-      clone.rangeTransform = rangeTransform;
-      return clone;
+      return new SupportVectorMachineModel(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelCreator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelCreator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelCreator.cs	(revision 5275)
@@ -21,4 +21,7 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -34,5 +37,5 @@
   [StorableClass]
   [Item("SupportVectorMachineModelCreator", "Represents an operator that creates a support vector machine model.")]
-  public class SupportVectorMachineModelCreator : SingleSuccessorOperator {
+  public sealed class SupportVectorMachineModelCreator : SingleSuccessorOperator {
     private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
     private const string SvmTypeParameterName = "SvmType";
@@ -108,4 +111,10 @@
     #endregion
 
+    [StorableConstructor]
+    private SupportVectorMachineModelCreator(bool deserializing) : base(deserializing) { }
+    private SupportVectorMachineModelCreator(SupportVectorMachineModelCreator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorMachineModelCreator(this, cloner);
+    }
     public SupportVectorMachineModelCreator()
       : base() {
@@ -125,6 +134,12 @@
 
     public override IOperation Apply() {
+      int start = SamplesStart.Value;
+      int end = SamplesEnd.Value;
+      IEnumerable<int> rows =
+        Enumerable.Range(start, end - start)
+        .Where(i => i < DataAnalysisProblemData.TestSamplesStart.Value || DataAnalysisProblemData.TestSamplesEnd.Value <= i);
+
       SupportVectorMachineModel model = TrainModel(DataAnalysisProblemData,
-                             SamplesStart.Value, SamplesEnd.Value,
+                             rows,
                              SvmType.Value, KernelType.Value,
                              Cost.Value, Nu.Value, Gamma.Value, Epsilon.Value);
@@ -138,10 +153,10 @@
       string svmType, string kernelType,
       double cost, double nu, double gamma, double epsilon) {
-      return TrainModel(problemData, problemData.TrainingSamplesStart.Value, problemData.TrainingSamplesEnd.Value, svmType, kernelType, cost, nu, gamma, epsilon);
+      return TrainModel(problemData, problemData.TrainingIndizes, svmType, kernelType, cost, nu, gamma, epsilon);
     }
 
     public static SupportVectorMachineModel TrainModel(
       DataAnalysisProblemData problemData,
-      int start, int end,
+      IEnumerable<int> trainingIndizes,
       string svmType, string kernelType,
       double cost, double nu, double gamma, double epsilon) {
@@ -160,5 +175,5 @@
 
 
-      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, start, end);
+      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, trainingIndizes);
       SVM.RangeTransform rangeTransform = SVM.RangeTransform.Compute(problem);
       SVM.Problem scaledProblem = Scaling.Scale(rangeTransform, problem);
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelEvaluator.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelEvaluator.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModelEvaluator.cs	(revision 5275)
@@ -20,4 +20,7 @@
 #endregion
 
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -68,4 +71,11 @@
     }
     #endregion
+
+    [StorableConstructor]
+    protected SupportVectorMachineModelEvaluator(bool deserializing) : base(deserializing) { }
+    protected SupportVectorMachineModelEvaluator(SupportVectorMachineModelEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SupportVectorMachineModelEvaluator(this, cloner);
+    }
     public SupportVectorMachineModelEvaluator()
       : base() {
@@ -80,11 +90,14 @@
       int start = SamplesStart.Value;
       int end = SamplesEnd.Value;
+      IEnumerable<int> rows =
+        Enumerable.Range(start, end - start)
+        .Where(i => i < DataAnalysisProblemData.TestSamplesStart.Value || DataAnalysisProblemData.TestSamplesEnd.Value <= i);
 
-      ValuesParameter.ActualValue = new DoubleMatrix(Evaluate(SupportVectorMachineModel, DataAnalysisProblemData, start, end));
+      ValuesParameter.ActualValue = new DoubleMatrix(Evaluate(SupportVectorMachineModel, DataAnalysisProblemData, rows));
       return base.Apply();
     }
 
-    public static double[,] Evaluate(SupportVectorMachineModel model, DataAnalysisProblemData problemData, int start, int end) {
-      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, start, end);
+    public static double[,] Evaluate(SupportVectorMachineModel model, DataAnalysisProblemData problemData, IEnumerable<int> rowIndices) {
+      SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, rowIndices);
       SVM.Problem scaledProblem = model.RangeTransform.Scale(problem);
 
@@ -92,6 +105,8 @@
 
       double[,] values = new double[scaledProblem.Count, 2];
+      var rowEnumerator = rowIndices.GetEnumerator();
       for (int i = 0; i < scaledProblem.Count; i++) {
-        values[i, 0] = problemData.Dataset[start + i, targetVariableIndex];
+        rowEnumerator.MoveNext();
+        values[i, 0] = problemData.Dataset[rowEnumerator.Current, targetVariableIndex];
         values[i, 1] = SVM.Prediction.Predict(model.Model, scaledProblem.X[i]);
       }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineUtil.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineUtil.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineUtil.cs	(revision 5275)
@@ -29,26 +29,27 @@
     /// </summary>
     /// <param name="problemData">The problem data to transform</param>
-    /// <param name="start">The index of the first row of <paramref name="problemData"/> to copy to the output.</param>
-    /// <param name="end">The last of the first row of <paramref name="problemData"/> to copy to the output.</param>
+    /// <param name="rowIndices">The rows of the dataset that should be contained in the resulting SVM-problem</param>
     /// <returns>A problem data type that can be used to train a support vector machine.</returns>
-    public static SVM.Problem CreateSvmProblem(DataAnalysisProblemData problemData, int start, int end) {
-      int rowCount = end - start;
-      var targetVector = problemData.Dataset.GetVariableValues(problemData.TargetVariable.Value, start, end);
+    public static SVM.Problem CreateSvmProblem(DataAnalysisProblemData problemData, IEnumerable<int> rowIndices) {
+      double[] targetVector =
+        problemData.Dataset.GetEnumeratedVariableValues(problemData.TargetVariable.Value, rowIndices)
+        .ToArray();
 
       SVM.Node[][] nodes = new SVM.Node[targetVector.Length][];
       List<SVM.Node> tempRow;
       int maxNodeIndex = 0;
-      for (int row = 0; row < rowCount; row++) {
+      int svmProblemRowIndex = 0;
+      foreach (int row in rowIndices) {
         tempRow = new List<SVM.Node>();
         foreach (var inputVariable in problemData.InputVariables.CheckedItems) {
           int col = problemData.Dataset.GetVariableIndex(inputVariable.Value.Value);
-          double value = problemData.Dataset[start + row, col];
+          double value = problemData.Dataset[row, col];
           if (!double.IsNaN(value)) {
-            int nodeIndex = col + 1; // make sure the smallest nodeIndex = 1
+            int nodeIndex = col + 1; // make sure the smallest nodeIndex is 1 (libSVM convention)
             tempRow.Add(new SVM.Node(nodeIndex, value));
             if (nodeIndex > maxNodeIndex) maxNodeIndex = nodeIndex;
           }
         }
-        nodes[row] = tempRow.OrderBy(x => x.Index).ToArray(); // make sure the values are sorted by node index
+        nodes[svmProblemRowIndex++] = tempRow.OrderBy(x => x.Index).ToArray(); // make sure the values are sorted by node index
       }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/ArithmeticExpressionGrammar.cs	(revision 5275)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
@@ -30,11 +31,15 @@
   [Item("ArithmeticExpressionGrammar", "Represents a grammar for functional expressions using only arithmetic operations.")]
   public class ArithmeticExpressionGrammar : DefaultSymbolicExpressionGrammar {
+
+    [StorableConstructor]
+    protected ArithmeticExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected ArithmeticExpressionGrammar(ArithmeticExpressionGrammar original, Cloner cloner) : base(original, cloner) { }
     public ArithmeticExpressionGrammar()
       : base() {
       Initialize();
     }
-
-    [StorableConstructor]
-    protected ArithmeticExpressionGrammar(bool deserializing) : base(deserializing) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ArithmeticExpressionGrammar(this, cloner);
+    }
 
     private void Initialize() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/BasicExpressionGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/BasicExpressionGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/BasicExpressionGrammar.cs	(revision 5275)
@@ -26,4 +26,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
+using HeuristicLab.Common;
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
   [StorableClass]
@@ -33,4 +34,14 @@
     private HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable variableSymbol;
 
+    [StorableConstructor]
+    protected BasicExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected BasicExpressionGrammar(BasicExpressionGrammar original, Cloner cloner)
+      : base(original, cloner) {
+      foreach (var symb in Symbols) {
+        var varSym = symb as HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable;
+        if (varSym != null) this.variableSymbol = varSym;
+        break;
+      }
+    }
     public BasicExpressionGrammar()
       : base() {
@@ -38,6 +49,7 @@
     }
 
-    [StorableConstructor]
-    protected BasicExpressionGrammar(bool deserializing) : base(deserializing) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BasicExpressionGrammar(this, cloner);
+    }
 
     private void Initialize() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/FullFunctionalExpressionGrammar.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/FullFunctionalExpressionGrammar.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/FullFunctionalExpressionGrammar.cs	(revision 5275)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
@@ -30,10 +31,15 @@
   [Item("FullFunctionalExpressionGrammar", "Represents a grammar for functional expressions using all available functions.")]
   public class FullFunctionalExpressionGrammar : DefaultSymbolicExpressionGrammar {
+    [StorableConstructor]
+    protected FullFunctionalExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected FullFunctionalExpressionGrammar(FullFunctionalExpressionGrammar original, Cloner cloner) : base(original, cloner) { }
     public FullFunctionalExpressionGrammar()
       : base() {
       Initialize();
     }
-    [StorableConstructor]
-    protected FullFunctionalExpressionGrammar(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FullFunctionalExpressionGrammar(this, cloner);
+    }
 
     private void Initialize() {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
@@ -32,6 +33,5 @@
   [StorableClass]
   [Item("SimpleArithmeticExpressionInterpreter", "Interpreter for arithmetic symbolic expression trees including function calls.")]
-  // not thread safe!
-  public class SimpleArithmeticExpressionInterpreter : NamedItem, ISymbolicExpressionTreeInterpreter {
+  public sealed class SimpleArithmeticExpressionInterpreter : NamedItem, ISymbolicExpressionTreeInterpreter {
     private class OpCodes {
       public const byte Add = 1;
@@ -65,5 +65,4 @@
       public const byte Constant = 20;
       public const byte Arg = 21;
-      public const byte Differential = 22;
     }
 
@@ -90,15 +89,7 @@
       { typeof(Constant), OpCodes.Constant },
       { typeof(Argument), OpCodes.Arg },
-      { typeof(DifferentialVariable), OpCodes.Differential},
     };
     private const int ARGUMENT_STACK_SIZE = 1024;
 
-    private Dataset dataset;
-    private int row;
-    private Instruction[] code;
-    private int pc;
-    private double[] argumentStack = new double[ARGUMENT_STACK_SIZE];
-    private int argStackPointer;
-
     public override bool CanChangeName {
       get { return false; }
@@ -108,4 +99,11 @@
     }
 
+    [StorableConstructor]
+    private SimpleArithmeticExpressionInterpreter(bool deserializing) : base(deserializing) { }
+    private SimpleArithmeticExpressionInterpreter(SimpleArithmeticExpressionInterpreter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimpleArithmeticExpressionInterpreter(this, cloner);
+    }
+
     public SimpleArithmeticExpressionInterpreter()
       : base() {
@@ -113,28 +111,171 @@
 
     public IEnumerable<double> GetSymbolicExpressionTreeValues(SymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows) {
-      this.dataset = dataset;
       var compiler = new SymbolicExpressionTreeCompiler();
-      compiler.AddInstructionPostProcessingHook(PostProcessInstruction);
-      code = compiler.Compile(tree, MapSymbolToOpCode);
-      foreach (var row in rows) {
-        this.row = row;
-        pc = 0;
-        argStackPointer = 0;
-        yield return Evaluate();
-      }
-    }
-
-    private Instruction PostProcessInstruction(Instruction instr) {
-      if (instr.opCode == OpCodes.Variable) {
-        var variableTreeNode = instr.dynamicNode as VariableTreeNode;
-        instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
-      } else if (instr.opCode == OpCodes.LagVariable) {
-        var variableTreeNode = instr.dynamicNode as LaggedVariableTreeNode;
-        instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
-      } else if (instr.opCode == OpCodes.Differential) {
-        var variableTreeNode = instr.dynamicNode as DifferentialVariableTreeNode;
-        instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
-      }
-      return instr;
+      Instruction[] code = compiler.Compile(tree, MapSymbolToOpCode);
+
+      for (int i = 0; i < code.Length; i++) {
+        Instruction instr = code[i];
+        if (instr.opCode == OpCodes.Variable) {
+          var variableTreeNode = instr.dynamicNode as VariableTreeNode;
+          instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
+          code[i] = instr;
+        } else if (instr.opCode == OpCodes.LagVariable) {
+          var variableTreeNode = instr.dynamicNode as LaggedVariableTreeNode;
+          instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
+          code[i] = instr;
+        }
+      }
+
+      double[] argumentStack = new double[ARGUMENT_STACK_SIZE];
+      foreach (var rowEnum in rows) {
+        int row = rowEnum;
+        int pc = 0;
+        int argStackPointer = 0;
+        yield return Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+      }
+    }
+
+    private double Evaluate(Dataset dataset, ref int row, Instruction[] code, ref int pc, double[] argumentStack, ref int argStackPointer) {
+      Instruction currentInstr = code[pc++];
+      switch (currentInstr.opCode) {
+        case OpCodes.Add: {
+            double s = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              s += Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            return s;
+          }
+        case OpCodes.Sub: {
+            double s = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              s -= Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            if (currentInstr.nArguments == 1) s = -s;
+            return s;
+          }
+        case OpCodes.Mul: {
+            double p = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              p *= Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            return p;
+          }
+        case OpCodes.Div: {
+            double p = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              p /= Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            if (currentInstr.nArguments == 1) p = 1.0 / p;
+            return p;
+          }
+        case OpCodes.Average: {
+            double sum = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              sum += Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            return sum / currentInstr.nArguments;
+          }
+        case OpCodes.Cos: {
+            return Math.Cos(Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer));
+          }
+        case OpCodes.Sin: {
+            return Math.Sin(Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer));
+          }
+        case OpCodes.Tan: {
+            return Math.Tan(Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer));
+          }
+        case OpCodes.Exp: {
+            return Math.Exp(Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer));
+          }
+        case OpCodes.Log: {
+            return Math.Log(Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer));
+          }
+        case OpCodes.IfThenElse: {
+            double condition = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            double result;
+            if (condition > 0.0) {
+              result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); SkipBakedCode(code, ref pc);
+            } else {
+              SkipBakedCode(code, ref pc); result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            return result;
+          }
+        case OpCodes.AND: {
+            double result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              if (result <= 0.0) SkipBakedCode(code, ref pc);
+              else {
+                result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+              }
+            }
+            return result <= 0.0 ? -1.0 : 1.0;
+          }
+        case OpCodes.OR: {
+            double result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            for (int i = 1; i < currentInstr.nArguments; i++) {
+              if (result > 0.0) SkipBakedCode(code, ref pc);
+              else {
+                result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+              }
+            }
+            return result > 0.0 ? 1.0 : -1.0;
+          }
+        case OpCodes.NOT: {
+            return -Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+          }
+        case OpCodes.GT: {
+            double x = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            double y = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            if (x > y) return 1.0;
+            else return -1.0;
+          }
+        case OpCodes.LT: {
+            double x = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            double y = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            if (x < y) return 1.0;
+            else return -1.0;
+          }
+        case OpCodes.Call: {
+            // evaluate sub-trees
+            // push on argStack in reverse order 
+            for (int i = 0; i < currentInstr.nArguments; i++) {
+              argumentStack[argStackPointer + currentInstr.nArguments - i] = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+            }
+            argStackPointer += currentInstr.nArguments;
+
+            // save the pc
+            int nextPc = pc;
+            // set pc to start of function  
+            pc = currentInstr.iArg0;
+            // evaluate the function
+            double v = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer);
+
+            // decrease the argument stack pointer by the number of arguments pushed
+            // to set the argStackPointer back to the original location
+            argStackPointer -= currentInstr.nArguments;
+
+            // restore the pc => evaluation will continue at point after my subtrees  
+            pc = nextPc;
+            return v;
+          }
+        case OpCodes.Arg: {
+            return argumentStack[argStackPointer - currentInstr.iArg0];
+          }
+        case OpCodes.Variable: {
+            var variableTreeNode = currentInstr.dynamicNode as VariableTreeNode;
+            return dataset[row, currentInstr.iArg0] * variableTreeNode.Weight;
+          }
+        case OpCodes.LagVariable: {
+            var laggedVariableTreeNode = currentInstr.dynamicNode as LaggedVariableTreeNode;
+            int actualRow = row + laggedVariableTreeNode.Lag;
+            if (actualRow < 0 || actualRow >= dataset.Rows) throw new ArgumentException("Out of range access to dataset row: " + row);
+            return dataset[actualRow, currentInstr.iArg0] * laggedVariableTreeNode.Weight;
+          }
+        case OpCodes.Constant: {
+            var constTreeNode = currentInstr.dynamicNode as ConstantTreeNode;
+            return constTreeNode.Value;
+          }
+        default: throw new NotSupportedException();
+      }
     }
 
@@ -146,156 +287,6 @@
     }
 
-    private double Evaluate() {
-      Instruction currentInstr = code[pc++];
-      switch (currentInstr.opCode) {
-        case OpCodes.Add: {
-            double s = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              s += Evaluate();
-            }
-            return s;
-          }
-        case OpCodes.Sub: {
-            double s = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              s -= Evaluate();
-            }
-            if (currentInstr.nArguments == 1) s = -s;
-            return s;
-          }
-        case OpCodes.Mul: {
-            double p = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              p *= Evaluate();
-            }
-            return p;
-          }
-        case OpCodes.Div: {
-            double p = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              p /= Evaluate();
-            }
-            if (currentInstr.nArguments == 1) p = 1.0 / p;
-            return p;
-          }
-        case OpCodes.Average: {
-            double sum = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              sum += Evaluate();
-            }
-            return sum / currentInstr.nArguments;
-          }
-        case OpCodes.Cos: {
-            return Math.Cos(Evaluate());
-          }
-        case OpCodes.Sin: {
-            return Math.Sin(Evaluate());
-          }
-        case OpCodes.Tan: {
-            return Math.Tan(Evaluate());
-          }
-        case OpCodes.Exp: {
-            return Math.Exp(Evaluate());
-          }
-        case OpCodes.Log: {
-            return Math.Log(Evaluate());
-          }
-        case OpCodes.IfThenElse: {
-            double condition = Evaluate();
-            double result;
-            if (condition > 0.0) {
-              result = Evaluate(); SkipBakedCode();
-            } else {
-              SkipBakedCode(); result = Evaluate();
-            }
-            return result;
-          }
-        case OpCodes.AND: {
-            double result = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              if (result <= 0.0) SkipBakedCode();
-              else {
-                result = Evaluate();
-              }
-            }
-            return result <= 0.0 ? -1.0 : 1.0;
-          }
-        case OpCodes.OR: {
-            double result = Evaluate();
-            for (int i = 1; i < currentInstr.nArguments; i++) {
-              if (result > 0.0) SkipBakedCode();
-              else {
-                result = Evaluate();
-              }
-            }
-            return result > 0.0 ? 1.0 : -1.0;
-          }
-        case OpCodes.NOT: {
-            return -Evaluate();
-          }
-        case OpCodes.GT: {
-            double x = Evaluate();
-            double y = Evaluate();
-            if (x > y) return 1.0;
-            else return -1.0;
-          }
-        case OpCodes.LT: {
-            double x = Evaluate();
-            double y = Evaluate();
-            if (x < y) return 1.0;
-            else return -1.0;
-          }
-        case OpCodes.Call: {
-            // evaluate sub-trees
-            // push on argStack in reverse order 
-            for (int i = 0; i < currentInstr.nArguments; i++) {
-              argumentStack[argStackPointer + currentInstr.nArguments - i] = Evaluate();
-            }
-            argStackPointer += currentInstr.nArguments;
-
-            // save the pc
-            int nextPc = pc;
-            // set pc to start of function  
-            pc = currentInstr.iArg0;
-            // evaluate the function
-            double v = Evaluate();
-
-            // decrease the argument stack pointer by the number of arguments pushed
-            // to set the argStackPointer back to the original location
-            argStackPointer -= currentInstr.nArguments;
-
-            // restore the pc => evaluation will continue at point after my subtrees  
-            pc = nextPc;
-            return v;
-          }
-        case OpCodes.Arg: {
-            return argumentStack[argStackPointer - currentInstr.iArg0];
-          }
-        case OpCodes.Variable: {
-            var variableTreeNode = currentInstr.dynamicNode as VariableTreeNode;
-            return dataset[row, currentInstr.iArg0] * variableTreeNode.Weight;
-          }
-        case OpCodes.LagVariable: {
-            var lagVariableTreeNode = currentInstr.dynamicNode as LaggedVariableTreeNode;
-            int actualRow = row + lagVariableTreeNode.Lag;
-            if (actualRow < 0 || actualRow >= dataset.Rows) throw new ArgumentException("Out of range access to dataset row: " + row);
-            return dataset[actualRow, currentInstr.iArg0] * lagVariableTreeNode.Weight;
-          }
-        case OpCodes.Differential: {
-            var diffTreeNode = currentInstr.dynamicNode as DifferentialVariableTreeNode;
-            if (row < 2 || row >= dataset.Rows - 2) throw new ArgumentException("Out of range access to dataset row: " + row);
-            return (-dataset[row + 2, currentInstr.iArg0] + 8 * dataset[row + 1, currentInstr.iArg0] - 8 * dataset[row - 1, currentInstr.iArg0] + dataset[row - 2, currentInstr.iArg0]) * (1.0/12.0) * diffTreeNode.Weight;
-          }
-
-        case OpCodes.Constant: {
-            var constTreeNode = currentInstr.dynamicNode as ConstantTreeNode;
-            return constTreeNode.Value;
-          }
-        default: throw new NotSupportedException();
-      }
-    }
-
     // skips a whole branch
-    protected void SkipBakedCode() {
+    private void SkipBakedCode(Instruction[] code, ref int pc) {
       int i = 1;
       while (i > 0) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SymbolicSimplifier.cs	(revision 5275)
@@ -354,8 +354,7 @@
       while (sum.SubTrees.Count > 0) sum.RemoveSubTree(0);
       var groupedVarNodes = from node in subtrees.OfType<VariableTreeNode>()
-                            where node.Symbol.Name == "Variable"
                             group node by node.VariableName into g
                             select g;
-      var unchangedSubTrees = subtrees.Where(t => t.Symbol.Name != "Variable");
+      var unchangedSubTrees = subtrees.Where(t => !(t is VariableTreeNode));
 
       foreach (var variableNodeGroup in groupedVarNodes) {
@@ -430,10 +429,8 @@
       while (prod.SubTrees.Count > 0) prod.RemoveSubTree(0);
       var groupedVarNodes = from node in subtrees.OfType<VariableTreeNode>()
-                            where node.Symbol.Name == "Variable"
                             group node by node.VariableName into g
                             orderby g.Count()
                             select g;
       var constantProduct = (from node in subtrees.OfType<VariableTreeNode>()
-                             where node.Symbol.Name == "Variable"
                              select node.Weight)
                             .Concat(from node in subtrees.OfType<ConstantTreeNode>()
@@ -443,5 +440,5 @@
 
       var unchangedSubTrees = from tree in subtrees
-                              where !(tree is VariableTreeNode && tree.Symbol.Name == "Variable")
+                              where !(tree is VariableTreeNode)
                               where !(tree is ConstantTreeNode)
                               select tree;
@@ -485,10 +482,9 @@
       } else if (IsAddition(x)) {
         // (x0 + x1 + .. + xn) * -1 => (-x0 + -x1 + .. + -xn)        
-        foreach (var subTree in x.SubTrees) {
-          Negate(subTree);
-        }
+        for (int i = 0; i < x.SubTrees.Count; i++)
+          x.SubTrees[i] = Negate(x.SubTrees[i]);
       } 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
+        x.SubTrees[x.SubTrees.Count - 1] = Negate(x.SubTrees.Last()); // last is maybe a constant, prefer to negate the constant
       } else {
         // any other function
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Addition.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Addition.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Addition.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Addition", "Symbol that represents the + operator.")]
   public sealed class Addition : Symbol {
+    [StorableConstructor]
+    private Addition(bool deserializing) : base(deserializing) { }
+    private Addition(Addition original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Addition(this, cloner);
+    }
     public Addition() : base("Addition", "Symbol that represents the + operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/And.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/And.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/And.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("And", "Symbol that represents the boolean AND operator.")]
   public sealed class And : Symbol {
+    [StorableConstructor]
+    private And(bool deserializing) : base(deserializing) { }
+    private And(And original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new And(this, cloner);
+    }
     public And() : base("And", "Symbol that represents the boolean AND operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Average.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Average.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Average.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Average", "Symbol that represents the average (arithmetic mean) function.")]
   public sealed class Average : Symbol {
+    [StorableConstructor]
+    private Average(bool deserializing) : base(deserializing) { }
+    private Average(Average original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Average(this, cloner);
+    }
     public Average() : base("Average", "Symbol that represents the average (arithmetic mean) function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Constant.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Constant.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Constant.cs	(revision 5275)
@@ -54,10 +54,10 @@
     }
     [Storable]
-    private double manipulatorNu;
-    public double ManipulatorNu {
-      get { return manipulatorNu; }
+    private double manipulatorMu;
+    public double ManipulatorMu {
+      get { return manipulatorMu; }
       set {
-        if (value != manipulatorNu) {
-          manipulatorNu = value;
+        if (value != manipulatorMu) {
+          manipulatorMu = value;
           OnChanged(EventArgs.Empty);
         }
@@ -77,7 +77,16 @@
     }
     #endregion
+    [StorableConstructor]
+    private Constant(bool deserializing) : base(deserializing) { }
+    private Constant(Constant original, Cloner cloner)
+      : base(original, cloner) {
+      minValue = original.minValue;
+      maxValue = original.maxValue;
+      manipulatorMu = original.manipulatorMu;
+      manipulatorSigma = original.manipulatorSigma;
+    }
     public Constant()
       : base("Constant", "Represents a constant value.") {
-      manipulatorNu = 0.0;
+      manipulatorMu = 0.0;
       manipulatorSigma = 1.0;
       minValue = -20.0;
@@ -90,10 +99,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Constant clone = (Constant)base.Clone(cloner);
-      clone.minValue = minValue;
-      clone.maxValue = maxValue;
-      clone.manipulatorNu = manipulatorNu;
-      clone.manipulatorSigma = manipulatorSigma;
-      return clone;
+      return new Constant(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/ConstantTreeNode.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
@@ -38,12 +39,13 @@
     }
 
-    private ConstantTreeNode() : base() { }
+    [StorableConstructor]
+    private ConstantTreeNode(bool deserializing) : base(deserializing) { }
 
-    // copy constructor
-    private ConstantTreeNode(ConstantTreeNode original)
-      : base(original) {
+    private ConstantTreeNode(ConstantTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       constantValue = original.constantValue;
     }
 
+    private ConstantTreeNode() : base() { }
     public ConstantTreeNode(Constant constantSymbol) : base(constantSymbol) { }
 
@@ -61,10 +63,10 @@
     public override void ShakeLocalParameters(IRandom random, double shakingFactor) {
       base.ShakeLocalParameters(random, shakingFactor);
-      double x = NormalDistributedRandom.NextDouble(random, Symbol.ManipulatorNu, Symbol.ManipulatorSigma);
+      double x = NormalDistributedRandom.NextDouble(random, Symbol.ManipulatorMu, Symbol.ManipulatorSigma);
       Value = Value + x * shakingFactor;
     }
 
-    public override object Clone() {
-      return new ConstantTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstantTreeNode(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Cosine.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Cosine.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Cosine.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Cosine", "Symbol that represents the cosine function.")]
   public sealed class Cosine : Symbol {
+    [StorableConstructor]
+    private Cosine(bool deserializing) : base(deserializing) { }
+    private Cosine(Cosine original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Cosine(this, cloner);
+    }
     public Cosine() : base("Cosine", "Symbol that represents the cosine function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariable.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariable.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariable.cs	(revision 5275)
@@ -28,4 +28,9 @@
   [Item("DifferentialVariable", "Represents the differential of a variable value.")]
   public sealed class DifferentialVariable : Variable {
+    [StorableConstructor]
+    private DifferentialVariable(bool deserializing) : base(deserializing) { }
+    private DifferentialVariable(DifferentialVariable original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DifferentialVariable()
       : base("DifferentialVariable", "Represents the differential of a variable value.") {
@@ -35,8 +40,6 @@
       return new DifferentialVariableTreeNode(this);
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
-      DifferentialVariable clone = (DifferentialVariable)base.Clone(cloner);
-      return clone;
+      return new DifferentialVariable(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariableTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariableTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/DifferentialVariableTreeNode.cs	(revision 5275)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols {
   [StorableClass]
@@ -30,18 +31,17 @@
     }
 
+    [StorableConstructor]
+    protected DifferentialVariableTreeNode(bool deserializing) : base(deserializing) { }
+    protected DifferentialVariableTreeNode(DifferentialVariableTreeNode original, Cloner cloner)
+      : base(original, cloner) {
+    }
     private DifferentialVariableTreeNode() { }
-
-    // copy constructor
-    private DifferentialVariableTreeNode(DifferentialVariableTreeNode original)
-      : base(original) {
-    }
 
     public DifferentialVariableTreeNode(DifferentialVariable differentialSymbol) : base(differentialSymbol) { }
 
 
-    public override object Clone() {
-      return new DifferentialVariableTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DifferentialVariableTreeNode(this, cloner);
     }
-
   }
 }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Division.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Division.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Division.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Division", "Symbol that represents the / operator.")]
   public sealed class Division : Symbol {
+    [StorableConstructor]
+    private Division(bool deserializing) : base(deserializing) { }
+    private Division(Division original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Division(this, cloner);
+    }
     public Division() : base("Division", "Symbol that represents the / operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Exponential.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Exponential.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Exponential.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Exponential", "Symbol that represents the exponential function.")]
   public sealed class Exponential : Symbol {
+    [StorableConstructor]
+    private Exponential(bool deserializing) : base(deserializing) { }
+    private Exponential(Exponential original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Exponential(this, cloner);
+    }
     public Exponential() : base("Exponential", "Symbol that represents the exponential function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/GreaterThan.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/GreaterThan.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/GreaterThan.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("GreaterThan", "Symbol that represents a greater than relation.")]
   public sealed class GreaterThan : Symbol {
+    [StorableConstructor]
+    private GreaterThan(bool deserializing) : base(deserializing) { }
+    private GreaterThan(GreaterThan original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GreaterThan(this, cloner);
+    }
     public GreaterThan() : base("GreaterThan", "Symbol that represents a greater than relation.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/IfThenElse.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/IfThenElse.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/IfThenElse.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("IfThenElse", "Symbol that represents a conditional operator.")]
   public sealed class IfThenElse : Symbol {
+    [StorableConstructor]
+    private IfThenElse(bool deserializing) : base(deserializing) { }
+    private IfThenElse(IfThenElse original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IfThenElse(this, cloner);
+    }
     public IfThenElse() : base("IfThenElse", "Symbol that represents a conditional operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariable.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariable.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariable.cs	(revision 5275)
@@ -40,4 +40,11 @@
       set { maxLag = value; }
     }
+    [StorableConstructor]
+    private LaggedVariable(bool deserializing) : base(deserializing) { }
+    private LaggedVariable(LaggedVariable original, Cloner cloner)
+      : base(original, cloner) {
+      minLag = original.minLag;
+      maxLag = original.maxLag;
+    }
     public LaggedVariable()
       : base("LaggedVariable", "Represents a variable value with a time offset.") {
@@ -50,8 +57,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      LaggedVariable clone = (LaggedVariable)base.Clone(cloner);
-      clone.minLag = minLag;
-      clone.maxLag = maxLag;
-      return clone;
+      return new LaggedVariable(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariableTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariableTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LaggedVariableTreeNode.cs	(revision 5275)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -36,11 +37,11 @@
     }
 
-    private LaggedVariableTreeNode() { }
-
-    // copy constructor
-    private LaggedVariableTreeNode(LaggedVariableTreeNode original)
-      : base(original) {
+    [StorableConstructor]
+    private LaggedVariableTreeNode(bool deserializing) : base(deserializing) { }
+    private LaggedVariableTreeNode(LaggedVariableTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       lag = original.lag;
     }
+    private LaggedVariableTreeNode() { }
 
     public LaggedVariableTreeNode(LaggedVariable variableSymbol) : base(variableSymbol) { }
@@ -62,7 +63,6 @@
     }
 
-
-    public override object Clone() {
-      return new LaggedVariableTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LaggedVariableTreeNode(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LessThan.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LessThan.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/LessThan.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("LessThan", "Symbol that represents a less than relation.")]
   public sealed class LessThan : Symbol {
+    [StorableConstructor]
+    private LessThan(bool deserializing) : base(deserializing) { }
+    private LessThan(LessThan original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LessThan(this, cloner);
+    }
     public LessThan() : base("LessThan", "Symbol that represents a less than relation.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Logarithm.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Logarithm.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Logarithm.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Logarithm", "Symbol that represents the logarithm function.")]
   public sealed class Logarithm : Symbol {
+    [StorableConstructor]
+    private Logarithm(bool deserializing) : base(deserializing) { }
+    private Logarithm(Logarithm original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Logarithm(this, cloner);
+    }
     public Logarithm() : base("Logarithm", "Symbol that represents the logarithm function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Multiplication.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Multiplication.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Multiplication.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Multiplication", "Symbol that represents the * operator.")]
   public sealed class Multiplication : Symbol {
+    [StorableConstructor]
+    private Multiplication(bool deserializing) : base(deserializing) { }
+    private Multiplication(Multiplication original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Multiplication(this, cloner);
+    }
     public Multiplication() : base("Multiplication", "Symbol that represents the * operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Not.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Not.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Not.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Not", "Symbol that represents the boolean NOT operator.")]
   public sealed class Not : Symbol {
+    [StorableConstructor]
+    private Not(bool deserializing) : base(deserializing) { }
+    private Not(Not original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Not(this, cloner);
+    }
     public Not() : base("Not", "Symbol that represents the boolean NOT operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Or.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Or.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Or.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Or", "Symbol that represents the boolean OR operator.")]
   public sealed class Or : Symbol {
+    [StorableConstructor]
+    private Or(bool deserializing) : base(deserializing) { }
+    private Or(Or original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Or(this, cloner);
+    }
     public Or() : base("Or", "Symbol that represents the boolean OR operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Sine.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Sine.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Sine.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Sine", "Symbol that represents the sine function.")]
   public sealed class Sine : Symbol {
+    [StorableConstructor]
+    private Sine(bool deserializing) : base(deserializing) { }
+    private Sine(Sine original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Sine(this, cloner);
+    }
     public Sine() : base("Sine", "Symbol that represents the sine function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Subtraction.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Subtraction.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Subtraction.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Subtraction", "Symbol that represents the - operator.")]
   public sealed class Subtraction : Symbol {
+    [StorableConstructor]
+    private Subtraction(bool deserializing) : base(deserializing) { }
+    private Subtraction(Subtraction original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Subtraction(this, cloner);
+    }
     public Subtraction() : base("Subtraction", "Symbol that represents the - operator.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Tangent.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Tangent.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Tangent.cs	(revision 5275)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -27,4 +28,10 @@
   [Item("Tangent", "Symbol that represents the tangent trigonometric function.")]
   public sealed class Tangent : Symbol {
+    [StorableConstructor]
+    private Tangent(bool deserializing) : base(deserializing) { }
+    private Tangent(Tangent original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Tangent(this, cloner);
+    }
     public Tangent() : base("Tangent", "Symbol that represents the tangent trigonometric function.") { }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/Variable.cs	(revision 5275)
@@ -33,10 +33,10 @@
     #region Properties
     [Storable]
-    private double weightNu;
-    public double WeightNu {
-      get { return weightNu; }
+    private double weightMu;
+    public double WeightMu {
+      get { return weightMu; }
       set {
-        if (value != weightNu) {
-          weightNu = value;
+        if (value != weightMu) {
+          weightMu = value;
           OnChanged(EventArgs.Empty);
         }
@@ -56,10 +56,10 @@
     }
     [Storable]
-    private double weightManipulatorNu;
-    public double WeightManipulatorNu {
-      get { return weightManipulatorNu; }
+    private double weightManipulatorMu;
+    public double WeightManipulatorMu {
+      get { return weightManipulatorMu; }
       set {
-        if (value != weightManipulatorNu) {
-          weightManipulatorNu = value;
+        if (value != weightManipulatorMu) {
+          weightManipulatorMu = value;
           OnChanged(EventArgs.Empty);
         }
@@ -90,10 +90,22 @@
     }
     #endregion
+    [StorableConstructor]
+    protected Variable(bool deserializing) : base(deserializing) {
+      variableNames = new List<string>();
+    }
+    protected Variable(Variable original, Cloner cloner)
+      : base(original, cloner) {
+      weightMu = original.weightMu;
+      weightSigma = original.weightSigma;
+      variableNames = new List<string>(original.variableNames);
+      weightManipulatorMu = original.weightManipulatorMu;
+      weightManipulatorSigma = original.weightManipulatorSigma;
+    }
     public Variable() : this("Variable", "Represents a variable value.") { }
     public Variable(string name, string description)
       : base(name, description) {
-      weightNu = 1.0;
+      weightMu = 1.0;
       weightSigma = 1.0;
-      weightManipulatorNu = 0.0;
+      weightManipulatorMu = 0.0;
       weightManipulatorSigma = 1.0;
       variableNames = new List<string>();
@@ -105,11 +117,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Variable clone = (Variable)base.Clone(cloner);
-      clone.weightNu = weightNu;
-      clone.weightSigma = weightSigma;
-      clone.variableNames = new List<string>(variableNames);
-      clone.weightManipulatorNu = weightManipulatorNu;
-      clone.weightManipulatorSigma = weightManipulatorSigma;
-      return clone;
+      return new Variable(this, cloner);
     }
   }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/Symbols/VariableTreeNode.cs	(revision 5275)
@@ -20,6 +20,6 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Common;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -44,14 +44,12 @@
     }
 
-
-    protected VariableTreeNode() { }
-
-    // copy constructor
-    protected VariableTreeNode(VariableTreeNode original)
-      : base(original) {
+    [StorableConstructor]
+    protected VariableTreeNode(bool deserializing) : base(deserializing) { }
+    protected VariableTreeNode(VariableTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       weight = original.weight;
       variableName = original.variableName;
     }
-
+    protected VariableTreeNode() { }
     public VariableTreeNode(Variable variableSymbol) : base(variableSymbol) { }
 
@@ -64,5 +62,5 @@
     public override void ResetLocalParameters(IRandom random) {
       base.ResetLocalParameters(random);
-      weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightNu, Symbol.WeightSigma);
+      weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightMu, Symbol.WeightSigma);
       variableName = Symbol.VariableNames.SelectRandom(random);
     }
@@ -70,12 +68,11 @@
     public override void ShakeLocalParameters(IRandom random, double shakingFactor) {
       base.ShakeLocalParameters(random, shakingFactor);
-      double x = NormalDistributedRandom.NextDouble(random, Symbol.WeightManipulatorNu, Symbol.WeightManipulatorSigma);
+      double x = NormalDistributedRandom.NextDouble(random, Symbol.WeightManipulatorMu, Symbol.WeightManipulatorSigma);
       weight = weight + x * shakingFactor;
       variableName = Symbol.VariableNames.SelectRandom(random);
     }
 
-
-    public override object Clone() {
-      return new VariableTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VariableTreeNode(this, cloner);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/VariableFrequencyAnalyser.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/VariableFrequencyAnalyser.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/VariableFrequencyAnalyser.cs	(revision 5275)
@@ -22,4 +22,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -61,4 +62,9 @@
     }
     #endregion
+    [StorableConstructor]
+    protected VariableFrequencyAnalyser(bool deserializing) : base(deserializing) { }
+    protected VariableFrequencyAnalyser(VariableFrequencyAnalyser original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public VariableFrequencyAnalyser()
       : base() {
@@ -69,5 +75,5 @@
 
     public override IOperation Apply() {
-      var inputVariables = DataAnalysisProblemData.InputVariables.Select(x => x.Value);
+      var inputVariables = DataAnalysisProblemData.InputVariables.CheckedItems.Select(x => x.Value.Value);
       if (VariableFrequencies == null) {
         VariableFrequencies = new DoubleMatrix(0, 1, inputVariables);
@@ -80,5 +86,5 @@
         VariableFrequencies[lastRowIndex, columnIndex] = pair.Value;
       }
-      return null;
+      return base.Apply();
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/TableFileParser.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/TableFileParser.cs	(revision 5275)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/TableFileParser.cs	(revision 5275)
@@ -0,0 +1,375 @@
+#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.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public class TableFileParser {
+    private const int BUFFER_SIZE = 1024;
+    private readonly char[] POSSIBLE_SEPARATORS = new char[] { ',', ';', '\t' };
+    private const string VARIABLENAMES = "VARIABLENAMES";
+    private Tokenizer tokenizer;
+    private List<string> variableNames;
+    private List<List<double>> rowValues;
+
+    private int rows;
+    public int Rows {
+      get { return rows; }
+      set { rows = value; }
+    }
+
+    private int columns;
+    public int Columns {
+      get { return columns; }
+      set { columns = value; }
+    }
+
+    private double[,] values;
+    public double[,] Values {
+      get {
+        return values;
+      }
+    }
+
+    public IEnumerable<string> VariableNames {
+      get {
+        if (variableNames.Count > 0) return variableNames;
+        else {
+          string[] names = new string[columns];
+          for (int i = 0; i < names.Length; i++) {
+            names[i] = "X" + i.ToString("000");
+          }
+          return names;
+        }
+      }
+    }
+
+    public TableFileParser() {
+      rowValues = new List<List<double>>();
+      variableNames = new List<string>();
+    }
+
+    private void Reset() {
+      variableNames.Clear();
+      rowValues.Clear();
+    }
+
+    public void Parse(string fileName) {
+      NumberFormatInfo numberFormat;
+      char separator;
+      DetermineFileFormat(fileName, out numberFormat, out separator);
+      using (StreamReader reader = new StreamReader(fileName)) {
+        tokenizer = new Tokenizer(reader, numberFormat, separator);
+        // parse the file
+        Parse();
+      }
+
+      // translate the list of samples into a DoubleMatrixData item
+      rows = rowValues.Count;
+      columns = rowValues[0].Count;
+      values = new double[rows, columns];
+
+      int rowIndex = 0;
+      int columnIndex = 0;
+      foreach (List<double> row in rowValues) {
+        columnIndex = 0;
+        foreach (double element in row) {
+          values[rowIndex, columnIndex++] = element;
+        }
+        rowIndex++;
+      }
+    }
+
+    private void DetermineFileFormat(string fileName, out NumberFormatInfo numberFormat, out char separator) {
+      using (StreamReader reader = new StreamReader(fileName)) {
+        // skip first line
+        reader.ReadLine();
+        // read a block
+        char[] buffer = new char[BUFFER_SIZE];
+        int charsRead = reader.ReadBlock(buffer, 0, BUFFER_SIZE);
+        // count frequency of special characters
+        Dictionary<char, int> charCounts = buffer.Take(charsRead)
+          .GroupBy(c => c)
+          .ToDictionary(g => g.Key, g => g.Count());
+
+        // depending on the characters occuring in the block 
+        // we distinghish a number of different cases based on the the following rules:
+        // many points => it must be English number format, the other frequently occuring char is the separator
+        // no points but many commas => this is the problematic case. Either German format (real numbers) or English format (only integer numbers) with ',' as separator
+        //   => check the line in more detail:
+        //            English: 0, 0, 0, 0
+        //            German:  0,0 0,0 0,0 ...
+        //            => if commas are followed by space => English format
+        // no points no commas => English format (only integer numbers) use the other frequently occuring char as separator
+        // in all cases only treat ' ' as separator if no other separator is possible (spaces can also occur additionally to separators)
+        if (OccurrencesOf(charCounts, '.') > 10) {
+          numberFormat = NumberFormatInfo.InvariantInfo;
+          separator = POSSIBLE_SEPARATORS
+            .Where(c => OccurrencesOf(charCounts, c) > 10)
+            .OrderBy(c => -OccurrencesOf(charCounts, c))
+            .DefaultIfEmpty(' ')
+            .First();
+        } else if (OccurrencesOf(charCounts, ',') > 10) {
+          // no points and many commas
+          int countCommaNonDigitPairs = 0;
+          for (int i = 0; i < charsRead - 1; i++) {
+            if (buffer[i] == ',' && !Char.IsDigit(buffer[i + 1])) {
+              countCommaNonDigitPairs++;
+            }
+          }
+          if (countCommaNonDigitPairs > 10) {
+            // English format (only integer values) with ',' as separator
+            numberFormat = NumberFormatInfo.InvariantInfo;
+            separator = ',';
+          } else {
+            char[] disallowedSeparators = new char[] { ',' };
+            // German format (real values)
+            numberFormat = NumberFormatInfo.GetInstance(new CultureInfo("de-DE"));
+            separator = POSSIBLE_SEPARATORS
+              .Except(disallowedSeparators)
+              .Where(c => OccurrencesOf(charCounts, c) > 10)
+              .OrderBy(c => -OccurrencesOf(charCounts, c))
+              .DefaultIfEmpty(' ')
+              .First();
+          }
+        } else {
+          // no points and no commas => English format
+          numberFormat = NumberFormatInfo.InvariantInfo;
+          separator = POSSIBLE_SEPARATORS
+            .Where(c => OccurrencesOf(charCounts, c) > 10)
+            .OrderBy(c => -OccurrencesOf(charCounts, c))
+            .DefaultIfEmpty(' ')
+            .First();
+        }
+      }
+    }
+
+    private int OccurrencesOf(Dictionary<char, int> charCounts, char c) {
+      return charCounts.ContainsKey(c) ? charCounts[c] : 0;
+    }
+
+    #region tokenizer
+    internal enum TokenTypeEnum {
+      NewLine, Separator, String, Double
+    }
+
+    internal class Token {
+      public TokenTypeEnum type;
+      public string stringValue;
+      public double doubleValue;
+
+      public Token(TokenTypeEnum type, string value) {
+        this.type = type;
+        stringValue = value;
+        doubleValue = 0.0;
+      }
+
+      public override string ToString() {
+        return stringValue;
+      }
+    }
+
+
+    internal class Tokenizer {
+      private StreamReader reader;
+      private List<Token> tokens;
+      private NumberFormatInfo numberFormatInfo;
+      private char separator;
+      private const string INTERNAL_SEPARATOR = "#";
+
+      private int currentLineNumber = 0;
+      public int CurrentLineNumber {
+        get { return currentLineNumber; }
+        private set { currentLineNumber = value; }
+      }
+      private string currentLine;
+      public string CurrentLine {
+        get { return currentLine; }
+        private set { currentLine = value; }
+      }
+
+      private Token newlineToken;
+      public Token NewlineToken {
+        get { return newlineToken; }
+        private set { newlineToken = value; }
+      }
+      private Token separatorToken;
+      public Token SeparatorToken {
+        get { return separatorToken; }
+        private set { separatorToken = value; }
+      }
+
+      public Tokenizer(StreamReader reader, NumberFormatInfo numberFormatInfo, char separator) {
+        this.reader = reader;
+        this.numberFormatInfo = numberFormatInfo;
+        this.separator = separator;
+        separatorToken = new Token(TokenTypeEnum.Separator, INTERNAL_SEPARATOR);
+        newlineToken = new Token(TokenTypeEnum.NewLine, Environment.NewLine);
+        tokens = new List<Token>();
+        ReadNextTokens();
+      }
+
+      private void ReadNextTokens() {
+        if (!reader.EndOfStream) {
+          CurrentLine = reader.ReadLine();
+          var newTokens = from str in Split(CurrentLine)
+                          let trimmedStr = str.Trim()
+                          where !string.IsNullOrEmpty(trimmedStr)
+                          select MakeToken(trimmedStr);
+
+          tokens.AddRange(newTokens);
+          tokens.Add(NewlineToken);
+          CurrentLineNumber++;
+        }
+      }
+
+      private IEnumerable<string> Split(string line) {
+        StringBuilder subStr = new StringBuilder();
+        foreach (char c in line) {
+          if (c == separator) {
+            yield return subStr.ToString();
+            subStr = new StringBuilder();
+            // all separator characters are transformed to the internally used separator character
+            yield return INTERNAL_SEPARATOR;
+          } else {
+            subStr.Append(c);
+          }
+        }
+        yield return subStr.ToString();
+      }
+
+      private Token MakeToken(string strToken) {
+        Token token = new Token(TokenTypeEnum.String, strToken);
+        if (strToken.Equals(INTERNAL_SEPARATOR)) {
+          return SeparatorToken;
+        } else if (double.TryParse(strToken, NumberStyles.Float, numberFormatInfo, out token.doubleValue)) {
+          token.type = TokenTypeEnum.Double;
+          return token;
+        }
+
+        // couldn't parse the token as an int or float number so return a string token
+        return token;
+      }
+
+      public Token Peek() {
+        return tokens[0];
+      }
+
+      public Token Next() {
+        Token next = tokens[0];
+        tokens.RemoveAt(0);
+        if (tokens.Count == 0) {
+          ReadNextTokens();
+        }
+        return next;
+      }
+
+      public bool HasNext() {
+        return tokens.Count > 0 || !reader.EndOfStream;
+      }
+    }
+    #endregion
+
+    #region parsing
+    private void Parse() {
+      ParseVariableNames();
+      if (!tokenizer.HasNext()) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
+      ParseValues();
+      if (rowValues.Count == 0) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
+    }
+
+    private void ParseValues() {
+      while (tokenizer.HasNext()) {
+        List<double> row = new List<double>();
+        row.Add(NextValue(tokenizer));
+        while (tokenizer.HasNext() && tokenizer.Peek() == tokenizer.SeparatorToken) {
+          Expect(tokenizer.SeparatorToken);
+          row.Add(NextValue(tokenizer));
+        }
+        Expect(tokenizer.NewlineToken);
+        // all rows have to have the same number of values            
+        // the first row defines how many samples are needed
+        if (rowValues.Count > 0 && rowValues[0].Count != row.Count) {
+          Error("The first row of the dataset has " + rowValues[0].Count + " columns." +
+            "\nLine " + tokenizer.CurrentLineNumber + " has " + row.Count + " columns.", "", tokenizer.CurrentLineNumber);
+        }
+        // add the current row to the collection of rows and start a new row
+        rowValues.Add(row);
+        row = new List<double>();
+      }
+    }
+
+    private double NextValue(Tokenizer tokenizer) {
+      if (tokenizer.Peek() == tokenizer.SeparatorToken || tokenizer.Peek() == tokenizer.NewlineToken) return double.NaN;
+      Token current = tokenizer.Next();
+      if (current.type == TokenTypeEnum.Separator || current.type == TokenTypeEnum.String) {
+        return double.NaN;
+      } else if (current.type == TokenTypeEnum.Double) {
+        // just take the value
+        return current.doubleValue;
+      }
+      // found an unexpected token => throw error 
+      Error("Unexpected token.", current.stringValue, tokenizer.CurrentLineNumber);
+      // this line is never executed because Error() throws an exception
+      throw new InvalidOperationException();
+    }
+
+    private void ParseVariableNames() {
+      // if the first line doesn't start with a double value then we assume that the
+      // first line contains variable names
+      if (tokenizer.HasNext() && tokenizer.Peek().type != TokenTypeEnum.Double) {
+
+        List<Token> tokens = new List<Token>();
+        Token valueToken;
+        valueToken = tokenizer.Next();
+        tokens.Add(valueToken);
+        while (tokenizer.HasNext() && tokenizer.Peek() == tokenizer.SeparatorToken) {
+          Expect(tokenizer.SeparatorToken);
+          valueToken = tokenizer.Next();
+          if (valueToken != tokenizer.NewlineToken) {
+            tokens.Add(valueToken);
+          }
+        }
+        if (valueToken != tokenizer.NewlineToken) {
+          Expect(tokenizer.NewlineToken);
+        }
+        variableNames = tokens.Select(x => x.stringValue.Trim()).ToList();
+      }
+    }
+
+    private void Expect(Token expectedToken) {
+      Token actualToken = tokenizer.Next();
+      if (actualToken != expectedToken) {
+        Error("Expected: " + expectedToken, actualToken.stringValue, tokenizer.CurrentLineNumber);
+      }
+    }
+
+    private void Error(string message, string token, int lineNumber) {
+      throw new DataFormatException("Error while parsing.\n" + message, token, lineNumber);
+    }
+    #endregion
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/HeuristicLab.Problems.DataAnalysis.Tests-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/HeuristicLab.Problems.DataAnalysis.Tests-3.3.csproj	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/HeuristicLab.Problems.DataAnalysis.Tests-3.3.csproj	(revision 5275)
@@ -102,4 +102,31 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
     <Reference Include="System" />
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/StatisticCalculatorsTest.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/StatisticCalculatorsTest.cs	(revision 5274)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis/3.3/Tests/StatisticCalculatorsTest.cs	(revision 5275)
@@ -77,5 +77,5 @@
           double tmp = 0;
 
-          alglib.descriptivestatistics.calculatemoments(ref xs, n, ref mean_alglib, ref variance_alglib, ref tmp, ref tmp);
+          alglib.basestat.samplemoments(xs, n, ref mean_alglib, ref variance_alglib, ref tmp, ref tmp);
 
           var calculator = new OnlineMeanAndVarianceCalculator();
@@ -108,5 +108,5 @@
             double[] xs = x.ToArray();
             double[] ys = y.ToArray();
-            double r2_alglib = alglib.correlation.pearsoncorrelation(ref xs, ref ys, n);
+            double r2_alglib = alglib.pearsoncorr2(xs, ys, n);
             r2_alglib *= r2_alglib;
 
Index: /branches/DataAnalysis/Main/CopyAssemblies.cmd
===================================================================
--- /branches/DataAnalysis/Main/CopyAssemblies.cmd	(revision 5275)
+++ /branches/DataAnalysis/Main/CopyAssemblies.cmd	(revision 5275)
@@ -0,0 +1,5 @@
+FOR /F "skip=1 tokens=1-2 delims=: usebackq" %%G IN ("%ProjectDir%\Files.txt") DO echo "%%H" && copy "%SolutionDir%\%%G\%Outdir%\%%H" .\
+
+
+
+echo "CopyAssemblies done"
Index: /branches/DataAnalysis/Main/Files.txt
===================================================================
--- /branches/DataAnalysis/Main/Files.txt	(revision 5275)
+++ /branches/DataAnalysis/Main/Files.txt	(revision 5275)
@@ -0,0 +1,12 @@
+﻿; This line is skipped. DO NOT TOUCH THIS line!
+; List of project directories and file names separated by ':' that are part of the installation
+
+HeuristicLab.Problems.DataAnalysis\3.3:HeuristicLab.Problems.DataAnalysis-3.3.dll
+HeuristicLab.Problems.DataAnalysis.FeatureSelection\3.3:HeuristicLab.Problems.DataAnalysis.FeatureSelection-3.3.dll
+HeuristicLab.Problems.DataAnalysis.MultiVariate\3.3:HeuristicLab.Problems.DataAnalysis.MultiVariate-3.3.dll
+HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression\3.3:HeuristicLab.Problems.DataAnalysis.MultiVariate.Regression-3.3.dll
+HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis\3.3:HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis-3.3.dll
+HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views\3.3:HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.dll
+HeuristicLab.Problems.DataAnalysis.MultiVariate.Views\3.3:HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.dll
+HeuristicLab.Problems.DataAnalysis.Regression\3.3:HeuristicLab.Problems.DataAnalysis.Regression-3.3.dll
+HeuristicLab.Problems.DataAnalysis.Views\3.3:HeuristicLab.Problems.DataAnalysis.Views-3.3.dll
Index: /branches/DataAnalysis/Main/Main.csproj
===================================================================
--- /branches/DataAnalysis/Main/Main.csproj	(revision 5275)
+++ /branches/DataAnalysis/Main/Main.csproj	(revision 5275)
@@ -0,0 +1,99 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8892BD96-1AC6-489E-8848-6BDFE051F09C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Main</RootNamespace>
+    <AssemblyName>Main</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Main.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Main.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+set Platform=$(PlatformName)
+set Configuration=$(ConfigurationName)
+
+call CopyAssemblies.cmd
+UpdateLocalInstallation.cmd</PostBuildEvent>
+  </PropertyGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="CopyAssemblies.cmd" />
+    <None Include="UpdateLocalInstallation.cmd" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Files.txt" />
+  </ItemGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/DataAnalysis/Main/UpdateLocalInstallation.cmd
===================================================================
--- /branches/DataAnalysis/Main/UpdateLocalInstallation.cmd	(revision 5275)
+++ /branches/DataAnalysis/Main/UpdateLocalInstallation.cmd	(revision 5275)
@@ -0,0 +1,6 @@
+set target=C:\Program Files\HeuristicLab 3.3
+
+FOR /F "skip=1 tokens=1-2 delims=: usebackq" %%G IN ("%ProjectDir%\Files.txt") DO copy "%SolutionDir%\%%G\%Outdir%\%%H" "%target%" >nul
+
+
+echo "CustomPostBuild done"
Index: /branches/DataAnalysis/Main/app.config
===================================================================
--- /branches/DataAnalysis/Main/app.config	(revision 5275)
+++ /branches/DataAnalysis/Main/app.config	(revision 5275)
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
