Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 17614)
@@ -185,7 +185,9 @@
     protected override void DeregisterProblemEvents() {
       Problem.Reset -= new EventHandler(Problem_Reset);
+      Problem.OperatorsChanged -= new EventHandler(Problem_OperatorsChanged);
     }
     protected override void RegisterProblemEvents() {
       Problem.Reset += new EventHandler(Problem_Reset);
+      Problem.OperatorsChanged += new EventHandler(Problem_OperatorsChanged);
     }
     protected virtual void Problem_OperatorsChanged(object sender, EventArgs e) { }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/CombinedEncoding.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/CombinedEncoding.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/CombinedEncoding.cs	(revision 17614)
@@ -55,5 +55,4 @@
       : base("CombinedEncoding") {
       encodings = new ItemCollection<IEncoding>();
-      SolutionCreator = new MultiEncodingCreator() { SolutionParameter = { ActualName = Name } };
       foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>()) {
         @operator.SolutionParameter.ActualName = Name;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 17614)
@@ -52,27 +52,5 @@
         encodingOperators.Clear();
         foreach (var op in value) encodingOperators.Add(op);
-
-        ISolutionCreator<TEncodedSolution> newSolutionCreator = (ISolutionCreator<TEncodedSolution>)encodingOperators.FirstOrDefault(o => o.GetType() == SolutionCreator.GetType()) ??
-                               encodingOperators.OfType<ISolutionCreator<TEncodedSolution>>().First();
-        SolutionCreator = newSolutionCreator;
         OnOperatorsChanged();
-      }
-    }
-
-    public IValueParameter SolutionCreatorParameter {
-      get { return (IValueParameter)Parameters[Name + ".SolutionCreator"]; }
-    }
-
-    ISolutionCreator IEncoding.SolutionCreator {
-      get { return SolutionCreator; }
-    }
-    public ISolutionCreator<TEncodedSolution> SolutionCreator {
-      get { return (ISolutionCreator<TEncodedSolution>)SolutionCreatorParameter.Value; }
-      set {
-        if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
-        encodingOperators.Remove(SolutionCreator);
-        encodingOperators.Add(value);
-        SolutionCreatorParameter.Value = value;
-        OnSolutionCreatorChanged();
       }
     }
@@ -82,29 +60,16 @@
     protected Encoding(StorableConstructorFlag _) : base(_) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterEventHandlers();
-    }
+    private void AfterDeserialization() { }
 
     protected Encoding(Encoding<TEncodedSolution> original, Cloner cloner)
       : base(original, cloner) {
       encodingOperators = cloner.Clone(original.encodingOperators);
-
-      RegisterEventHandlers();
     }
 
     protected Encoding(string name)
       : base(name) {
-      Parameters.Add(new ValueParameter<ISolutionCreator<TEncodedSolution>>(name + ".SolutionCreator", "The operator to create a solution.") {
-        ReadOnly = true
-      });
       Parameters.Add(new FixedValueParameter<ReadOnlyItemSet<IOperator>>(name + ".Operators", "The operators that the encoding specifies.", encodingOperators.AsReadOnly()) {
         GetsCollected = false, ReadOnly = true
       });
-
-      RegisterEventHandlers();
-    }
-
-    private void RegisterEventHandlers() {
-      SolutionCreatorParameter.ValueChanged += (o, e) => OnSolutionCreatorChanged();
     }
 
@@ -137,11 +102,4 @@
     }
 
-    public event EventHandler SolutionCreatorChanged;
-    protected virtual void OnSolutionCreatorChanged() {
-      ConfigureOperator(SolutionCreator);
-      var handler = SolutionCreatorChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
     public event EventHandler OperatorsChanged;
     protected virtual void OnOperatorsChanged() {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 17614)
@@ -28,7 +28,4 @@
   [StorableType("d70b2675-246c-489c-a91b-b2e19a1616a3")]
   public interface IEncoding : IParameterizedNamedItem {
-    IValueParameter SolutionCreatorParameter { get; }
-    ISolutionCreator SolutionCreator { get; }
-
     IEnumerable<IOperator> Operators { get; set; }
 
@@ -37,5 +34,4 @@
 
     event EventHandler OperatorsChanged;
-    event EventHandler SolutionCreatorChanged;
   }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs	(revision 17614)
@@ -40,4 +40,6 @@
   //TODO Intermediate class for compatibility 
   //TODO move members to generic IProblem after every problem used the new architecture
+  //TODO ABE: We can maybe use it as non-generic interface that exports IEncoding Encoding { get; }
+  //TODO ABE: and which is explicitely implemented in some base class
   public interface IEncodedProblem : IProblem {
     IEnumerable<IItem> Operators { get; }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 17614)
@@ -20,6 +20,4 @@
 #endregion
 
-using System;
-using System.Linq;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -57,27 +55,4 @@
     }
 
-    public override void AddEncoding(IEncoding encoding) {
-      base.AddEncoding(encoding);
-      var parameter = GetParameter(encoding);
-      parameter.Value = encoding.SolutionCreator;
-      encoding.SolutionCreatorChanged += Encoding_SolutionCreatorChanged;
-    }
-
-    public override bool RemoveEncoding(IEncoding encoding) {
-      var success = base.RemoveEncoding(encoding);
-      encoding.SolutionCreatorChanged -= Encoding_SolutionCreatorChanged;
-      return success;
-    }
-
-    private void Encoding_SolutionCreatorChanged(object sender, EventArgs e) {
-      var encoding = (IEncoding)sender;
-      var parameter = GetParameter(encoding);
-
-      var oldCreator = parameter.ValidValues.Single(creator => creator.GetType() == encoding.SolutionCreator.GetType());
-      parameter.ValidValues.Remove(oldCreator);
-      parameter.ValidValues.Add(encoding.SolutionCreator);
-      parameter.Value = encoding.SolutionCreator;
-    }
-
 
     public override IOperation InstrumentedApply() {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 17613)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 17614)
@@ -37,4 +37,5 @@
     where TEvaluator : class, IEvaluator {
 
+    [Storable] protected ConstrainedValueParameter<ISolutionCreator> SolutionCreatorParameter { get; private set; }
 
     //TODO remove parameter for encoding?
@@ -52,17 +53,13 @@
     }
 
-
-    ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator {
-      get { return Encoding.SolutionCreator; }
-    }
-    IParameter IHeuristicOptimizationProblem.SolutionCreatorParameter {
-      get { return Encoding.SolutionCreatorParameter; }
-    }
+    ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator { get => SolutionCreatorParameter.Value; }
+    IParameter IHeuristicOptimizationProblem.SolutionCreatorParameter { get => SolutionCreatorParameter; }
+
     event EventHandler IHeuristicOptimizationProblem.SolutionCreatorChanged {
       add {
-        if (Encoding != null) Encoding.SolutionCreatorChanged += value;
+        SolutionCreatorParameter.ValueChanged += value;
       }
       remove {
-        if (Encoding != null) Encoding.SolutionCreatorChanged -= value;
+        SolutionCreatorParameter.ValueChanged -= value;
       }
     }
@@ -106,4 +103,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.", encoding) { Hidden = true });
       Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution.") { Hidden = true });
+      Parameters.Add(SolutionCreatorParameter = new ConstrainedValueParameter<ISolutionCreator>("SolutionCreator", "The operator used to create a solution."));
 
       oldEncoding = Encoding;
@@ -116,4 +114,5 @@
       : base(original, cloner) {
       oldEncoding = cloner.Clone(original.oldEncoding);
+      SolutionCreatorParameter = cloner.Clone(original.SolutionCreatorParameter);
       RegisterEvents();
     }
@@ -124,4 +123,7 @@
     private void AfterDeserialization() {
       oldEncoding = Encoding;
+      // TODO: remove below
+      if (SolutionCreatorParameter == null) Parameters.Add(SolutionCreatorParameter = new ConstrainedValueParameter<ISolutionCreator>("SolutionCreator", "The operator used to create a solution."));
+
       RegisterEvents();
     }
@@ -157,4 +159,6 @@
 
       Encoding.ConfigureOperators(Operators);
+
+      SolutionCreatorParameter.Repopulate(GetOperators());
       //var multiEncoding = Encoding as MultiEncoding;
       //if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
