Index: branches/Classification-Extensions/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- branches/Classification-Extensions/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 11604)
+++ branches/Classification-Extensions/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 11606)
@@ -36,4 +36,5 @@
     protected const string ClassNamesParameterName = "ClassNames";
     protected const string ClassificationPenaltiesParameterName = "ClassificationPenalties";
+    protected const string PositiveClassNameParameterName = "PositiveClass";
     protected const int MaximumNumberOfClasses = 100;
     protected const int InspectedRowsToDetermineTargets = 2000;
@@ -213,4 +214,7 @@
       get { return (IFixedValueParameter<StringMatrix>)Parameters[ClassNamesParameterName]; }
     }
+    public IConstrainedValueParameter<StringValue> PositiveClassNameParameter {
+      get { return (IConstrainedValueParameter<StringValue>)Parameters[PositiveClassNameParameterName]; }
+    }
     public IFixedValueParameter<DoubleMatrix> ClassificationPenaltiesParameter {
       get { return (IFixedValueParameter<DoubleMatrix>)Parameters[ClassificationPenaltiesParameterName]; }
@@ -262,4 +266,13 @@
       get { return ClassNamesCache; }
     }
+
+    public string PositiveClassName {
+      get { return PositiveClassNameParameter.Value.Value; }
+      set {
+        var matchingValue = PositiveClassNameParameter.ValidValues.SingleOrDefault(x => x.Value == value);
+        if (matchingValue == null) throw new ArgumentException(string.Format("{0} cannot be set as positive class.", value));
+        PositiveClassNameParameter.Value = matchingValue;
+      }
+    }
     #endregion
 
@@ -270,4 +283,13 @@
     private void AfterDeserialization() {
       RegisterParameterEvents();
+      // BackwardsCompatibility3.4
+      #region Backwards compatible code, remove with 3.5
+      if (!Parameters.ContainsKey(PositiveClassNameParameterName)) {
+        var validValues = new ItemSet<StringValue>(ClassNames.Select(s => new StringValue(s).AsReadOnly()));
+        Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassNameParameterName,
+          "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)", validValues, validValues.First()));
+      }
+      #endregion
+
     }
 
@@ -307,4 +329,5 @@
       Parameters.Add(new ConstrainedValueParameter<StringValue>(TargetVariableParameterName, new ItemSet<StringValue>(validTargetVariableValues), target));
       Parameters.Add(new FixedValueParameter<StringMatrix>(ClassNamesParameterName, ""));
+      Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassNameParameterName, "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)"));
       Parameters.Add(new FixedValueParameter<DoubleMatrix>(ClassificationPenaltiesParameterName, ""));
 
@@ -340,4 +363,9 @@
       ClassNamesParameter.Value.RowNames = ClassValues.Select(s => "ClassValue: " + s);
 
+      PositiveClassNameParameter.ValidValues.Clear();
+      foreach (var className in ClassNames) {
+        PositiveClassNameParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
+      }
+
       ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Rows = Classes;
       ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Columns = Classes;
@@ -411,7 +439,18 @@
     }
     private void Parameter_ValueChanged(object sender, EventArgs e) {
+      var oldPositiveClass = PositiveClassName;
+      var oldClassNames = classNamesCache;
+      var index = oldClassNames.IndexOf(oldPositiveClass);
+
       classNamesCache = null;
       ClassificationPenaltiesParameter.Value.RowNames = ClassNames.Select(name => "Actual " + name);
       ClassificationPenaltiesParameter.Value.ColumnNames = ClassNames.Select(name => "Estimated " + name);
+
+      PositiveClassNameParameter.ValidValues.Clear();
+      foreach (var className in ClassNames) {
+        PositiveClassNameParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
+      }
+      PositiveClassNameParameter.Value = PositiveClassNameParameter.ValidValues.ElementAt(index);
+
       OnChanged();
     }
@@ -435,5 +474,11 @@
       if (!newClassValues.SequenceEqual(ClassValues)) {
         errorMessage = errorMessage + string.Format("The class values differ in the provided classification problem data.");
-        return false;
+        returnValue = false;
+      }
+
+      var newPositivieClassName = classificationProblemData.PositiveClassName;
+      if (newPositivieClassName != PositiveClassName) {
+        errorMessage = errorMessage + string.Format("The positive class differs in the provided classification problem data.");
+        returnValue = false;
       }
 
@@ -452,4 +497,6 @@
         ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i);
 
+      PositiveClassName = classificationProblemData.PositiveClassName;
+
       for (int i = 0; i < Classes; i++) {
         for (int j = 0; j < Classes; j++) {
