Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11588)
@@ -36,5 +36,4 @@
   public sealed class BinaryEncoding : Encoding<IBinaryVectorCreator> {
     #region Encoding Parameters
-    [Storable]
     private IFixedValueParameter<IntValue> lengthParameter;
     public IFixedValueParameter<IntValue> LengthParameter {
@@ -42,11 +41,12 @@
       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();
       }
-    }
-    public override IEnumerable<IValueParameter> Parameters {
-      get { return new IValueParameter[] { LengthParameter }; }
     }
     #endregion
@@ -72,5 +72,5 @@
     public BinaryEncoding(string name, int length)
       : base(name) {
-      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
       SolutionCreator = new RandomBinaryVectorCreator();
       RegisterParameterEvents();
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11588)
@@ -31,11 +31,9 @@
   [Item("Encoding", "Base class for describing different encodings.")]
   [StorableClass]
-  public abstract class Encoding<T> : NamedItem, IEncoding
+  public abstract class Encoding<T> : ParameterizedNamedItem, IEncoding
     where T : class,ISolutionCreator {
     public override sealed bool CanChangeName {
       get { return false; }
     }
-
-    public abstract IEnumerable<IValueParameter> Parameters { get; }
 
     protected HashSet<IOperator> encodingOperators = new HashSet<IOperator>(new TypeEqualityComparer<IOperator>());
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11588)
@@ -28,4 +28,5 @@
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
@@ -36,5 +37,4 @@
   public class IntegerEncoding : Encoding<IIntegerVectorCreator> {
     #region Encoding Parameters
-    [Storable]
     private IFixedValueParameter<IntValue> lengthParameter;
     public IFixedValueParameter<IntValue> LengthParameter {
@@ -42,11 +42,14 @@
       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<IntMatrix> boundsParameter;
     public IValueParameter<IntMatrix> BoundsParameter {
@@ -55,11 +58,10 @@
         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();
       }
-    }
-
-    public override IEnumerable<IValueParameter> Parameters {
-      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
     }
     #endregion
@@ -95,9 +97,11 @@
       if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step");
 
-      Length = length;
-      Bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
-      Bounds[0, 0] = min;
-      Bounds[0, 1] = max;
-      if (step.HasValue) Bounds[0, 2] = step.Value;
+      var bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
+      bounds[0, 0] = min;
+      bounds[0, 1] = max;
+      if (step.HasValue) bounds[0, 2] = step.Value;
+
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<IntMatrix>(Name + "Bounds", bounds);
 
       SolutionCreator = new UniformRandomIntegerVectorCreator();
@@ -112,11 +116,13 @@
       if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
 
-      Length = length;
-      Bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
+      var bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
       for (int i = 0; i < min.Count; i++) {
-        Bounds[i, 0] = min[i];
-        Bounds[i, 1] = max[i];
-        if (step != null) Bounds[i, 2] = step[i];
-      }
+        bounds[i, 0] = min[i];
+        bounds[i, 1] = max[i];
+        if (step != null) bounds[i, 2] = step[i];
+      }
+
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<IntMatrix>(Name + "Bounds", bounds);
 
       SolutionCreator = new UniformRandomIntegerVectorCreator();
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11588)
@@ -35,5 +35,4 @@
 
     private readonly List<IEncoding> encodings;
-
     [Storable]
     public IEnumerable<IEncoding> Encodings {
@@ -42,7 +41,4 @@
     }
 
-    public override IEnumerable<IValueParameter> Parameters {
-      get { return Encodings.SelectMany(e => e.Parameters); }
-    }
 
     [StorableConstructor]
@@ -71,4 +67,6 @@
       encodings.Add(encoding);
 
+      Parameters.AddRange(encoding.Parameters);
+
       foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
         @operator.AddEncoding(encoding);
@@ -79,4 +77,5 @@
     public bool Remove(IEncoding encoding) {
       var success = encodings.Remove(encoding);
+      Parameters.RemoveRange(encoding.Parameters);
       foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
         @operator.RemoveEncoding(encoding);
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11588)
@@ -27,4 +27,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
@@ -35,5 +36,4 @@
   public sealed class PermutationEncoding : Encoding<IPermutationCreator> {
     #region encoding parameters
-    [Storable]
     private IFixedValueParameter<IntValue> lengthParameter;
     public IFixedValueParameter<IntValue> LengthParameter {
@@ -41,11 +41,14 @@
       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 IFixedValueParameter<PermutationType> permutationTypeParameter;
     public IFixedValueParameter<PermutationType> PermutationTypeParameter {
@@ -53,12 +56,12 @@
       set {
         if (value == null) throw new ArgumentNullException("Permutation type parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Permutation type parameter value must not be null.");
         if (permutationTypeParameter == value) return;
+
+        if (permutationTypeParameter != null) Parameters.Remove(permutationTypeParameter);
         permutationTypeParameter = value;
+        Parameters.Add(permutationTypeParameter);
         OnPermutationTypeParameterChanged();
       }
-    }
-
-    public override IEnumerable<IValueParameter> Parameters {
-      get { return new IValueParameter[] { LengthParameter, PermutationTypeParameter }; }
     }
     #endregion
@@ -92,6 +95,6 @@
     public PermutationEncoding(string name, int length, PermutationTypes type)
       : base(name) {
-      Length = length;
-      Type = type;
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      PermutationTypeParameter = new FixedValueParameter<PermutationType>(Name + "Type", new PermutationType(type));
 
       SolutionCreator = new RandomPermutationCreator();
@@ -101,10 +104,10 @@
 
     private void OnLengthParameterChanged() {
-      RegisterParameterEvents();
+      RegisterLengthParameterEvents();
       ConfigureOperators(Operators);
     }
 
     private void OnPermutationTypeParameterChanged() {
-      RegisterParameterEvents();
+      RegisterPermutationTypeParameterEvents();
       ConfigureOperators(Operators);
     }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11588)
@@ -37,5 +37,4 @@
   public sealed class RealEncoding : Encoding<IRealVectorCreator> {
     #region Encoding Parameters
-    [Storable]
     private IFixedValueParameter<IntValue> lengthParameter;
     public IFixedValueParameter<IntValue> LengthParameter {
@@ -43,11 +42,14 @@
       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 {
@@ -56,11 +58,10 @@
         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();
       }
-    }
-
-    public override IEnumerable<IValueParameter> Parameters {
-      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
     }
     #endregion
@@ -99,6 +100,6 @@
       bounds[0, 1] = max;
 
-      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
-      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
 
       SolutionCreator = new UniformRandomRealVectorCreator();
@@ -118,6 +119,6 @@
         bounds[i, 1] = max[i];
       }
-      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
-      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
+      LengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
 
       SolutionCreator = new UniformRandomRealVectorCreator();
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11588)
@@ -26,8 +26,7 @@
 
 namespace HeuristicLab.Problems.Programmable {
-  public interface IEncoding : INamedItem {
+  public interface IEncoding : IParameterizedNamedItem {
     ISolutionCreator SolutionCreator { get; set; }
 
-    IEnumerable<IValueParameter> Parameters { get; }
     IEnumerable<IOperator> Operators { get; }
     //event EventHandler ParameterConfigurationChanged;
