Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 17571)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 17587)
@@ -34,44 +34,14 @@
   [Item("RealVectorEncoding", "Describes a real vector encoding.")]
   [StorableType("155FFE02-931F-457D-AC95-A0389B0BFECD")]
-  public sealed class RealVectorEncoding : Encoding<RealVector> {
-    #region Encoding Parameters
-    [Storable]
-    private IFixedValueParameter<IntValue> lengthParameter;
-    public IFixedValueParameter<IntValue> LengthParameter {
-      get { return lengthParameter; }
-      set {
-        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
-        if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
-        if (lengthParameter == value) return;
-
-        if (lengthParameter != null) Parameters.Remove(lengthParameter);
-        lengthParameter = value;
-        Parameters.Add(lengthParameter);
-        OnLengthParameterChanged();
-      }
-    }
-    [Storable]
-    private IValueParameter<DoubleMatrix> boundsParameter;
-    public IValueParameter<DoubleMatrix> BoundsParameter {
-      get { return boundsParameter; }
+  public sealed class RealVectorEncoding : VectorEncoding<RealVector> {
+    [Storable] public IValueParameter<DoubleMatrix> BoundsParameter { get; private set; }
+
+    public DoubleMatrix Bounds {
+      get { return BoundsParameter.Value; }
       set {
         if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
-        if (boundsParameter == value) return;
-
-        if (boundsParameter != null) Parameters.Remove(boundsParameter);
-        boundsParameter = value;
-        Parameters.Add(boundsParameter);
-        OnBoundsParameterChanged();
-      }
-    }
-    #endregion
-
-    public int Length {
-      get { return LengthParameter.Value.Value; }
-      set { LengthParameter.Value.Value = value; }
-    }
-    public DoubleMatrix Bounds {
-      get { return BoundsParameter.Value; }
-      set { BoundsParameter.Value = value; }
+        if (Bounds == value) return;
+        BoundsParameter.Value = value;
+      }
     }
 
@@ -80,6 +50,6 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      RegisterParameterEvents();
       DiscoverOperators();
+      RegisterParameterEvents();
     }
 
@@ -87,6 +57,5 @@
     private RealVectorEncoding(RealVectorEncoding original, Cloner cloner)
       : base(original, cloner) {
-      lengthParameter = cloner.Clone(original.lengthParameter);
-      boundsParameter = cloner.Clone(original.boundsParameter);
+      BoundsParameter = cloner.Clone(original.BoundsParameter);
       RegisterParameterEvents();
     }
@@ -96,5 +65,5 @@
     public RealVectorEncoding(int length) : this("RealVector", length) { }
     public RealVectorEncoding(string name, int length, double min = -1000, double max = 1000)
-      : base(name) {
+      : base(name, length) {
       if (min >= max) throw new ArgumentException("min must be less than max", "min");
 
@@ -103,8 +72,6 @@
       bounds[0, 1] = max;
 
-      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length)) { ReadOnly = true };
-      boundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds) { ReadOnly = true };
-      Parameters.Add(lengthParameter);
-      Parameters.Add(boundsParameter);
+      BoundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds);
+      Parameters.Add(BoundsParameter);
 
       SolutionCreator = new UniformRandomRealVectorCreator();
@@ -114,5 +81,5 @@
 
     public RealVectorEncoding(string name, int length, IList<double> min, IList<double> max)
-      : base(name) {
+      : base(name, length) {
       if (min.Count == 0) throw new ArgumentException("Bounds must be given for the real parameters.");
       if (min.Count != max.Count) throw new ArgumentException("min must be of the same length as max", "min");
@@ -124,34 +91,17 @@
         bounds[i, 1] = max[i];
       }
-      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
-      boundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds);
-      Parameters.Add(lengthParameter);
-      Parameters.Add(boundsParameter);
+      BoundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds);
+      Parameters.Add(BoundsParameter);
 
       SolutionCreator = new UniformRandomRealVectorCreator();
-      RegisterParameterEvents();
       DiscoverOperators();
-    }
-
-    private void OnLengthParameterChanged() {
-      RegisterLengthParameterEvents();
-      ConfigureOperators(Operators);
-    }
-    private void OnBoundsParameterChanged() {
-      RegisterBoundsParameterEvents();
-      ConfigureOperators(Operators);
+      RegisterParameterEvents();
     }
 
     private void RegisterParameterEvents() {
-      RegisterLengthParameterEvents();
-      RegisterBoundsParameterEvents();
-    }
-    private void RegisterLengthParameterEvents() {
-      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
-      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
-    }
-    private void RegisterBoundsParameterEvents() {
-      BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
-      boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators);
+      DoubleMatrixParameterChangeHandler.Create(BoundsParameter, () => {
+        ConfigureOperators(Operators);
+        OnBoundsChanged();
+      });
     }
 
@@ -316,4 +266,14 @@
     }
     #endregion
+
+    protected override void OnLengthChanged() {
+      ConfigureOperators(Operators);
+      base.OnLengthChanged();
+    }
+
+    public event EventHandler BoundsChanged;
+    private void OnBoundsChanged() {
+      BoundsChanged?.Invoke(this, EventArgs.Empty);
+    }
   }
 }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorMultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorMultiObjectiveProblem.cs	(revision 17571)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorMultiObjectiveProblem.cs	(revision 17587)
@@ -22,5 +22,4 @@
 #endregion
 
-using System;
 using System.Linq;
 using HEAL.Attic;
@@ -36,7 +35,5 @@
   public abstract class RealVectorMultiObjectiveProblem : MultiObjectiveProblem<RealVectorEncoding, RealVector> {
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
     [Storable] protected ReferenceParameter<DoubleMatrix> BoundsRefParameter { get; private set; }
-    public IValueParameter<DoubleMatrix> BoundsParameter => BoundsRefParameter;
 
     public int Dimension {
@@ -47,5 +44,5 @@
     public DoubleMatrix Bounds {
       get { return BoundsRefParameter.Value; }
-      set { BoundsParameter.Value = value; }
+      set { BoundsRefParameter.Value = value; }
     }
 
@@ -99,14 +96,6 @@
 
     private void RegisterEventHandlers() {
-      DimensionRefParameter.Value.ValueChanged += DimensionParameter_Value_ValueChanged;
-      BoundsRefParameter.ValueChanged += BoundsParameter_ValueChanged;
-    }
-
-    private void DimensionParameter_Value_ValueChanged(object sender, EventArgs e) {
-      DimensionOnChanged();
-    }
-
-    private void BoundsParameter_ValueChanged(object sender, EventArgs e) {
-      BoundsOnChanged();
+      IntValueParameterChangeHandler.Create(DimensionRefParameter, DimensionOnChanged);
+      DoubleMatrixParameterChangeHandler.Create(BoundsRefParameter, BoundsOnChanged);
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorProblem.cs	(revision 17571)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorProblem.cs	(revision 17587)
@@ -22,5 +22,4 @@
 #endregion
 
-using System;
 using System.Linq;
 using HEAL.Attic;
@@ -37,7 +36,5 @@
   public abstract class RealVectorProblem : SingleObjectiveProblem<RealVectorEncoding, RealVector> {
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
-    public IValueParameter<IntValue> DimensionParameter => DimensionRefParameter;
     [Storable] protected ReferenceParameter<DoubleMatrix> BoundsRefParameter { get; private set; }
-    public IValueParameter<DoubleMatrix> BoundsParameter => BoundsRefParameter;
 
     public int Dimension {
@@ -48,5 +45,5 @@
     public DoubleMatrix Bounds {
       get { return BoundsRefParameter.Value; }
-      set { BoundsParameter.Value = value; }
+      set { BoundsRefParameter.Value = value; }
     }
 
@@ -99,14 +96,6 @@
 
     private void RegisterEventHandlers() {
-      DimensionRefParameter.Value.ValueChanged += DimensionParameter_Value_ValueChanged;
-      BoundsRefParameter.ValueChanged += BoundsParameter_ValueChanged;
-    }
-
-    private void DimensionParameter_Value_ValueChanged(object sender, EventArgs e) {
-      DimensionOnChanged();
-    }
-
-    private void BoundsParameter_ValueChanged(object sender, EventArgs e) {
-      BoundsOnChanged();
+      IntValueParameterChangeHandler.Create(DimensionRefParameter, DimensionOnChanged);
+      DoubleMatrixParameterChangeHandler.Create(BoundsRefParameter, BoundsOnChanged);
     }
 
