Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11559)
@@ -35,5 +35,5 @@
   [Item("BinaryEncoding", "Describes a binary vector encoding.")]
   [StorableClass]
-  public sealed class BinaryEncoding : Encoding {
+  public sealed class BinaryEncoding : Encoding<IBinaryVectorCreator> {
     #region Encoding Parameters
     [Storable]
@@ -53,15 +53,4 @@
     #endregion
 
-    private List<IOperator> encodingOperators = new List<IOperator>();
-    [Storable]
-    public override IEnumerable<IOperator> Operators {
-      get { return encodingOperators; }
-      protected set { encodingOperators = new List<IOperator>(value); }
-    }
-
-    public override ISolutionCreator DefaultSolutionCreator {
-      get { return Operators.OfType<RandomBinaryVectorCreator>().First(); }
-    }
-
     public int Length {
       get { return LengthParameter.Value.Value; }
@@ -80,5 +69,4 @@
       : base(original, cloner) {
       lengthParameter = cloner.Clone(original.lengthParameter);
-      encodingOperators = original.Operators.Select(cloner.Clone).ToList();
       RegisterParameterEvents();
     }
@@ -123,5 +111,5 @@
     #endregion
 
-    public void ConfigureOperators(IEnumerable<IOperator> operators) {
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
       ConfigureCreators(operators.OfType<IBinaryVectorCreator>());
       ConfigureCrossovers(operators.OfType<IBinaryVectorCrossover>());
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11559)
@@ -31,5 +31,6 @@
   [Item("Encoding", "Base class for describing different encodings.")]
   [StorableClass]
-  public abstract class Encoding : NamedItem, IEncoding {
+  public abstract class Encoding<T> : NamedItem, IEncoding
+    where T : class,ISolutionCreator {
     public override sealed bool CanChangeName {
       get { return false; }
@@ -40,18 +41,62 @@
     }
 
-    public virtual IEnumerable<IOperator> Operators {
-      get { return Enumerable.Empty<IOperator>(); }
-      protected set { }
+    protected List<IOperator> encodingOperators = new List<IOperator>();
+    [Storable]
+    public IEnumerable<IOperator> Operators {
+      get { return encodingOperators; }
+      protected set { encodingOperators = new List<IOperator>(value); }
     }
 
-    public virtual ISolutionCreator DefaultSolutionCreator {
+
+    ISolutionCreator IEncoding.DefaultSolutionCreator { get { return DefaultSolutionCreator; } }
+    public virtual T DefaultSolutionCreator {
       get { return null; }
+    }
+
+
+    ISolutionCreator IEncoding.SolutionCreator {
+      get { return SolutionCreator; }
+      set {
+        if (!(value is T)) throw new ArgumentException("???");
+        SolutionCreator = (T)value;
+      }
+    }
+    private T solutionCreator;
+    public T SolutionCreator {
+      get {
+        if (solutionCreator == null) return DefaultSolutionCreator;
+        return solutionCreator;
+      }
+      set {
+        if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
+        if (solutionCreator == value) return;
+        solutionCreator = value;
+        OnSolutionCreatorChanged();
+      }
     }
 
     [StorableConstructor]
     protected Encoding(bool deserializing) : base(deserializing) { }
-    protected Encoding(Encoding original, Cloner cloner)
-      : base(original, cloner) { }
+
+    protected Encoding(Encoding<T> original, Cloner cloner)
+      : base(original, cloner) {
+      encodingOperators = original.Operators.Select(cloner.Clone).ToList();
+      solutionCreator = cloner.Clone(original.solutionCreator);
+    }
     protected Encoding(string name) : base(name) { }
+
+
+
+    public void ConfigureOperator(IOperator @operator) {
+      ConfigureOperators(new[] { @operator });
+    }
+    public virtual void ConfigureOperators(IEnumerable<IOperator> operators) {
+
+    }
+
+    protected virtual void OnSolutionCreatorChanged() {
+      ConfigureOperator(SolutionCreator);
+    }
+
 
     public event EventHandler ParameterConfigurationChanged;
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11559)
@@ -26,4 +26,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -31,5 +32,5 @@
   [Item("IntegerEncoding", "Describes an integer vector encoding.")]
   [StorableClass]
-  public class IntegerEncoding : Encoding {
+  public class IntegerEncoding : Encoding<IIntegerVectorCreator> {
     [Storable]
     private IntValue length;
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11559)
@@ -30,7 +30,7 @@
   [Item("MultiEncoding", "Describes a combined encoding consisting of multiple simpler encodings.")]
   [StorableClass]
-  public class MultiEncoding : Encoding {
+  public class MultiEncoding : Encoding<MultiEncodingCreator> {
     [Storable]
-    public KeyedItemCollection<string, Encoding> Encodings { get; protected set; }
+    public KeyedItemCollection<string, IEncoding> Encodings { get; protected set; }
 
     [StorableConstructor]
@@ -42,5 +42,5 @@
     public MultiEncoding()
       : base("MultiEncoding") {
-      Encodings = new NamedItemCollection<Encoding>();
+      Encodings = new NamedItemCollection<IEncoding>();
     }
 
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11559)
@@ -29,5 +29,5 @@
   [Item("PermutationEncoding", "Describes a permutation encoding.")]
   [StorableClass]
-  public class PermutationEncoding : Encoding {
+  public class PermutationEncoding : Encoding<IPermutationCreator> {
     [Storable]
     private IntValue length;
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11553)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11559)
@@ -21,9 +21,6 @@
 
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using System.Runtime.CompilerServices;
-using System.Text;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -38,5 +35,5 @@
   [Item("RealEncoding", "Describes a real vector encoding.")]
   [StorableClass]
-  public sealed class RealEncoding : Encoding {
+  public sealed class RealEncoding : Encoding<IRealVectorCreator> {
     #region Encoding Parameters
     [Storable]
@@ -69,15 +66,4 @@
     #endregion
 
-    private List<IOperator> encodingOperators = new List<IOperator>();
-    [Storable]
-    public override IEnumerable<IOperator> Operators {
-      get { return encodingOperators; }
-      protected set { encodingOperators = new List<IOperator>(value); }
-    }
-
-    public override ISolutionCreator DefaultSolutionCreator {
-      get { return Operators.OfType<UniformRandomRealVectorCreator>().First(); }
-    }
-
     public int Length {
       get { return LengthParameter.Value.Value; }
@@ -88,6 +74,4 @@
       set { BoundsParameter.Value = value; }
     }
-
-
 
     [StorableConstructor]
@@ -104,9 +88,6 @@
       lengthParameter = cloner.Clone(original.lengthParameter);
       boundsParameter = cloner.Clone(original.boundsParameter);
-      encodingOperators = original.Operators.Select(cloner.Clone).ToList();
       RegisterParameterEvents();
     }
-
-
 
     public RealEncoding(string name, int length, double min, double max)
@@ -149,4 +130,5 @@
       ConfigureOperators(Operators);
     }
+
     private void RegisterParameterEvents() {
       RegisterLengthParameterEvents();
@@ -166,21 +148,20 @@
     static RealEncoding() {
       encodingSpecificOperatorTypes = new List<Type>() {
-        typeof (IRealVectorOperator),
-        typeof (IRealVectorCreator),
-        typeof (IRealVectorCrossover),
-        typeof (IRealVectorManipulator),
-        typeof (IRealVectorStdDevStrategyParameterOperator),
-        typeof (IRealVectorSwarmUpdater),
-        typeof (IRealVectorParticleCreator),
-        typeof (IRealVectorParticleUpdater),
-        typeof (IRealVectorMultiNeighborhoodShakingOperator),
-        typeof (IRealVectorBoundsChecker),
-        typeof (IRealVectorMoveOperator),
-        typeof (IRealVectorMoveGenerator)
-      };
+  typeof (IRealVectorOperator),
+  typeof (IRealVectorCreator),
+  typeof (IRealVectorCrossover),
+  typeof (IRealVectorManipulator),
+  typeof (IRealVectorStdDevStrategyParameterOperator),
+  typeof (IRealVectorSwarmUpdater),
+  typeof (IRealVectorParticleCreator),
+  typeof (IRealVectorParticleUpdater),
+  typeof (IRealVectorMultiNeighborhoodShakingOperator),
+  typeof (IRealVectorBoundsChecker),
+  typeof (IRealVectorMoveOperator),
+  typeof (IRealVectorMoveGenerator)
+  };
     }
     private void DiscoverOperators() {
-      var pluginDescription = ApplicationManager.Manager.GetDeclaringPlugin(typeof(IRealVectorOperator));
-      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, pluginDescription, true, false, false);
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false);
       var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
       var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
@@ -188,8 +169,19 @@
       ConfigureOperators(newOperators);
       encodingOperators.AddRange(newOperators);
+
+      foreach (var strategyVectorCreator in Operators.OfType<IRealVectorStdDevStrategyParameterCreator>())
+        strategyVectorCreator.BoundsParameter.ValueChanged += strategyVectorCreator_BoundsParameter_ValueChanged;
     }
     #endregion
 
-    public void ConfigureOperators(IEnumerable<IOperator> operators) {
+
+    private void strategyVectorCreator_BoundsParameter_ValueChanged(object sender, EventArgs e) {
+      var boundsParameter = (IValueLookupParameter<DoubleMatrix>)sender;
+      if (boundsParameter.Value == null) return;
+      foreach (var strategyVectorManipulator in Operators.OfType<IRealVectorStdDevStrategyParameterManipulator>())
+        strategyVectorManipulator.BoundsParameter.Value = (DoubleMatrix)boundsParameter.Value.Clone();
+    }
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
       ConfigureCreators(operators.OfType<IRealVectorCreator>());
       ConfigureCrossovers(operators.OfType<IRealVectorCrossover>());
@@ -201,6 +193,7 @@
       ConfigureShakingOperators(operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>());
       ConfigureBoundsCheckers(operators.OfType<IRealVectorBoundsChecker>());
+      ConfigureMoveGenerators(operators.OfType<IRealVectorMoveGenerator>());
       ConfigureMoveOperators(operators.OfType<IRealVectorMoveOperator>());
-      ConfigureMoveGenerators(operators.OfType<IRealVectorMoveGenerator>());
+      ConfigureAdditiveMoveOperator(operators.OfType<IAdditiveRealVectorMoveOperator>());
     }
 
@@ -236,8 +229,8 @@
     }
     private void ConfigureStdDevStrategyParameterOperators(IEnumerable<IRealVectorStdDevStrategyParameterOperator> strategyOperators) {
-      var bounds = (DoubleMatrix)Bounds.Clone();
-      for (var i = 0; i < bounds.Rows; i++) {
-        bounds[i, 1] = 0.1 * (bounds[i, 1] - bounds[i, 0]);
+      var bounds = new DoubleMatrix(Bounds.Rows, Bounds.Columns);
+      for (var i = 0; i < Bounds.Rows; i++) {
         bounds[i, 0] = 0;
+        bounds[i, 1] = 0.1 * (Bounds[i, 1] - Bounds[i, 0]);
       }
       foreach (var s in strategyOperators) {
@@ -303,4 +296,10 @@
         moveGenerator.BoundsParameter.ActualName = BoundsParameter.Name;
     }
+
+    private void ConfigureAdditiveMoveOperator(IEnumerable<IAdditiveRealVectorMoveOperator> additiveMoveOperators) {
+      foreach (var additiveMoveOperator in additiveMoveOperators) {
+        additiveMoveOperator.AdditiveMoveParameter.ActualName = Name + "_AdditiveMove";
+      }
+    }
     #endregion
   }
