Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs	(revision 12005)
@@ -67,4 +67,5 @@
       Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));
       oldEncoding = Encoding;
+      if(Encoding != null) Parameterize();
       RegisterEvents();
     }
@@ -86,8 +87,22 @@
     private void RegisterEvents() {
       EncodingParameter.ValueChanged += (o, e) => OnEncodingChanged();
+      var multiEncoding = Encoding as MultiEncoding;
+      if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
     }
 
     protected virtual void OnEncodingChanged() {
-      if (oldEncoding != null) AdaptEncodingOperators(oldEncoding, Encoding);
+      Parameterize();
+
+      OnOperatorsChanged();
+      OnReset();
+    }
+
+    private void Parameterize() {
+      if (oldEncoding != null) {
+        AdaptEncodingOperators(oldEncoding, Encoding);
+        var oldMultiEncoding = oldEncoding as MultiEncoding;
+        if (oldMultiEncoding != null)
+          oldMultiEncoding.EncodingsChanged -= MultiEncodingOnEncodingsChanged;
+      }
       oldEncoding = Encoding;
 
@@ -101,10 +116,8 @@
       Parameters.Remove(SolutionCreatorParameter);
       Parameters.Add(solutionCreatorParam);
+      ((IValueParameter)solutionCreatorParam).ValueChanged += SolutionCreatorParameter_ValueChanged;
 
-      //TODO register solution creator changed event, change access modifier to private
-      //((IValueParameter)solutionCreatorParam).ValueChanged += SolutionCreatorParameter_ValueChanged;      
-
-      OnOperatorsChanged();
-      OnReset();
+      var multiEncoding = Encoding as MultiEncoding;
+      if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
     }
 
@@ -141,4 +154,7 @@
     }
 
+    protected virtual void MultiEncodingOnEncodingsChanged(object sender, EventArgs e) {
+      OnOperatorsChanged();
+    }
   }
 }
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs	(revision 12005)
@@ -21,5 +21,5 @@
 
 namespace HeuristicLab.Optimization {
-  public interface ISingleObjectiveMoveOperator : IMoveOperator {
+  public interface ISingleObjectiveMoveOperator : IMoveOperator, ISingleObjectiveOperator {
   }
 }
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs	(revision 12005)
@@ -24,5 +24,5 @@
 
 namespace HeuristicLab.Optimization {
-  internal interface IMultiObjectiveAnalysisOperator : IEncodingOperator, IAnalyzer {
+  internal interface IMultiObjectiveAnalysisOperator : IEncodingOperator, IAnalyzer, IMultiObjectiveOperator {
     Action<Individual[], double[][], ResultCollection, IRandom> AnalyzeAction { get; set; }
   }
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs	(revision 12005)
@@ -24,5 +24,5 @@
 
 namespace HeuristicLab.Optimization {
-  internal interface ISingleObjectiveAnalysisOperator : IEncodingOperator {
+  internal interface ISingleObjectiveAnalysisOperator : IEncodingOperator, ISingleObjectiveOperator {
     Action<Individual[], double[], ResultCollection, IRandom> AnalyzeAction { get; set; }
   }
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs	(revision 12005)
@@ -41,5 +41,5 @@
     protected MultiObjectiveBasicProblem()
       : base() {
-      Parameters.Add(new ValueParameter<BoolArray>("Maximization", "Set to false if the problem should be minimized.", new BoolArray()));
+      Parameters.Add(new ValueParameter<BoolArray>("Maximization", "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(Maximization).AsReadOnly()));
 
       Operators.Add(Evaluator);
@@ -58,7 +58,20 @@
     public virtual void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) { }
 
-    protected override void OnEncodingChanged() {
-      base.OnEncodingChanged();
-      Parameters["Maximization"].ActualValue = new BoolArray(Maximization);
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      if (Encoding != null) {
+        PruneSingleObjectiveOperators(Encoding);
+        var multiEncoding = Encoding as MultiEncoding;
+        if (multiEncoding != null) {
+          foreach (var encoding in multiEncoding.Encodings.ToList()) {
+            PruneSingleObjectiveOperators(encoding);
+          }
+        }
+      }
+    }
+
+    private void PruneSingleObjectiveOperators(IEncoding encoding) {
+      if (encoding != null && encoding.Operators.Any(x => x is ISingleObjectiveOperator && !(x is IMultiObjectiveOperator)))
+        encoding.Operators = encoding.Operators.Where(x => !(x is ISingleObjectiveOperator) || x is IMultiObjectiveOperator).ToList();
     }
 
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs	(revision 11961)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs	(revision 12005)
@@ -33,4 +33,20 @@
     ISingleObjectiveProblemDefinition, ISingleObjectiveHeuristicOptimizationProblem
   where TEncoding : class, IEncoding {
+
+    protected IValueParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+
+    public double BestKnownQuality {
+      get {
+        if (BestKnownQualityParameter.Value == null) return double.NaN;
+        return BestKnownQualityParameter.Value.Value;
+      }
+      set {
+        if (BestKnownQualityParameter.Value == null) BestKnownQualityParameter.Value = new DoubleValue(value);
+        else BestKnownQualityParameter.Value.Value = value;
+      }
+    }
+
     [StorableConstructor]
     protected SingleObjectiveBasicProblem(bool deserializing) : base(deserializing) { }
@@ -43,5 +59,5 @@
     protected SingleObjectiveBasicProblem()
       : base() {
-      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", new BoolValue()));
+      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", (BoolValue)new BoolValue(Maximization).AsReadOnly()) { Hidden = true });
       Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this problem."));
 
@@ -68,9 +84,20 @@
     }
 
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      if (Encoding != null) {
+        PruneMultiObjectiveOperators(Encoding);
+        var multiEncoding = Encoding as MultiEncoding;
+        if (multiEncoding != null) {
+          foreach (var encoding in multiEncoding.Encodings.ToList()) {
+            PruneMultiObjectiveOperators(encoding);
+          }
+        }
+      }
+    }
 
-    protected override void OnEncodingChanged() {
-      base.OnEncodingChanged();
-      var max = (BoolValue)Parameters["Maximization"].ActualValue;
-      max.Value = Maximization;
+    private void PruneMultiObjectiveOperators(IEncoding encoding) {
+      if (encoding.Operators.Any(x => x is IMultiObjectiveOperator && !(x is ISingleObjectiveOperator)))
+        encoding.Operators = encoding.Operators.Where(x => !(x is IMultiObjectiveOperator) || x is ISingleObjectiveOperator).ToList();
     }
 
