Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionErrorCharacteristicsCurveView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionErrorCharacteristicsCurveView.cs	(revision 13002)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionErrorCharacteristicsCurveView.cs	(revision 13003)
@@ -21,6 +21,6 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
-using System.Windows.Forms;
 using HeuristicLab.Algorithms.DataAnalysis;
 using HeuristicLab.MainForm;
@@ -31,5 +31,4 @@
   [Content(typeof(ISymbolicRegressionSolution))]
   public partial class SymbolicRegressionSolutionErrorCharacteristicsCurveView : RegressionSolutionErrorCharacteristicsCurveView {
-    private IRegressionSolution linearRegressionSolution;
     public SymbolicRegressionSolutionErrorCharacteristicsCurveView() {
       InitializeComponent();
@@ -41,24 +40,9 @@
     }
 
-    protected override void OnContentChanged() {
-      if (Content != null)
-        linearRegressionSolution = CreateLinearRegressionSolution();
-      else
-        linearRegressionSolution = null;
-
-      base.OnContentChanged();
-    }
-
-    protected override void UpdateChart() {
-      base.UpdateChart();
-      if (Content == null || linearRegressionSolution == null) return;
-      AddRegressionSolution(linearRegressionSolution);
-    }
-
     private IRegressionSolution CreateLinearRegressionSolution() {
       if (Content == null) throw new InvalidOperationException();
       double rmse, cvRmsError;
       var problemData = (IRegressionProblemData)ProblemData.Clone();
-      if(!problemData.TrainingIndices.Any()) return null; // don't create an LR model if the problem does not have a training set (e.g. loaded into an existing model)
+      if (!problemData.TrainingIndices.Any()) return null; // don't create an LR model if the problem does not have a training set (e.g. loaded into an existing model)
 
       //clear checked inputVariables
@@ -77,16 +61,12 @@
 
       var solution = LinearRegression.CreateLinearRegressionSolution(problemData, out rmse, out cvRmsError);
-      solution.Name = "Linear Model";
+      solution.Name = "Baseline (linear subset)";
       return solution;
     }
 
-    protected override void Content_ModelChanged(object sender, EventArgs e) {
-      linearRegressionSolution = CreateLinearRegressionSolution();
-      base.Content_ModelChanged(sender, e);
-    }
 
-    protected override void Content_ProblemDataChanged(object sender, EventArgs e) {
-      linearRegressionSolution = CreateLinearRegressionSolution();
-      base.Content_ProblemDataChanged(sender, e);
+    protected override IEnumerable<IRegressionSolution> CreateBaselineSolutions() {
+      foreach (var sol in base.CreateBaselineSolutions()) yield return sol;
+      yield return CreateLinearRegressionSolution();
     }
   }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 13002)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 13003)
@@ -448,4 +448,12 @@
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj">
+      <Project>{5AC82412-911B-4FA2-A013-EDC5E3F3FCC2}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj">
+      <Project>{3D28463F-EC96-4D82-AFEE-38BE91A0CA00}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic-3.4</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.4\HeuristicLab.Problems.DataAnalysis-3.4.csproj">
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 13002)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 13003)
@@ -44,4 +44,6 @@
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic.Regression", "3.4")]
   [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
   public class HeuristicLabProblemsDataAnalysisViewsPlugin : PluginBase {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs	(revision 13002)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs	(revision 13003)
@@ -25,6 +25,8 @@
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Algorithms.DataAnalysis;
 using HeuristicLab.Common;
 using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.DataAnalysis.Views {
@@ -62,8 +64,19 @@
     }
 
+    // the view holds one regression solution as content but also contains several other regression solutions for comparison
+    // the following invariants must hold
+    // (Solutions.IsEmpty && Content == null) ||
+    // (Solutions[0] == Content && Solutions.All(s => s.ProblemData.TargetVariable == Content.TargetVariable))
+
     public new IRegressionSolution Content {
       get { return (IRegressionSolution)base.Content; }
       set { base.Content = value; }
     }
+
+    private readonly IList<IRegressionSolution> solutions = new List<IRegressionSolution>();
+    public IEnumerable<IRegressionSolution> Solutions {
+      get { return solutions.AsEnumerable(); }
+    }
+
     public IRegressionProblemData ProblemData {
       get {
@@ -86,9 +99,25 @@
     protected virtual void Content_ModelChanged(object sender, EventArgs e) {
       if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ModelChanged, sender, e);
-      else UpdateChart();
+      else {
+        // recalculate baseline solutions (for symbolic regression models the features used in the model might have changed)
+        solutions.Clear(); // remove all
+        solutions.Add(Content); // re-add the first solution
+        // and recalculate all other solutions
+        foreach (var sol in CreateBaselineSolutions()) {
+          solutions.Add(sol);
+        }
+        UpdateChart();
+      }
     }
     protected virtual void Content_ProblemDataChanged(object sender, EventArgs e) {
       if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ProblemDataChanged, sender, e);
       else {
+        // recalculate baseline solutions
+        solutions.Clear(); // remove all
+        solutions.Add(Content); // re-add the first solution
+        // and recalculate all other solutions
+        foreach (var sol in CreateBaselineSolutions()) {
+          solutions.Add(sol);
+        }
         UpdateChart();
       }
@@ -96,4 +125,16 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
+      // the content object is always stored as the first element in solutions
+      solutions.Clear();
+      ReadOnly = Content == null;
+      if (Content != null) {
+        // recalculate all solutions
+        solutions.Add(Content);
+        if (ProblemData.TrainingIndices.Any()) {
+          foreach (var sol in CreateBaselineSolutions())
+            solutions.Add(sol);
+          // more solutions can be added by drag&drop
+        }
+      }
       UpdateChart();
     }
@@ -109,14 +150,12 @@
       if (cmbSamples.SelectedItem.ToString() == TestSamples && !ProblemData.TestIndices.Any()) return;
 
-      if (Content.ProblemData.TrainingIndices.Any()) {
-        AddRegressionSolution(CreateConstantSolution());
-      }
-
-      AddRegressionSolution(Content);
+      foreach (var sol in Solutions) {
+        AddSeries(sol);
+      }
 
       chart.ChartAreas[0].AxisX.Title = residualComboBox.SelectedItem.ToString();
     }
 
-    protected void AddRegressionSolution(IRegressionSolution solution) {
+    protected void AddSeries(IRegressionSolution solution) {
       if (chart.Series.Any(s => s.Name == solution.Name)) return;
 
@@ -239,5 +278,4 @@
     }
 
-    #region Baseline
     private void Chart_MouseDoubleClick(object sender, MouseEventArgs e) {
       HitTestResult result = chart.HitTest(e.X, e.Y);
@@ -247,12 +285,22 @@
     }
 
-    private ConstantRegressionSolution CreateConstantSolution() {
+    protected virtual IEnumerable<IRegressionSolution> CreateBaselineSolutions() {
+      yield return CreateConstantSolution();
+      yield return CreateLinearSolution();
+    }
+
+    private IRegressionSolution CreateConstantSolution() {
       double averageTrainingTarget = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices).Average();
       var model = new ConstantRegressionModel(averageTrainingTarget);
       var solution = new ConstantRegressionSolution(model, (IRegressionProblemData)ProblemData.Clone());
-      solution.Name = "Baseline";
+      solution.Name = "Baseline (constant)";
       return solution;
     }
-    #endregion
+    private IRegressionSolution CreateLinearSolution() {
+      double rmsError, cvRmsError;
+      var solution = LinearRegression.CreateLinearRegressionSolution((IRegressionProblemData)ProblemData.Clone(), out rmsError, out cvRmsError);
+      solution.Name = "Baseline (linear)";
+      return solution;
+    }
 
     private void chart_MouseMove(object sender, MouseEventArgs e) {
@@ -266,12 +314,32 @@
 
     private void chart_DragDrop(object sender, DragEventArgs e) {
-      if (e.Data.GetDataPresent("HeuristicLab")) {
-        var regressionSolution = (IRegressionSolution)e.Data.GetData("HeuristicLab");
-        AddRegressionSolution(regressionSolution);
+      if (e.Data.GetDataPresent(HeuristicLab.Common.Constants.DragDropDataFormat)) {
+
+        var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        var dataAsRegressionSolution = data as IRegressionSolution;
+        var dataAsResult = data as IResult;
+
+        if (dataAsRegressionSolution != null) {
+          solutions.Add((IRegressionSolution)dataAsRegressionSolution.Clone());
+        } else if (dataAsResult != null && dataAsResult.Value is IRegressionSolution) {
+          solutions.Add((IRegressionSolution)dataAsResult.Value.Clone());
+        }
+
+        UpdateChart();
       }
     }
 
     private void chart_DragEnter(object sender, DragEventArgs e) {
-      e.Effect = DragDropEffects.Copy;
+      e.Effect = DragDropEffects.None;
+      if (!e.Data.GetDataPresent(HeuristicLab.Common.Constants.DragDropDataFormat)) return;
+
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      var dataAsRegressionSolution = data as IRegressionSolution;
+      var dataAsResult = data as IResult;
+
+      if (!ReadOnly &&
+        (dataAsRegressionSolution != null || (dataAsResult != null && dataAsResult.Value is IRegressionSolution))) {
+        e.Effect = DragDropEffects.Copy;
+      }
     }
 
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/TimeSeriesPrognosis/TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/TimeSeriesPrognosis/TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs	(revision 13002)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/TimeSeriesPrognosis/TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs	(revision 13003)
@@ -28,6 +28,4 @@
   [Content(typeof(ITimeSeriesPrognosisSolution))]
   public partial class TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView : RegressionSolutionErrorCharacteristicsCurveView {
-
-
     public TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView()
       : base() {
@@ -46,18 +44,16 @@
     }
 
-    protected override void UpdateChart() {
-      base.UpdateChart();
-      if (Content == null) return;
+    protected override IEnumerable<IRegressionSolution> CreateBaselineSolutions() {
+      foreach (var sol in base.CreateBaselineSolutions())
+        yield return sol;
 
       IEnumerable<double> trainingStartValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices.Select(r => r - 1).Where(r => r > 0)).ToList();
-      if (trainingStartValues.Any()) {
-        //AR1 model
-        double alpha, beta;
-        OnlineCalculatorError errorState;
-        OnlineLinearScalingParameterCalculator.Calculate(ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices.Where(x => x > 0)), trainingStartValues, out alpha, out beta, out errorState);
-        var ar1model = new TimeSeriesPrognosisAutoRegressiveModel(ProblemData.TargetVariable, new double[] { beta }, alpha).CreateTimeSeriesPrognosisSolution(ProblemData);
-        ar1model.Name = "AR(1) Model";
-        AddRegressionSolution(ar1model);
-      }
+      //AR1 model
+      double alpha, beta;
+      OnlineCalculatorError errorState;
+      OnlineLinearScalingParameterCalculator.Calculate(ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices.Where(x => x > 0)), trainingStartValues, out alpha, out beta, out errorState);
+      var ar1Solution = new TimeSeriesPrognosisAutoRegressiveModel(ProblemData.TargetVariable, new double[] { beta }, alpha).CreateTimeSeriesPrognosisSolution(ProblemData);
+      ar1Solution.Name = "AR(1)";
+      yield return ar1Solution;
     }
   }
