Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.Designer.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.Designer.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/ClassificationEnsembleSolutionView.Designer.cs	(revision 8534)
@@ -70,4 +70,5 @@
       // cmbWeightCalculator
       // 
+      this.cmbWeightCalculator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.cmbWeightCalculator.FormattingEnabled = true;
       this.cmbWeightCalculator.Location = new System.Drawing.Point(9, 6);
@@ -79,5 +80,4 @@
       // ClassificationEnsembleSolutionView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Name = "ClassificationEnsembleSolutionView";
@@ -94,5 +94,6 @@
     #endregion
 
-    private System.Windows.Forms.ComboBox cmbWeightCalculator;
+    protected System.Windows.Forms.ComboBox cmbWeightCalculator;
+
   }
 }
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs	(revision 8534)
@@ -95,5 +95,5 @@
 
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new ClassificationEnsembleSolution(models, problemData);
+      return new ClassificationEnsembleSolution(models, new ClassificationEnsembleProblemData(problemData));
     }
     #endregion
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 8534)
@@ -114,4 +114,7 @@
     }
 
+    public ClassificationEnsembleSolution(IClassificationProblemData problemData) :
+      this(Enumerable.Empty<IClassificationModel>(), problemData) { }
+
     public ClassificationEnsembleSolution(IEnumerable<IClassificationModel> models, IClassificationProblemData problemData)
       : this(models, problemData,
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 8534)
@@ -277,4 +277,13 @@
 
     public ClassificationProblemData() : this(defaultDataset, defaultAllowedInputVariables, defaultTargetVariable) { }
+
+    public ClassificationProblemData(IClassificationProblemData classificationProblemData)
+      : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable) {
+      TrainingPartition.Start = classificationProblemData.TrainingPartition.Start;
+      TrainingPartition.End = classificationProblemData.TrainingPartition.End;
+      TestPartition.Start = classificationProblemData.TestPartition.Start;
+      TestPartition.End = classificationProblemData.TestPartition.End;
+    }
+
     public ClassificationProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable)
       : base(dataset, allowedInputVariables) {
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs	(revision 8534)
@@ -51,6 +51,4 @@
       valueEvaluationCache = new Dictionary<int, double>();
       classValueEvaluationCache = new Dictionary<int, double>();
-
-      SetAccuracyMaximizingThresholds();
     }
 
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs	(revision 8534)
@@ -96,5 +96,4 @@
     protected override void OnModelChanged() {
       DeregisterEventHandler();
-      SetAccuracyMaximizingThresholds();
       RegisterEventHandler();
       base.OnModelChanged();
@@ -137,22 +136,4 @@
     }
 
-    public void SetAccuracyMaximizingThresholds() {
-      double[] classValues;
-      double[] thresholds;
-      var targetClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices);
-      AccuracyMaximizationThresholdCalculator.CalculateThresholds(ProblemData, EstimatedTrainingValues, targetClassValues, out classValues, out thresholds);
-
-      Model.SetThresholdsAndClassValues(thresholds, classValues);
-    }
-
-    public void SetClassDistibutionCutPointThresholds() {
-      double[] classValues;
-      double[] thresholds;
-      var targetClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices);
-      NormalDistributionCutPointsThresholdCalculator.CalculateThresholds(ProblemData, EstimatedTrainingValues, targetClassValues, out classValues, out thresholds);
-
-      Model.SetThresholdsAndClassValues(thresholds, classValues);
-    }
-
     protected virtual void OnModelThresholdsChanged(EventArgs e) {
       CalculateResults();
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/AverageThresholdCalculator.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/AverageThresholdCalculator.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/AverageThresholdCalculator.cs	(revision 8534)
@@ -58,7 +58,4 @@
 
     protected override double GetDiscriminantConfidence(IEnumerable<IDiscriminantFunctionClassificationSolution> solutions, int index, double estimatedClassValue) {
-      // only works with binary classification
-      if (!classValues.Count().Equals(2))
-        return double.NaN;
       Dataset dataset = solutions.First().ProblemData.Dataset;
       IList<double> values = solutions.Select(s => s.Model.GetEstimatedValues(dataset, Enumerable.Repeat(index, 1)).First()).ToList();
@@ -70,7 +67,4 @@
 
     public override IEnumerable<double> GetDiscriminantConfidence(IEnumerable<IDiscriminantFunctionClassificationSolution> solutions, IEnumerable<int> indices, IEnumerable<double> estimatedClassValue) {
-      if (!classValues.Count().Equals(2))
-        return Enumerable.Repeat(double.NaN, indices.Count());
-
       Dataset dataset = solutions.First().ProblemData.Dataset;
       double[][] values = solutions.Select(s => s.Model.GetEstimatedValues(dataset, indices).ToArray()).ToArray();
@@ -87,24 +81,31 @@
 
     protected double GetAverageConfidence(double avg, double estimatedClassValue) {
-      if (estimatedClassValue.Equals(classValues[0])) {
-        if (avg < estimatedClassValue)
-          return 1;
-        else if (avg >= threshold[1])
-          return 0;
-        else {
-          double distance = threshold[1] - classValues[0];
-          return (1 / distance) * (threshold[1] - avg);
+      for (int i = 0; i < classValues.Length; i++) {
+        if (estimatedClassValue.Equals(classValues[i])) {
+          //special case: avgerage is higher than value of highest class
+          if (i == classValues.Length - 1 && avg > estimatedClassValue) {
+            return 1;
+          }
+          //special case: average is lower than value of lowest class
+          if (i == 0 && avg < estimatedClassValue) {
+            return 1;
+          }
+          //special case: average is not between threshold of estimated class value
+          if ((i < classValues.Length - 1 && avg >= threshold[i + 1]) || avg <= threshold[i]) {
+            return 0;
+          }
+
+          double thresholdToClassDistance, thresholdToAverageValueDistance;
+          if (avg >= classValues[i]) {
+            thresholdToClassDistance = threshold[i + 1] - classValues[i];
+            thresholdToAverageValueDistance = threshold[i + 1] - avg;
+          } else {
+            thresholdToClassDistance = classValues[i] - threshold[i];
+            thresholdToAverageValueDistance = avg - threshold[i];
+          }
+          return (1 / thresholdToClassDistance) * thresholdToAverageValueDistance;
         }
-      } else if (estimatedClassValue.Equals(classValues[1])) {
-        if (avg > estimatedClassValue)
-          return 1;
-        else if (avg <= threshold[1])
-          return 0;
-        else {
-          double distance = classValues[1] - threshold[1];
-          return (1 / distance) * (avg - threshold[1]);
-        }
-      } else
-        return double.NaN;
+      }
+      return double.NaN;
     }
   }
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/MedianThresholdCalculator.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/MedianThresholdCalculator.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/WeightCalculators/MedianThresholdCalculator.cs	(revision 8534)
@@ -58,7 +58,5 @@
 
     protected override double GetDiscriminantConfidence(IEnumerable<IDiscriminantFunctionClassificationSolution> solutions, int index, double estimatedClassValue) {
-      // only works with binary classification
-      if (!classValues.Count().Equals(2))
-        return double.NaN;
+
       Dataset dataset = solutions.First().ProblemData.Dataset;
       IList<double> values = solutions.Select(s => s.Model.GetEstimatedValues(dataset, Enumerable.Repeat(index, 1)).First()).ToList();
@@ -70,6 +68,4 @@
 
     public override IEnumerable<double> GetDiscriminantConfidence(IEnumerable<IDiscriminantFunctionClassificationSolution> solutions, IEnumerable<int> indices, IEnumerable<double> estimatedClassValue) {
-      if (!classValues.Count().Equals(2))
-        return Enumerable.Repeat(double.NaN, indices.Count());
 
       Dataset dataset = solutions.First().ProblemData.Dataset;
@@ -87,24 +83,31 @@
 
     protected double GetMedianConfidence(double median, double estimatedClassValue) {
-      if (estimatedClassValue.Equals(classValues[0])) {
-        if (median < estimatedClassValue)
-          return 1;
-        else if (median >= threshold[1])
-          return 0;
-        else {
-          double distance = threshold[1] - classValues[0];
-          return (1 / distance) * (threshold[1] - median);
+      for (int i = 0; i < classValues.Length; i++) {
+        if (estimatedClassValue.Equals(classValues[i])) {
+          //special case: avgerage is higher than value of highest class
+          if (i == classValues.Length - 1 && median > estimatedClassValue) {
+            return 1;
+          }
+          //special case: average is lower than value of lowest class
+          if (i == 0 && median < estimatedClassValue) {
+            return 1;
+          }
+          //special case: average is not between threshold of estimated class value
+          if ((i < classValues.Length - 1 && median >= threshold[i + 1]) || median <= threshold[i]) {
+            return 0;
+          }
+
+          double thresholdToClassDistance, thresholdToAverageValueDistance;
+          if (median >= classValues[i]) {
+            thresholdToClassDistance = threshold[i + 1] - classValues[i];
+            thresholdToAverageValueDistance = threshold[i + 1] - median;
+          } else {
+            thresholdToClassDistance = classValues[i] - threshold[i];
+            thresholdToAverageValueDistance = median - threshold[i];
+          }
+          return (1 / thresholdToClassDistance) * thresholdToAverageValueDistance;
         }
-      } else if (estimatedClassValue.Equals(classValues[1])) {
-        if (median > estimatedClassValue)
-          return 1;
-        else if (median <= threshold[1])
-          return 0;
-        else {
-          double distance = classValues[1] - threshold[1];
-          return (1 / distance) * (median - threshold[1]);
-        }
-      } else
-        return double.NaN;
+      }
+      return double.NaN;
     }
 
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs	(revision 8534)
@@ -55,5 +55,5 @@
 
     public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new ConstantRegressionSolution(this, problemData);
+      return new ConstantRegressionSolution(this, new RegressionProblemData(problemData));
     }
   }
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs	(revision 8534)
@@ -102,5 +102,5 @@
 
     public RegressionEnsembleSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new RegressionEnsembleSolution(this.Models, problemData);
+      return new RegressionEnsembleSolution(this.Models, new RegressionEnsembleProblemData(problemData));
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
Index: branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs
===================================================================
--- branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 8510)
+++ branches/ClassificationEnsembleVoting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 8534)
@@ -121,4 +121,11 @@
       : this(defaultDataset, defaultAllowedInputVariables, defaultTargetVariable) {
     }
+    public RegressionProblemData(IRegressionProblemData regressionProblemData)
+      : this(regressionProblemData.Dataset, regressionProblemData.AllowedInputVariables, regressionProblemData.TargetVariable) {
+      TrainingPartition.Start = regressionProblemData.TrainingPartition.Start;
+      TrainingPartition.End = regressionProblemData.TrainingPartition.End;
+      TestPartition.Start = regressionProblemData.TestPartition.Start;
+      TestPartition.End = regressionProblemData.TestPartition.End;
+    }
 
     public RegressionProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable)
