Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs	(revision 7085)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Common;
 using HeuristicLab.Data;
 using HeuristicLab.MainForm;
@@ -96,6 +97,6 @@
 
       int classValuesCount = Content.ProblemData.ClassValues.Count;
-      int modelCount = Content.Model.Models.Count();
-      string[,] values = new string[indizes.Length, 5 + classValuesCount + modelCount];
+      int solutionsCount = Content.ClassificationSolutions.Count();
+      string[,] values = new string[indizes.Length, 5 + classValuesCount + solutionsCount];
       double[] target = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable).ToArray();
       List<List<double?>> estimatedValuesVector = GetEstimatedValues(SamplesComboBox.SelectedItem.ToString(), indizes,
@@ -106,20 +107,24 @@
         values[i, 0] = row.ToString();
         values[i, 1] = target[i].ToString();
-        values[i, 2] = estimatedClassValues[i].ToString();
-        values[i, 3] = (target[i] == estimatedClassValues[i]).ToString();
-        var groups = estimatedValuesVector[i].GroupBy(x => x).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
-        var estimationCount = groups.Where(g => g.Key != null).Select(g => g.Count).Sum();
-        values[i, 4] = (((double)groups.Where(g => g.Key == estimatedClassValues[i]).Single().Count) / estimationCount).ToString();
-        for (int classIndex = 0; classIndex < Content.ProblemData.ClassValues.Count; classIndex++) {
-          var group = groups.Where(g => g.Key == Content.ProblemData.ClassValues[classIndex]).SingleOrDefault();
-          if (group == null) values[i, 5 + classIndex] = 0.ToString();
-          else values[i, 5 + classIndex] = group.Count.ToString();
+        //display only indices and target values if no models are present
+        if (solutionsCount > 0) {
+          values[i, 2] = estimatedClassValues[i].ToString();
+          values[i, 3] = (target[i].IsAlmost(estimatedClassValues[i])).ToString();
+          var groups =
+            estimatedValuesVector[i].GroupBy(x => x).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
+          var estimationCount = groups.Where(g => g.Key != null).Select(g => g.Count).Sum();
+          values[i, 4] =
+            (((double)groups.Where(g => g.Key == estimatedClassValues[i]).Single().Count) / estimationCount).ToString();
+          for (int classIndex = 0; classIndex < Content.ProblemData.ClassValues.Count; classIndex++) {
+            var group = groups.Where(g => g.Key == Content.ProblemData.ClassValues[classIndex]).SingleOrDefault();
+            if (group == null) values[i, 5 + classIndex] = 0.ToString();
+            else values[i, 5 + classIndex] = group.Count.ToString();
+          }
+          for (int modelIndex = 0; modelIndex < estimatedValuesVector[i].Count; modelIndex++) {
+            values[i, 5 + classValuesCount + modelIndex] = estimatedValuesVector[i][modelIndex] == null
+                                                             ? string.Empty
+                                                             : estimatedValuesVector[i][modelIndex].ToString();
+          }
         }
-        for (int modelIndex = 0; modelIndex < estimatedValuesVector[i].Count; modelIndex++) {
-          values[i, 5 + classValuesCount + modelIndex] = estimatedValuesVector[i][modelIndex] == null
-                                                           ? string.Empty
-                                                           : estimatedValuesVector[i][modelIndex].ToString();
-        }
-
       }
 
@@ -131,5 +136,4 @@
       matrix.SortableView = true;
       matrixView.Content = matrix;
-      UpdateColoringOfRows();
     }
 
@@ -162,19 +166,8 @@
         return;
       }
-      bool correctClassified = bool.Parse(matrixView.DataGridView[3, e.RowIndex].Value.ToString());
+      var cellValue = matrixView.DataGridView[3, e.RowIndex].Value.ToString();
+      if (string.IsNullOrEmpty(cellValue)) return;
+      bool correctClassified = bool.Parse(cellValue);
       matrixView.DataGridView.Rows[e.RowIndex].DefaultCellStyle.ForeColor = correctClassified ? Color.MediumSeaGreen : Color.Red;
-    }
-
-    private void UpdateColoringOfRows() {
-      if (InvokeRequired) {
-        Invoke((Action)UpdateColoringOfRows);
-        return;
-      }
-      //matrixView.DataGridView.SuspendRepaint();
-      //for (int i = 0; i < matrixView.DataGridView.Rows.Count; i++) {
-      //  bool correctClassified = bool.Parse(matrixView.Content.GetValue(i, 3));
-      //  matrixView.DataGridView.Rows[i].DefaultCellStyle.ForeColor = correctClassified ? Color.MediumSeaGreen : Color.Red;
-      //}
-      //matrixView.DataGridView.ResumeRepaint(true);
     }
   }
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.Designer.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.Designer.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.Designer.cs	(revision 7085)
@@ -49,11 +49,13 @@
       this.benchmarkComboBox = new System.Windows.Forms.ComboBox();
       this.loadButton = new System.Windows.Forms.Button();
+      this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tableLayoutPanel1.SuspendLayout();
       this.SuspendLayout();
       // 
       // parameterCollectionView
       // 
-      this.parameterCollectionView.Location = new System.Drawing.Point(3, 55);
-      this.parameterCollectionView.Size = new System.Drawing.Size(490, 279);
+      this.parameterCollectionView.Location = new System.Drawing.Point(3, 80);
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 254);
       this.parameterCollectionView.TabIndex = 4;
       // 
@@ -74,5 +76,5 @@
       this.importButton.Location = new System.Drawing.Point(3, 24);
       this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(243, 23);
+      this.importButton.Size = new System.Drawing.Size(487, 23);
       this.importButton.TabIndex = 3;
       this.importButton.Text = "Import from CSV file";
@@ -82,22 +84,26 @@
       // openFileDialog
       // 
-      this.openFileDialog.FileName = "openFileDialog";
+      this.openFileDialog.Filter = "CSV files|*.csv|Text files|*.txt|All files|*.*";
+      this.openFileDialog.Title = "Import data...";
       // 
       // benchmarkComboBox
       // 
-      this.benchmarkComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.benchmarkComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.benchmarkComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.benchmarkComboBox.FormattingEnabled = true;
-      this.benchmarkComboBox.Location = new System.Drawing.Point(252, 25);
+      this.benchmarkComboBox.Location = new System.Drawing.Point(3, 3);
       this.benchmarkComboBox.Name = "benchmarkComboBox";
-      this.benchmarkComboBox.Size = new System.Drawing.Size(183, 21);
+      this.benchmarkComboBox.Size = new System.Drawing.Size(240, 21);
       this.benchmarkComboBox.TabIndex = 5;
       // 
       // loadButton
       // 
-      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.loadButton.Location = new System.Drawing.Point(439, 24);
+      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadButton.Location = new System.Drawing.Point(249, 2);
+      this.loadButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3);
       this.loadButton.Name = "loadButton";
-      this.loadButton.Size = new System.Drawing.Size(50, 23);
+      this.loadButton.Size = new System.Drawing.Size(241, 23);
       this.loadButton.TabIndex = 6;
       this.loadButton.Text = "Load";
@@ -105,21 +111,36 @@
       this.loadButton.Click += new System.EventHandler(this.loadButton_Click);
       // 
+      // tableLayoutPanel1
+      // 
+      this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tableLayoutPanel1.ColumnCount = 2;
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel1.Controls.Add(this.benchmarkComboBox, 0, 0);
+      this.tableLayoutPanel1.Controls.Add(this.loadButton, 1, 0);
+      this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 51);
+      this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+      this.tableLayoutPanel1.RowCount = 1;
+      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel1.Size = new System.Drawing.Size(493, 28);
+      this.tableLayoutPanel1.TabIndex = 7;
+      // 
       // DataAnalysisProblemView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.loadButton);
       this.Controls.Add(this.importButton);
-      this.Controls.Add(this.benchmarkComboBox);
+      this.Controls.Add(this.tableLayoutPanel1);
       this.Name = "DataAnalysisProblemView";
       this.Size = new System.Drawing.Size(493, 334);
-      this.Controls.SetChildIndex(this.benchmarkComboBox, 0);
+      this.Controls.SetChildIndex(this.tableLayoutPanel1, 0);
       this.Controls.SetChildIndex(this.importButton, 0);
-      this.Controls.SetChildIndex(this.loadButton, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
       this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tableLayoutPanel1.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -133,4 +154,5 @@
     private System.Windows.Forms.ComboBox benchmarkComboBox;
     private System.Windows.Forms.Button loadButton;
+    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
   }
 }
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.cs	(revision 7085)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Common;
 using HeuristicLab.MainForm;
 using HeuristicLab.Optimization.Views;
@@ -65,5 +66,5 @@
       base.OnContentChanged();
       benchmarkComboBox.Items.Clear();
-      benchmarkComboBox.Items.AddRange(GetBenchmarkProblemDataGenerators().OrderBy(b => b.Name).ToArray());
+      benchmarkComboBox.Items.AddRange(GetBenchmarkProblemDataGenerators().OrderBy(b => b.Name, new NaturalStringComparer()).ToArray());
       if (benchmarkComboBox.Items.Count > 0)
         benchmarkComboBox.SelectedIndex = 0;
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.resx
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.resx	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisProblemView.resx	(revision 7085)
@@ -121,4 +121,7 @@
     <value>107, 17</value>
   </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
   <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.Designer.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.Designer.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.Designer.cs	(revision 7085)
@@ -49,4 +49,5 @@
       this.chart.TabIndex = 0;
       this.chart.Text = "chart";
+      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
       // 
       // label1
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs	(revision 7085)
@@ -31,4 +31,5 @@
   [Content(typeof(IRegressionSolution))]
   public partial class RegressionSolutionErrorCharacteristicsCurveView : DataAnalysisSolutionEvaluationView {
+    private IRegressionSolution constantModel;
     protected const string TrainingSamples = "Training";
     protected const string TestSamples = "Test";
@@ -101,6 +102,7 @@
       if (Content == null) return;
 
-      var originalValues = GetOriginalValues();
-      var meanModelEstimatedValues = GetMeanModelEstimatedValues(originalValues);
+      var originalValues = GetOriginalValues().ToList();
+      constantModel = CreateConstantModel();
+      var meanModelEstimatedValues = GetEstimatedValues(constantModel);
       var meanModelResiduals = GetResiduals(originalValues, meanModelEstimatedValues);
 
@@ -113,4 +115,5 @@
       UpdateSeries(meanModelResiduals, meanModelSeries);
       meanModelSeries.ToolTip = "Area over Curve: " + CalculateAreaOverCurve(meanModelSeries);
+      meanModelSeries.Tag = constantModel;
       chart.Series.Add(meanModelSeries);
 
@@ -133,4 +136,5 @@
       series.Points.Clear();
       residuals.Sort();
+      if (!residuals.Any() || residuals.All(double.IsNaN)) return;
 
       series.Points.AddXY(0, 0);
@@ -146,5 +150,5 @@
 
         point.XValue = residuals[i];
-        point.YValues[0] = ((double)i+1) / residuals.Count;
+        point.YValues[0] = ((double)i + 1) / residuals.Count;
         point.ToolTip = "Error: " + point.XValue + "\n" + "Samples: " + point.YValues[0];
         series.Points.Add(point);
@@ -206,5 +210,5 @@
 
     private double CalculateAreaOverCurve(Series series) {
-      if (series.Points.Count < 1) throw new ArgumentException("Could not calculate area under curve if less than 1 data points were given.");
+      if (series.Points.Count < 1) return 0;
 
       double auc = 0.0;
@@ -224,4 +228,22 @@
       else UpdateChart();
     }
+
+    #region Mean Model
+    private void chart_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Clicks < 2) return;
+      HitTestResult result = chart.HitTest(e.X, e.Y);
+      if (result.ChartElementType != ChartElementType.LegendItem) return;
+      if (result.Series.Name != constantModel.Name) return;
+
+      MainFormManager.MainForm.ShowContent((IRegressionSolution)result.Series.Tag);
+    }
+
+    private IRegressionSolution CreateConstantModel() {
+      double averageTrainingTarget = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndizes).Average();
+      var solution = new ConstantRegressionModel(averageTrainingTarget).CreateRegressionSolution(ProblemData);
+      solution.Name = "Mean Model";
+      return solution;
+    }
+    #endregion
   }
 }
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionScatterPlotView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionScatterPlotView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionScatterPlotView.cs	(revision 7085)
@@ -20,5 +20,4 @@
 #endregion
 using System;
-using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -172,6 +171,6 @@
         string targetVariableName = Content.ProblemData.TargetVariable;
 
-        IEnumerable<double> predictedValues = null;
-        IEnumerable<double> targetValues = null;
+        double[] predictedValues = null;
+        double[] targetValues = null;
         switch (series.Name) {
           case ALL_SERIES:
@@ -188,5 +187,6 @@
             break;
         }
-        series.Points.DataBindXY(predictedValues, "", targetValues, "");
+        if (predictedValues.Length == targetValues.Length)
+          series.Points.DataBindXY(predictedValues, "", targetValues, "");
         this.chart.Legends[series.Legend].ForeColor = Color.Black;
         UpdateCursorInterval();
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.cs	(revision 7085)
@@ -37,4 +37,9 @@
     }
 
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      itemsListView.Items.Remove(itemsListView.FindItemWithText("Model: ClassificationEnsembleModel"));
+    }
+
     #region drag & drop
     protected override void itemsListView_DragDrop(object sender, DragEventArgs e) {
Index: branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionEnsembleSolutionView.cs
===================================================================
--- branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionEnsembleSolutionView.cs	(revision 7044)
+++ branches/RegressionBenchmarks/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionEnsembleSolutionView.cs	(revision 7085)
@@ -37,4 +37,9 @@
     }
 
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      itemsListView.Items.Remove(itemsListView.FindItemWithText("Model: RegressionEnsembleModel"));
+    }
+
     #region drag & drop
     protected override void itemsListView_DragDrop(object sender, DragEventArgs e) {
