Index: /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 17614)
@@ -381,35 +381,9 @@
     }
     private void UpdateCrossovers() {
-      ICrossover oldCrossover = CrossoverParameter.Value;
-      CrossoverParameter.ValidValues.Clear();
-      ICrossover defaultCrossover = Problem.Operators.OfType<ICrossover>().FirstOrDefault();
-
-      foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name))
-        CrossoverParameter.ValidValues.Add(crossover);
-
-      if (oldCrossover != null) {
-        ICrossover crossover = CrossoverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldCrossover.GetType());
-        if (crossover != null) CrossoverParameter.Value = crossover;
-        else oldCrossover = null;
-      }
-      if (oldCrossover == null && defaultCrossover != null)
-        CrossoverParameter.Value = defaultCrossover;
-    }
+      CrossoverParameter.Repopulate(Problem.Operators);
+    }
+
     private void UpdateMutators() {
-      IManipulator oldMutator = MutatorParameter.Value;
-      MutatorParameter.ValidValues.Clear();
-      IManipulator defaultMutator = Problem.Operators.OfType<IManipulator>().FirstOrDefault();
-
-      foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name))
-        MutatorParameter.ValidValues.Add(mutator);
-
-      if (oldMutator != null) {
-        IManipulator mutator = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType());
-        if (mutator != null) MutatorParameter.Value = mutator;
-        else oldMutator = null;
-      }
-
-      if (oldMutator == null && defaultMutator != null)
-        MutatorParameter.Value = defaultMutator;
+      MutatorParameter.Repopulate(Problem.Operators);
     }
     private void UpdateAnalyzers() {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Core/3.3/Interfaces/IConstrainedValueParameter.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Core/3.3/Interfaces/IConstrainedValueParameter.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Core/3.3/Interfaces/IConstrainedValueParameter.cs	(revision 17614)
@@ -29,4 +29,5 @@
 
     void Populate(IEnumerable<IItem> items);
+    void Repopulate(IEnumerable<IItem> items);
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs	(revision 17614)
@@ -46,7 +46,5 @@
     public BinaryVectorEncoding(int length) : this("BinaryVector", length) { }
     public BinaryVectorEncoding(string name, int length)
-      : base(name, length) {      
-      SolutionCreator = new RandomBinaryVectorCreator();
-
+      : base(name, length) {
       DiscoverOperators();
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs	(revision 17614)
@@ -78,5 +78,4 @@
       Parameters.Add(BoundsParameter);
 
-      SolutionCreator = new UniformRandomIntegerVectorCreator();
       DiscoverOperators();
       RegisterEventHandlers();
@@ -99,5 +98,4 @@
       Parameters.Add(BoundsParameter);
 
-      SolutionCreator = new UniformRandomIntegerVectorCreator();
       DiscoverOperators();
       RegisterEventHandlers();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageEncoding.cs	(revision 17614)
@@ -49,5 +49,4 @@
     public LinearLinkageEncoding(string name, int length)
       : base(name, length) {
-      SolutionCreator = new RandomLinearLinkageCreator();
       DiscoverOperators();
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs	(revision 17614)
@@ -70,5 +70,4 @@
       Parameters.Add(PermutationTypeParameter);
 
-      SolutionCreator = new RandomPermutationCreator();
       DiscoverOperators();
       RegisterParameterEvents();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 17614)
@@ -75,5 +75,4 @@
       Parameters.Add(BoundsParameter);
 
-      SolutionCreator = new UniformRandomRealVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
@@ -94,5 +93,4 @@
       Parameters.Add(BoundsParameter);
 
-      SolutionCreator = new UniformRandomRealVectorCreator();
       DiscoverOperators();
       RegisterParameterEvents();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMRandomCreator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMRandomCreator.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMRandomCreator.cs	(revision 17614)
@@ -20,4 +20,5 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -25,10 +26,9 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Encodings.ScheduleEncoding {
   [Item("JobSequenceMatrixCreator", "Creator class used to create Job Sequence Matrix solutions for standard JobShop scheduling problems.")]
   [StorableType("F8053C69-31C2-4E05-8FA0-5AED15FAF804")]
-  public class JSMRandomCreator : ScheduleCreator<JSM>, IStochasticOperator {
+  public class JSMRandomCreator : ScheduleCreator<JSM>, IJSMOperator, IStochasticOperator {
 
     public ILookupParameter<IRandom> RandomParameter {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JobSequenceMatrixEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JobSequenceMatrixEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JobSequenceMatrixEncoding.cs	(revision 17614)
@@ -43,5 +43,4 @@
     public JobSequenceMatrixEncoding()
       : base("JSM") {
-      SolutionCreator = new JSMRandomCreator();
       Decoder = new JSMDecoder();
       DiscoverOperators();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWRRandomCreator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWRRandomCreator.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWRRandomCreator.cs	(revision 17614)
@@ -20,14 +20,14 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Encodings.ScheduleEncoding {
   [Item("PermutationWithRepetitionRandomCreator", "Creates PWR-individuals at random.")]
   [StorableType("6E753916-C0FD-4585-B6A6-47FD66ED098F")]
-  public class PWRRandomCreator : ScheduleCreator<PWR>, IStochasticOperator {
+  public class PWRRandomCreator : ScheduleCreator<PWR>, IPWROperator, IStochasticOperator {
 
     public ILookupParameter<IRandom> RandomParameter {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PermutationWithRepetitionEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PermutationWithRepetitionEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PermutationWithRepetitionEncoding.cs	(revision 17614)
@@ -42,5 +42,4 @@
     public PermutationWithRepetitionEncoding()
       : base("PWR") {
-      SolutionCreator = new PWRRandomCreator();
       Decoder = new PWRDecoder();
       DiscoverOperators();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVRandomCreator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVRandomCreator.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVRandomCreator.cs	(revision 17614)
@@ -20,14 +20,14 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Encodings.ScheduleEncoding {
   [Item("PriorityRulesRandomCreator", "Creator class used to create PRV encoding objects for scheduling problems.")]
   [StorableType("5FF2A11E-86F9-4A8B-8E1C-713D6801506C")]
-  public class PRVRandomCreator : ScheduleCreator<PRV>, IStochasticOperator {
+  public class PRVRandomCreator : ScheduleCreator<PRV>, IPRVOperator, IStochasticOperator {
 
     [Storable]
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PriorityRulesVectorEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PriorityRulesVectorEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PriorityRulesVectorEncoding.cs	(revision 17614)
@@ -65,5 +65,4 @@
       Parameters.Add(numberOfRulesParameter);
 
-      SolutionCreator = new PRVRandomCreator();
       Decoder = new PRVDecoder();
       DiscoverOperators();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding.cs	(revision 17614)
@@ -161,5 +161,4 @@
     }
 
-
     public override void ConfigureOperators(IEnumerable<IItem> operators) {
       base.ConfigureOperators(operators);
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/DirectScheduleEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/DirectScheduleEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/DirectScheduleEncoding.cs	(revision 17614)
@@ -43,5 +43,4 @@
     public DirectScheduleEncoding()
       : base("Schedule") {
-      SolutionCreator = new DirectScheduleRandomCreator();
       Decoder = new DirectScheduleDecoder();
       DiscoverOperators();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeEncoding.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeEncoding.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeEncoding.cs	(revision 17614)
@@ -177,5 +177,4 @@
       Parameters.Add(functionArgumentsParameter);
 
-      SolutionCreator = new ProbabilisticTreeCreator();
       RegisterParameterEvents();
       DiscoverOperators();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs	(revision 17614)
@@ -27,9 +27,29 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   [StorableType("f4819c68-b6fc-469f-bcb5-cb5b2a9d8aff")]
   public abstract class SymbolicExpressionTreeMultiObjectiveProblem : MultiObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> {
+    [Storable] private ReferenceParameter<IntValue> TreeLengthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntValue> TreeDepthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<ISymbolicExpressionGrammar> GrammarRefParameter { get; set; }
+
+    public int TreeLength {
+      get => TreeLengthRefParameter.Value.Value;
+      set => TreeLengthRefParameter.Value.Value = value;
+    }
+
+    public int TreeDepth {
+      get => TreeDepthRefParameter.Value.Value;
+      set => TreeDepthRefParameter.Value.Value = value;
+    }
+
+    public ISymbolicExpressionGrammar Grammar {
+      get => GrammarRefParameter.Value;
+      set => GrammarRefParameter.Value = value;
+    }
 
     // persistence
@@ -37,5 +57,7 @@
     protected SymbolicExpressionTreeMultiObjectiveProblem(StorableConstructorFlag _) : base(_) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() { }
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
 
 
@@ -43,4 +65,8 @@
     protected SymbolicExpressionTreeMultiObjectiveProblem(SymbolicExpressionTreeMultiObjectiveProblem original, Cloner cloner)
       : base(original, cloner) {
+      TreeLengthRefParameter = cloner.Clone(original.TreeLengthRefParameter);
+      TreeDepthRefParameter = cloner.Clone(original.TreeDepthRefParameter);
+      GrammarRefParameter = cloner.Clone(original.GrammarRefParameter);
+      RegisterEventHandlers();
     }
 
@@ -48,4 +74,10 @@
       : base(encoding) {
       EncodingParameter.ReadOnly = true;
+      Parameters.Add(TreeLengthRefParameter = new ReferenceParameter<IntValue>("TreeLength", "The maximum amount of nodes.", Encoding.TreeLengthParameter));
+      Parameters.Add(TreeDepthRefParameter = new ReferenceParameter<IntValue>("TreeDepth", "The maximum depth of the tree.", Encoding.TreeDepthParameter));
+      Parameters.Add(GrammarRefParameter = new ReferenceParameter<ISymbolicExpressionGrammar>("Grammar", "The grammar that describes a valid tree.", Encoding.GrammarParameter));
+
+      Parameterize();
+      RegisterEventHandlers();
     }
 
@@ -59,9 +91,4 @@
     }
 
-    protected override void OnEncodingChanged() {
-      base.OnEncodingChanged();
-      Parameterize();
-    }
-
     private void Parameterize() {
       foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
@@ -70,4 +97,14 @@
       }
     }
+
+    private void RegisterEventHandlers() {
+      IntValueParameterChangeHandler.Create(TreeLengthRefParameter, TreeLengthOnChanged);
+      IntValueParameterChangeHandler.Create(TreeDepthRefParameter, TreeDepthOnChanged);
+      ParameterChangeHandler<ISymbolicExpressionGrammar>.Create(GrammarRefParameter, GrammarOnChanged);
+    }
+
+    protected virtual void TreeLengthOnChanged() { }
+    protected virtual void TreeDepthOnChanged() { }
+    protected virtual void GrammarOnChanged() { }
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs	(revision 17614)
@@ -29,8 +29,27 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   [StorableType("A1B9F4C8-5E29-493C-A483-2AC68453BC63")]
   public abstract class SymbolicExpressionTreeProblem : SingleObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> {
+    [Storable] private ReferenceParameter<IntValue> TreeLengthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntValue> TreeDepthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<ISymbolicExpressionGrammar> GrammarRefParameter { get; set; }
+
+    public int TreeLength {
+      get => TreeLengthRefParameter.Value.Value;
+      set => TreeLengthRefParameter.Value.Value = value;
+    }
+
+    public int TreeDepth {
+      get => TreeDepthRefParameter.Value.Value;
+      set => TreeDepthRefParameter.Value.Value = value;
+    }
+
+    public ISymbolicExpressionGrammar Grammar {
+      get => GrammarRefParameter.Value;
+      set => GrammarRefParameter.Value = value;
+    }
 
     // persistence
@@ -38,10 +57,15 @@
     protected SymbolicExpressionTreeProblem(StorableConstructorFlag _) : base(_) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() { }
-
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
 
     // cloning
     protected SymbolicExpressionTreeProblem(SymbolicExpressionTreeProblem original, Cloner cloner)
       : base(original, cloner) {
+      TreeLengthRefParameter = cloner.Clone(original.TreeLengthRefParameter);
+      TreeDepthRefParameter = cloner.Clone(original.TreeDepthRefParameter);
+      GrammarRefParameter = cloner.Clone(original.GrammarRefParameter);
+      RegisterEventHandlers();
     }
 
@@ -50,4 +74,10 @@
       : base(encoding) {
       EncodingParameter.ReadOnly = true;
+      Parameters.Add(TreeLengthRefParameter = new ReferenceParameter<IntValue>("TreeLength", "The maximum amount of nodes.", Encoding.TreeLengthParameter));
+      Parameters.Add(TreeDepthRefParameter = new ReferenceParameter<IntValue>("TreeDepth", "The maximum depth of the tree.", Encoding.TreeDepthParameter));
+      Parameters.Add(GrammarRefParameter = new ReferenceParameter<ISymbolicExpressionGrammar>("Grammar", "The grammar that describes a valid tree.", Encoding.GrammarParameter));
+
+      Parameterize();
+      RegisterEventHandlers();
     }
 
@@ -73,9 +103,4 @@
     }
 
-    protected override void OnEncodingChanged() {
-      base.OnEncodingChanged();
-      Parameterize();
-    }
-
     private void Parameterize() {
       foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
@@ -84,4 +109,13 @@
       }
     }
+    private void RegisterEventHandlers() {
+      IntValueParameterChangeHandler.Create(TreeLengthRefParameter, TreeLengthOnChanged);
+      IntValueParameterChangeHandler.Create(TreeDepthRefParameter, TreeDepthOnChanged);
+      ParameterChangeHandler<ISymbolicExpressionGrammar>.Create(GrammarRefParameter, GrammarOnChanged);
+    }
+
+    protected virtual void TreeLengthOnChanged() { }
+    protected virtual void TreeDepthOnChanged() { }
+    protected virtual void GrammarOnChanged() { }
   }
 }
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;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 17614)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using HEAL.Attic;
@@ -57,4 +58,22 @@
     }
 
+    public override void Repopulate(IEnumerable<IItem> items) {
+      var itemsOfT = items.OfType<T>().ToList();
+      T oldItem = Value;
+      ValidValues.Clear();
+      T defaultItem = itemsOfT.FirstOrDefault();
+
+      foreach (T i in itemsOfT.OrderBy(x => x is INamedItem ? ((INamedItem)x).Name : x.ItemName))
+        ValidValues.Add(i);
+
+      if (oldItem != null) {
+        T item = ValidValues.FirstOrDefault(x => x.GetType() == oldItem.GetType());
+        if (item != null) Value = item;
+        else oldItem = null;
+      }
+      if (oldItem == null && defaultItem != null)
+        Value = defaultItem;
+    }
+
     protected override void ValidValues_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
       if (Value == null) Value = ValidValues.First();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17614)
@@ -175,4 +175,18 @@
     }
 
+    public virtual void Repopulate(IEnumerable<IItem> items) {
+      var itemsOfT = items.OfType<T>().ToList();
+      T oldItem = Value;
+      ValidValues.Clear();
+
+      foreach (T i in itemsOfT.OrderBy(x => x is INamedItem ? ((INamedItem)x).Name : x.ItemName))
+        ValidValues.Add(i);
+
+      if (oldItem != null) {
+        T item = ValidValues.FirstOrDefault(x => x.GetType() == oldItem.GetType());
+        if (item != null) Value = item;
+      }
+    }
+
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ParameterChangeHandler.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ParameterChangeHandler.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ParameterChangeHandler.cs	(revision 17614)
@@ -25,5 +25,5 @@
 
 namespace HeuristicLab.Parameters {
-  public abstract class ParameterChangeHandler<TItem> where TItem : class, IItem {
+  public class ParameterChangeHandler<TItem> where TItem : class, IItem {
     protected Action handler;
 
@@ -37,4 +37,8 @@
       handler();
     }
+
+    public static ParameterChangeHandler<TItem> Create(IValueParameter<TItem> parameter, Action handler) {
+      return new ParameterChangeHandler<TItem>(parameter, handler);
+    }
   }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblemInstances.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblemInstances.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblemInstances.cs	(revision 17614)
@@ -41,6 +41,5 @@
   [StorableType("4ea0ded8-4451-4011-b88e-4d0680721b01")]
   public sealed class SingleObjectiveBinaryVectorExternalEvaluationProblem : ExternalEvaluationProblem<BinaryVectorEncoding, BinaryVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
@@ -72,8 +71,6 @@
   [StorableType("46465e8c-11d8-4d02-8c45-de41a08db7fa")]
   public sealed class SingleObjectiveIntegerVectorExternalEvaluationProblem : ExternalEvaluationProblem<IntegerVectorEncoding, IntegerVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
-    [Storable] private ReferenceParameter<IntMatrix> BoundsRefParameter;
-    public IValueParameter<IntMatrix> BoundsParameter => BoundsRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntMatrix> BoundsRefParameter { get; set; }
 
     public int Dimension {
@@ -112,8 +109,6 @@
   [StorableType("637f091f-6601-494e-bafb-2a8ea474210c")]
   public sealed class SingleObjectiveRealVectorExternalEvaluationProblem : ExternalEvaluationProblem<RealVectorEncoding, RealVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
-    [Storable] private ReferenceParameter<DoubleMatrix> BoundsRefParameter;
-    public IValueParameter<DoubleMatrix> BoundsParameter => BoundsRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
+    [Storable] private ReferenceParameter<DoubleMatrix> BoundsRefParameter { get; set; }
 
     public int Dimension {
@@ -152,6 +147,5 @@
   [StorableType("ad9d45f8-b97e-49a7-b3d2-487d9a2cbdf9")]
   public sealed class SingleObjectivePermutationExternalEvaluationProblem : ExternalEvaluationProblem<PermutationEncoding, Permutation> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
@@ -183,18 +177,37 @@
   [StorableType("9b3ee4a8-7076-4edd-ae7e-4188bc49aaa3")]
   public sealed class SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem : ExternalEvaluationProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> {
+    [Storable] private ReferenceParameter<IntValue> TreeLengthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntValue> TreeDepthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<ISymbolicExpressionGrammar> GrammarRefParameter { get; set; }
+
+    public int TreeLength {
+      get => TreeLengthRefParameter.Value.Value;
+      set => TreeLengthRefParameter.Value.Value = value;
+    }
+
+    public int TreeDepth {
+      get => TreeDepthRefParameter.Value.Value;
+      set => TreeDepthRefParameter.Value.Value = value;
+    }
+
+    public ISymbolicExpressionGrammar Grammar {
+      get => GrammarRefParameter.Value;
+      set => GrammarRefParameter.Value = value;
+    }
 
     [StorableConstructor]
     private SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem(StorableConstructorFlag _) : base(_) { }
-    private SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem(SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem original, Cloner cloner) : base(original, cloner) { }
+    private SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem(SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      TreeLengthRefParameter = cloner.Clone(original.TreeLengthRefParameter);
+      TreeDepthRefParameter = cloner.Clone(original.TreeDepthRefParameter);
+      GrammarRefParameter = cloner.Clone(original.GrammarRefParameter);
+    }
 
     public SingleObjectiveSymbolicExpressionTreeExternalEvaluationProblem()
       : base(new SymbolicExpressionTreeEncoding()) {
-      // TODO: Change to ReferenceParameter
-      var lengthParameter = new FixedValueParameter<IntValue>("TreeLength", "The total amount of nodes.", new IntValue(50));
-      Parameters.Add(lengthParameter);
-      Encoding.TreeLengthParameter = lengthParameter;
-      var depthParameter = new FixedValueParameter<IntValue>("TreeDepth", "The depth of the tree.", new IntValue(10));
-      Parameters.Add(depthParameter);
-      Encoding.TreeDepthParameter = depthParameter;
+      Parameters.Add(TreeLengthRefParameter = new ReferenceParameter<IntValue>("TreeLength", "The maximum amount of nodes.", Encoding.TreeLengthParameter));
+      Parameters.Add(TreeDepthRefParameter = new ReferenceParameter<IntValue>("TreeDepth", "The maximum depth of the tree.", Encoding.TreeDepthParameter));
+      Parameters.Add(GrammarRefParameter = new ReferenceParameter<ISymbolicExpressionGrammar>("Grammar", "The grammar that describes a valid tree.", Encoding.GrammarParameter));
       // TODO: Add and parameterize additional operators, 
     }
@@ -210,6 +223,5 @@
   [StorableType("945a35d9-89a8-4423-9ea0-21829ac68887")]
   public sealed class SingleObjectiveLinearLinkageExternalEvaluationProblem : ExternalEvaluationProblem<LinearLinkageEncoding, LinearLinkage> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
@@ -258,6 +270,5 @@
   [StorableType("f14c7e88-b74d-4cad-ae55-83daf7b4c288")]
   public sealed class MultiObjectiveBinaryVectorExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<BinaryVectorEncoding, BinaryVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
@@ -289,8 +300,6 @@
   [StorableType("90a82c2f-6c37-4ffd-8495-bee278c583d3")]
   public sealed class MultiObjectiveIntegerVectorExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<IntegerVectorEncoding, IntegerVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
-    [Storable] private ReferenceParameter<IntMatrix> BoundsRefParameter;
-    public IValueParameter<IntMatrix> BoundsParameter => BoundsRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntMatrix> BoundsRefParameter { get; set; }
 
     public int Dimension {
@@ -329,8 +338,6 @@
   [StorableType("38e1d068-d569-48c5-bad6-cbdd685b7c6b")]
   public sealed class MultiObjectiveRealVectorExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<RealVectorEncoding, RealVector> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
-    [Storable] private ReferenceParameter<DoubleMatrix> BoundsRefParameter;
-    public IValueParameter<DoubleMatrix> BoundsParameter => BoundsRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
+    [Storable] private ReferenceParameter<DoubleMatrix> BoundsRefParameter { get; set; }
 
     public int Dimension {
@@ -369,6 +376,5 @@
   [StorableType("f1b265b0-ac7c-4c36-b346-5b3f2c37694b")]
   public sealed class MultiObjectivePermutationExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<PermutationEncoding, Permutation> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
@@ -400,18 +406,37 @@
   [StorableType("fb6834e2-2d56-4711-a3f8-5e0ab55cd040")]
   public sealed class MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> {
+    [Storable] private ReferenceParameter<IntValue> TreeLengthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<IntValue> TreeDepthRefParameter { get; set; }
+    [Storable] private ReferenceParameter<ISymbolicExpressionGrammar> GrammarRefParameter { get; set; }
+
+    public int TreeLength {
+      get => TreeLengthRefParameter.Value.Value;
+      set => TreeLengthRefParameter.Value.Value = value;
+    }
+
+    public int TreeDepth {
+      get => TreeDepthRefParameter.Value.Value;
+      set => TreeDepthRefParameter.Value.Value = value;
+    }
+
+    public ISymbolicExpressionGrammar Grammar {
+      get => GrammarRefParameter.Value;
+      set => GrammarRefParameter.Value = value;
+    }
 
     [StorableConstructor]
     private MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem(StorableConstructorFlag _) : base(_) { }
-    private MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem(MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem original, Cloner cloner) : base(original, cloner) { }
+    private MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem(MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      TreeLengthRefParameter = cloner.Clone(original.TreeLengthRefParameter);
+      TreeDepthRefParameter = cloner.Clone(original.TreeDepthRefParameter);
+      GrammarRefParameter = cloner.Clone(original.GrammarRefParameter);
+    }
 
     public MultiObjectiveSymbolicExpressionTreeExternalEvaluationProblem()
       : base(new SymbolicExpressionTreeEncoding()) {
-      // TODO: Change to ReferenceParameter
-      var lengthParameter = new FixedValueParameter<IntValue>("TreeLength", "The total amount of nodes.", new IntValue(50));
-      Parameters.Add(lengthParameter);
-      Encoding.TreeLengthParameter = lengthParameter;
-      var depthParameter = new FixedValueParameter<IntValue>("TreeDepth", "The depth of the tree.", new IntValue(10));
-      Parameters.Add(depthParameter);
-      Encoding.TreeDepthParameter = depthParameter;
+      Parameters.Add(TreeLengthRefParameter = new ReferenceParameter<IntValue>("TreeLength", "The maximum amount of nodes.", Encoding.TreeLengthParameter));
+      Parameters.Add(TreeDepthRefParameter = new ReferenceParameter<IntValue>("TreeDepth", "The maximum depth of the tree.", Encoding.TreeDepthParameter));
+      Parameters.Add(GrammarRefParameter = new ReferenceParameter<ISymbolicExpressionGrammar>("Grammar", "The grammar that describes a valid tree.", Encoding.GrammarParameter));
       // TODO: Add and parameterize additional operators, 
     }
@@ -427,6 +452,5 @@
   [StorableType("ed0c1129-651d-465f-87b0-f412f3e3b3d1")]
   public sealed class MultiObjectiveLinearLinkageExternalEvaluationProblem : MultiObjectiveExternalEvaluationProblem<LinearLinkageEncoding, LinearLinkage> {
-    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter;
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
+    [Storable] private ReferenceParameter<IntValue> DimensionRefParameter { get; set; }
 
     public int Dimension {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17614)
@@ -165,7 +165,10 @@
 
     private void InitializeOperators() {
-      Encoding.SolutionCreator = new GreedyOrienteeringTourCreator() {
+      ISolutionCreator creator;
+      SolutionCreatorParameter.ValidValues.Add(creator = new GreedyOrienteeringTourCreator() {
         OrienteeringProblemDataParameter = { ActualName = OrienteeringProblemDataParameter.Name }
-      };
+      });
+      SolutionCreatorParameter.Value = creator;
+
       Operators.Add(new OrienteeringLocalImprovementOperator() {
         OrienteeringProblemDataParameter = { ActualName = OrienteeringProblemDataParameter.Name }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 17613)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 17614)
@@ -186,5 +186,5 @@
         foreach (var c in calcs) {
           // TODO: unified encoding parameters
-          c.SolutionVariableName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
+          c.SolutionVariableName = Encoding.Name;
           c.QualityVariableName = Evaluator.QualityParameter.ActualName;
           op.SimilarityCalculatorParameter.ValidValues.Add(c);
@@ -200,5 +200,5 @@
       foreach (var op in Operators.OfType<IRealVectorParticleCreator>()) {
         // TODO: unified encoding parameters
-        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
+        op.RealVectorParameter.ActualName = Encoding.Name;
         op.RealVectorParameter.Hidden = true;
         op.BoundsParameter.ActualName = BoundsRefParameter.Name;
@@ -207,5 +207,5 @@
       foreach (var op in Operators.OfType<IRealVectorParticleUpdater>()) {
         // TODO: unified encoding parameters
-        op.RealVectorParameter.ActualName = ((IRealVectorSolutionOperator)Encoding.SolutionCreator).RealVectorParameter.ActualName;
+        op.RealVectorParameter.ActualName = Encoding.Name;
         op.RealVectorParameter.Hidden = true;
         op.BoundsParameter.ActualName = BoundsRefParameter.Name;
