Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 3877)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs	(revision 3884)
@@ -39,5 +39,17 @@
   [StorableClass]
   [Item("SymbolicRegressionModel", "A symbolic regression model represents an entity that provides estimated values based on input values.")]
-  public class SymbolicRegressionModel : Item {
+  public class SymbolicRegressionModel : NamedItem, IDataAnalysisModel {
+    private SymbolicRegressionModel() : base() { } // for cloning
+    [StorableConstructor]
+    protected SymbolicRegressionModel(bool deserializing)
+      : base(deserializing) {
+    }
+    public SymbolicRegressionModel(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree tree, IEnumerable<string> inputVariables)
+      : base() {
+      this.tree = tree;
+      this.interpreter = interpreter;
+      this.inputVariables = inputVariables.ToList();
+    }
+
     [Storable]
     private SymbolicExpressionTree tree;
@@ -50,6 +62,6 @@
       get { return interpreter; }
     }
+    [Storable]
     private List<string> inputVariables;
-    [Storable]
     public IEnumerable<string> InputVariables {
       get { return inputVariables.AsEnumerable(); }
@@ -59,15 +71,7 @@
       }
     }
-    public SymbolicRegressionModel() : base() { } // for cloning
 
-    public SymbolicRegressionModel(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree tree, IEnumerable<string> inputVariables)
-      : base() {
-      this.tree = tree;
-      this.interpreter = interpreter;
-      this.inputVariables = inputVariables.ToList();
-    }
-
-    public IEnumerable<double> GetEstimatedValues(Dataset dataset, int start, int end) {
-      return interpreter.GetSymbolicExpressionTreeValues(tree, dataset, Enumerable.Range(start, end - start));
+    public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, int start, int end) {
+      return interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(start, end - start));
     }
 
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3877)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs	(revision 3884)
@@ -37,43 +37,24 @@
   [StorableClass]
   public sealed class SymbolicRegressionSolution : DataAnalysisSolution {
+    public SymbolicRegressionSolution() : base() { }
+    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
+      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
+      this.Model = model;
+    }
+
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Function; }
     }
-    [Storable]
-    private SymbolicRegressionModel model;
-    public SymbolicRegressionModel Model {
-      get { return model; }
-      set {
-        if (model != value) {
-          if (value == null) throw new ArgumentNullException();
-          model = value;
-          OnModelChanged(EventArgs.Empty);
-        }
-      }
+
+    public new SymbolicRegressionModel Model {
+      get { return (SymbolicRegressionModel)base.Model; }
+      set { base.Model = value; }
     }
 
-    public SymbolicRegressionSolution() : base() { }
-    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
-      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
-      this.model = model;
-    }
-
-    public event EventHandler ModelChanged;
-    private void OnModelChanged(EventArgs e) {
-      RecalculateEstimatedValues();
-      var listeners = ModelChanged;
-      if (listeners != null)
-        listeners(this, e);
-    }
-
-    protected override void OnProblemDataChanged(EventArgs e) {
-      RecalculateEstimatedValues();
-    }
-
-    private void RecalculateEstimatedValues() {
-      estimatedValues = (from x in model.GetEstimatedValues(ProblemData.Dataset, 0, ProblemData.Dataset.Rows)
+    protected override void RecalculateEstimatedValues() {
+      estimatedValues = (from x in Model.GetEstimatedValues(ProblemData, 0, ProblemData.Dataset.Rows)
                          let boundedX = Math.Min(UpperEstimationLimit, Math.Max(LowerEstimationLimit, x))
                          select double.IsNaN(boundedX) ? UpperEstimationLimit : boundedX).ToList();
-      OnEstimatedValuesChanged(EventArgs.Empty);
+      OnEstimatedValuesChanged();
     }
 
@@ -103,10 +84,4 @@
       }
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicRegressionSolution clone = (SymbolicRegressionSolution)base.Clone(cloner);
-      clone.model = (SymbolicRegressionModel)cloner.Clone(model);
-      return clone;
-    }
   }
 }
