Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11543)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,6 +30,6 @@
   [Item("Encoding", "Base class for describing different encodings.")]
   [StorableClass]
-  public abstract class Encoding : NamedItem {
-    public override bool CanChangeName {
+  public abstract class Encoding : NamedItem, IEncoding {
+    public override sealed bool CanChangeName {
       get { return false; }
     }
@@ -39,9 +41,12 @@
     protected Encoding(string name) : base(name) { }
 
+    public virtual IEnumerable<IValueParameter> EncodingParameters {
+      get { return Enumerable.Empty<IValueParameter>(); }
+    }
 
-    public event EventHandler ParameterConfigurationChanged;
+    //public event EventHandler ParameterConfigurationChanged;
     protected virtual void OnParameterConfigurationChanged() {
-      var handler = ParameterConfigurationChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
+    //  var handler = ParameterConfigurationChanged;
+    //  if (handler != null) handler(this, EventArgs.Empty);
     }
   }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11543)
@@ -23,7 +23,11 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Text;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -31,41 +35,70 @@
   [Item("RealEncoding", "Describes a real vector encoding.")]
   [StorableClass]
-  public class RealEncoding : Encoding {
+  public sealed class RealEncoding : Encoding {
+
     [Storable]
-    private IntValue length;
-    public IntValue Length {
-      get { return length; }
+    private IFixedValueParameter<IntValue> lengthParameter;
+    public IFixedValueParameter<IntValue> LengthParameter {
+      get { return lengthParameter; }
       set {
-        if (length == value) return;
-        length = value;
-        OnParameterConfigurationChanged();
+        if(value == null) throw new ArgumentNullException("Length parameter must not be null.");
+        if (lengthParameter == value) return;
+        lengthParameter = value;
+        OnLengthParameterChanged();
       }
     }
 
     [Storable]
-    private DoubleMatrix bounds;
-    public DoubleMatrix Bounds {
-      get { return bounds; }
+    private IValueParameter<DoubleMatrix> boundsParameter;
+    public IValueParameter<DoubleMatrix> BoundsParameter {
+      get { return boundsParameter; }
       set {
-        if (bounds == value) return;
-        bounds = value;
-        OnParameterConfigurationChanged();
+        if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
+        if (boundsParameter == value) return;
+        boundsParameter = value;
+        OnBoundsParameterChanged();
       }
     }
 
+    public override IEnumerable<IValueParameter> EncodingParameters {
+      get { return base.EncodingParameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
+    }
+
+    public int Length {
+      get { return LengthParameter.Value.Value; }
+      set { LengthParameter.Value.Value = value; }
+    }
+    public DoubleMatrix Bounds {
+      get { return BoundsParameter.Value; }
+      set { BoundsParameter.Value = value; }
+    }
+
+    public ISolutionCreator SolutionCreator {
+      get {
+        var creator = new UniformRandomRealVectorCreator();
+        creator.RealVectorParameter.ActualName = Name;
+        creator.LengthParameter.ActualName = LengthParameter.Name;
+        creator.BoundsParameter.ActualName = BoundsParameter.Name;
+        return creator;
+      }
+    }
+      
     [StorableConstructor]
-    protected RealEncoding(bool deserializing) : base(deserializing) { }
-    protected RealEncoding(RealEncoding original, Cloner cloner)
+    private RealEncoding(bool deserializing) : base(deserializing) { }
+    private RealEncoding(RealEncoding original, Cloner cloner)
       : base(original, cloner) {
-      length = cloner.Clone(original.length);
-      bounds = cloner.Clone(original.bounds);
+      lengthParameter = cloner.Clone(original.lengthParameter);
+      boundsParameter = cloner.Clone(original.boundsParameter);
     }
     public RealEncoding(string name, int length, double min, double max)
       : base(name) {
       if (min >= max) throw new ArgumentException("min must be less than max", "min");
-      this.length = new IntValue(length);
-      bounds = new DoubleMatrix(1, 2);
+
+      var bounds = new DoubleMatrix(1, 2);
       bounds[0, 0] = min;
       bounds[0, 1] = max;
+
+      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
     }
     public RealEncoding(string name, int length, IList<double> min, IList<double> max)
@@ -74,11 +107,13 @@
       if (min.Count != max.Count) throw new ArgumentException("min must be of the same length as max", "min");
       if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
-      this.length = new IntValue(length);
-      bounds = new DoubleMatrix(min.Count, 2);
+
+      var bounds = new DoubleMatrix(min.Count, 2);
       for (int i = 0; i < min.Count; i++) {
         bounds[i, 0] = min[i];
         bounds[i, 1] = max[i];
       }
-    }
+      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
+    }  
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -86,4 +121,13 @@
     }
 
+    private void OnLengthParameterChanged() {
+       //TODO rewire parameters
+    }
+
+    private void OnBoundsParameterChanged() {
+      //TODO rewire parameters      
+    }
+
+
   }
-}
+}                            
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11543)
@@ -139,4 +139,5 @@
     <Compile Include="Encodings\Individual.cs" />
     <Compile Include="Helper.cs" />
+    <Compile Include="Interfaces\IEncoding.cs" />
     <Compile Include="Interfaces\ISingleObjectiveMoveOperator.cs" />
     <Compile Include="Interfaces\IMultiObjectiveProblemDefinition.cs" />
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11543)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11543)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.Programmable {
+  interface IEncoding : INamedItem {
+
+    //event EventHandler ParameterConfigurationChanged;
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 11543)
@@ -140,8 +140,5 @@
       if (definition == null) return;
 
-      Encoding encoding;
-      try {
-        encoding = definition.Encoding;
-      } catch { return; }
+      Encoding encoding = definition.Encoding;
       EncodingParameter.Value = encoding;
       Maximization = new BoolArray(definition.Maximization);
@@ -220,14 +217,6 @@
       var realEnc = encoding as RealEncoding;
       if (realEnc != null) {
-        var l = new ValueParameter<IntValue>(realEnc.Name + "Length", realEnc.Length);
-        var b = new ValueParameter<DoubleMatrix>(realEnc.Name + "Bounds", realEnc.Bounds);
-        DynamicEncodingParameters.Add(l);
-        DynamicEncodingParameters.Add(b);
-
-        var creator = new UniformRandomRealVectorCreator();
-        creator.RealVectorParameter.ActualName = realEnc.Name;
-        creator.LengthParameter.ActualName = l.Name;
-        creator.BoundsParameter.ActualName = b.Name;
-        return creator;
+        DynamicEncodingParameters.AddRange(realEnc.EncodingParameters);
+        return realEnc.SolutionCreator;
       }
       #endregion
@@ -458,5 +447,5 @@
           .Union(ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IRealVectorStdDevStrategyParameterOperator>())
           .ToList();
-        var problemSize = ((RealEncoding)encoding).Length.Value;
+        var problemSize = ((RealEncoding)encoding).Length;
         var bounds = (DoubleMatrix)((RealEncoding)encoding).Bounds.Clone();
         for (var i = 0; i < bounds.Rows; i++) {
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemDefinition.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemDefinition.cs	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemDefinition.cs	(revision 11543)
@@ -35,4 +35,5 @@
       get { return encoding; }
       protected set {
+        if (value == null) throw new ArgumentNullException("The encoding must not be null.");
         if (encoding == value) return;
         encoding = value;
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11485)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11543)
@@ -143,8 +143,6 @@
       if (definition == null) return;
 
-      Encoding encoding;
-      try {
-        encoding = definition.Encoding;
-      } catch { return; }
+      Encoding encoding = definition.Encoding;
+
       EncodingParameter.Value = encoding;
       Maximization.Value = definition.IsMaximizationProblem;
@@ -225,14 +223,6 @@
       var realEnc = encoding as RealEncoding;
       if (realEnc != null) {
-        var l = new ValueParameter<IntValue>(realEnc.Name + "Length", realEnc.Length);
-        var b = new ValueParameter<DoubleMatrix>(realEnc.Name + "Bounds", realEnc.Bounds);
-        DynamicEncodingParameters.Add(l);
-        DynamicEncodingParameters.Add(b);
-
-        var creator = new UniformRandomRealVectorCreator();
-        creator.RealVectorParameter.ActualName = realEnc.Name;
-        creator.LengthParameter.ActualName = l.Name;
-        creator.BoundsParameter.ActualName = b.Name;
-        return creator;
+        DynamicEncodingParameters.AddRange(realEnc.EncodingParameters);        
+        return realEnc.SolutionCreator;
       }
       #endregion
@@ -463,5 +453,5 @@
           .Union(ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IRealVectorStdDevStrategyParameterOperator>())
           .ToList();
-        var problemSize = ((RealEncoding)encoding).Length.Value;
+        var problemSize = ((RealEncoding)encoding).Length;
         var bounds = (DoubleMatrix)((RealEncoding)encoding).Bounds.Clone();
         for (var i = 0; i < bounds.Rows; i++) {
