Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs	(revision 17315)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblem.cs	(revision 17317)
@@ -20,9 +20,12 @@
 #endregion
 
+using System;
 using HEAL.Attic;
 
 namespace HeuristicLab.Optimization {
   [StorableType("251d79f1-a065-47f9-85a3-2e8dbdbf685e")]
-  public interface IMultiObjectiveProblem : IProblem, IMultiObjectiveHeuristicOptimizationProblem { }
+  public interface IMultiObjectiveProblem : IProblem, IMultiObjectiveHeuristicOptimizationProblem {
+    event EventHandler MaximizationChanged;
+  }
 
   [StorableType("806fb361-1469-4903-9f54-f8678b0717b9")]
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs	(revision 17315)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblem.cs	(revision 17317)
@@ -20,10 +20,12 @@
 #endregion
 
-
+using System;
 using HEAL.Attic;
 
 namespace HeuristicLab.Optimization {
   [StorableType("24830fd5-7d97-41a5-9d7e-d84f1b7ab259")]
-  public interface ISingleObjectiveProblem : ISingleObjectiveHeuristicOptimizationProblem { }
+  public interface ISingleObjectiveProblem : ISingleObjectiveHeuristicOptimizationProblem {
+    event EventHandler MaximizationChanged;
+  }
 
   [StorableType("9cc9422f-0bb5-41e8-9d9e-6e0b66a66449")]
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs	(revision 17315)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveProblem.cs	(revision 17317)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -37,5 +38,4 @@
     where TEncodedSolution : class, IEncodedSolution {
     #region Parameternames
-    public const string MaximizationParameterName = "Maximization";
     public const string BestKnownFrontParameterName = "BestKnownFront";
     public const string ReferencePointParameterName = "ReferencePoint";
@@ -43,7 +43,5 @@
 
     #region Parameterproperties
-    public IValueParameter<BoolArray> MaximizationParameter {
-      get { return (IValueParameter<BoolArray>)Parameters[MaximizationParameterName]; }
-    }
+    [Storable] public IValueParameter<BoolArray> MaximizationParameter { get; }
     public IValueParameter<DoubleMatrix> BestKnownFrontParameter {
       get { return (IValueParameter<DoubleMatrix>)Parameters[BestKnownFrontParameterName]; }
@@ -60,9 +58,11 @@
     protected MultiObjectiveProblem(MultiObjectiveProblem<TEncoding, TEncodedSolution> original, Cloner cloner)
       : base(original, cloner) {
+      MaximizationParameter = cloner.Clone(original.MaximizationParameter);
       ParameterizeOperators();
     }
 
     protected MultiObjectiveProblem() : base() {
-      Parameters.Add(new ValueParameter<BoolArray>(MaximizationParameterName, "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(Maximization).AsReadOnly()));
+      MaximizationParameter = new ValueParameter<BoolArray>("Maximization", "The dimensions correspond to the different objectives: False if the objective should be minimized, true if it should be maximized..", new BoolArray(new bool[] { }, @readonly: true));
+      Parameters.Add(MaximizationParameter);
       Parameters.Add(new OptionalValueParameter<DoubleMatrix>(BestKnownFrontParameterName, "A double matrix representing the best known qualites for this problem (aka points on the Pareto front). Points are to be given in a row-wise fashion."));
       Parameters.Add(new OptionalValueParameter<DoubleArray>(ReferencePointParameterName, "The refrence point for hypervolume calculations on this problem"));
@@ -73,5 +73,6 @@
 
     protected MultiObjectiveProblem(TEncoding encoding) : base(encoding) {
-      Parameters.Add(new ValueParameter<BoolArray>(MaximizationParameterName, "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(Maximization).AsReadOnly()));
+      MaximizationParameter = new ValueParameter<BoolArray>("Maximization", "The dimensions correspond to the different objectives: False if the objective should be minimized, true if it should be maximized..", new BoolArray(new bool[] { }, @readonly: true));
+      Parameters.Add(MaximizationParameter);
       Parameters.Add(new OptionalValueParameter<DoubleMatrix>(BestKnownFrontParameterName, "A double matrix representing the best known qualites for this problem (aka points on the Pareto front). Points are to be given in a row-wise fashion."));
       Parameters.Add(new OptionalValueParameter<DoubleArray>(ReferencePointParameterName, "The refrence point for hypervolume calculations on this problem"));
@@ -89,5 +90,12 @@
       get { return Maximization.Length; }
     }
-    public abstract bool[] Maximization { get; }
+    public bool[] Maximization {
+      get { return MaximizationParameter.Value.CloneAsArray(); }
+      protected set {
+        if (MaximizationParameter.Value.SequenceEqual(value)) return;
+        MaximizationParameter.ForceValue(new BoolArray(value, @readonly: true));
+        OnMaximizationChanged();
+      }
+    }
 
     public virtual IReadOnlyList<double[]> BestKnownFront {
@@ -168,5 +176,5 @@
     #region IMultiObjectiveHeuristicOptimizationProblem Members
     IParameter IMultiObjectiveHeuristicOptimizationProblem.MaximizationParameter {
-      get { return Parameters[MaximizationParameterName]; }
+      get { return MaximizationParameter; }
     }
     IMultiObjectiveEvaluator IMultiObjectiveHeuristicOptimizationProblem.Evaluator {
@@ -174,4 +182,9 @@
     }
     #endregion
+
+    public event EventHandler MaximizationChanged;
+    protected void OnMaximizationChanged() {
+      MaximizationChanged?.Invoke(this, EventArgs.Empty);
+    }
   }
 }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17315)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17317)
@@ -59,8 +59,7 @@
       get { return MaximizationParameter.Value.Value; }
       protected set {
-        if (MaximizationParameter.Value.Value == value) return;
-        MaximizationParameter.ReadOnly = false;
-        MaximizationParameter.Value = new BoolValue(value).AsReadOnly();
-        MaximizationParameter.ReadOnly = true;
+        if (Maximization == value) return;
+        MaximizationParameter.ForceValue(new BoolValue(value, @readonly: true));
+        OnMaximizationChanged();
       }
     }
@@ -185,4 +184,9 @@
     }
     #endregion
+
+    public event EventHandler MaximizationChanged;
+    protected void OnMaximizationChanged() {
+      MaximizationChanged?.Invoke(this, EventArgs.Empty);
+    }
   }
 }
