Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs	(revision 11587)
@@ -48,5 +48,5 @@
     }
     public override IEnumerable<IValueParameter> Parameters {
-      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter }); }
+      get { return new IValueParameter[] { LengthParameter }; }
     }
     #endregion
@@ -73,7 +73,7 @@
       : base(name) {
       lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
+      SolutionCreator = new RandomBinaryVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<RandomBinaryVectorCreator>().Single();
     }
 
@@ -106,8 +106,9 @@
       var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, pluginDescription, true, false, false);
       var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
-      var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
 
       ConfigureOperators(newOperators);
-      encodingOperators.AddRange(newOperators);
+      foreach (var @operator in newOperators)
+        encodingOperators.Add(@operator);
     }
     #endregion
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs	(revision 11587)
@@ -37,20 +37,17 @@
     }
 
-    public virtual IEnumerable<IValueParameter> Parameters {
-      get { return Enumerable.Empty<IValueParameter>(); }
-    }
+    public abstract IEnumerable<IValueParameter> Parameters { get; }
 
-    protected List<IOperator> encodingOperators = new List<IOperator>();
+    protected HashSet<IOperator> encodingOperators = new HashSet<IOperator>(new TypeEqualityComparer<IOperator>());
     [Storable]
     public IEnumerable<IOperator> Operators {
       get { return encodingOperators; }
-      protected set { encodingOperators = new List<IOperator>(value); }
+      private set { encodingOperators = new HashSet<IOperator>(value, new TypeEqualityComparer<IOperator>()); }
     }
-
 
     ISolutionCreator IEncoding.SolutionCreator {
       get { return SolutionCreator; }
       set {
-        if (!(value is T)) throw new ArgumentException("???");
+        if (!(value is T)) throw new ArgumentException(string.Format("Cannot assign the solution creator {0} to the encoding {1}.", value.GetType().GetPrettyName(), GetType().GetPrettyName()));
         SolutionCreator = (T)value;
       }
@@ -64,4 +61,6 @@
         if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
         if (solutionCreator == value) return;
+        encodingOperators.Remove(solutionCreator);
+        encodingOperators.Add(value);
         solutionCreator = value;
         OnSolutionCreatorChanged();
@@ -74,5 +73,5 @@
     protected Encoding(Encoding<T> original, Cloner cloner)
       : base(original, cloner) {
-      encodingOperators = original.Operators.Select(cloner.Clone).ToList();
+      encodingOperators = new HashSet<IOperator>(original.Operators.Select(cloner.Clone));
       solutionCreator = cloner.Clone(original.solutionCreator);
     }
@@ -80,14 +79,12 @@
 
 
+    public abstract void ConfigureOperators(IEnumerable<IOperator> operators);
+    public void ConfigureOperator(IOperator @operator) { ConfigureOperators(new[] { @operator }); }
 
-    public void ConfigureOperator(IOperator @operator) {
-      ConfigureOperators(new[] { @operator });
-    }
-    public virtual void ConfigureOperators(IEnumerable<IOperator> operators) {
-
-    }
-
+    public event EventHandler SolutionCreatorChanged;
     protected virtual void OnSolutionCreatorChanged() {
       ConfigureOperator(SolutionCreator);
+      var handler = SolutionCreatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs	(revision 11587)
@@ -61,5 +61,5 @@
 
     public override IEnumerable<IValueParameter> Parameters {
-      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
+      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
     }
     #endregion
@@ -94,4 +94,5 @@
       if (min >= max) throw new ArgumentException("min must be less than max", "min");
       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);
@@ -99,7 +100,8 @@
       Bounds[0, 1] = max;
       if (step.HasValue) Bounds[0, 2] = step.Value;
+
+      SolutionCreator = new UniformRandomIntegerVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<UniformRandomIntegerVectorCreator>().Single();
     }
     public IntegerEncoding(string name, int length, IList<int> min, IList<int> max, IList<int> step = null)
@@ -109,4 +111,5 @@
       if (step != null && min.Count != step.Count) throw new ArgumentException("step must be of the same length as min or null", "step");
       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);
@@ -116,7 +119,8 @@
         if (step != null) Bounds[i, 2] = step[i];
       }
+
+      SolutionCreator = new UniformRandomIntegerVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<UniformRandomIntegerVectorCreator>().Single();
     }
 
@@ -159,8 +163,9 @@
       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();
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
 
       ConfigureOperators(newOperators);
-      encodingOperators.AddRange(newOperators);
+      foreach (var @operator in newOperators)
+        encodingOperators.Add(@operator);
     }
     #endregion
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11587)
@@ -22,8 +22,10 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Programmable.Interfaces;
 
 namespace HeuristicLab.Problems.Programmable {
@@ -31,56 +33,58 @@
   [StorableClass]
   public class MultiEncoding : Encoding<MultiEncodingCreator> {
+
+    private readonly List<IEncoding> encodings;
+
     [Storable]
-    public KeyedItemCollection<string, IEncoding> Encodings { get; protected set; }
+    public IEnumerable<IEncoding> Encodings {
+      get { return encodings; }
+      private set { encodings.AddRange(value); }
+    }
+
+    public override IEnumerable<IValueParameter> Parameters {
+      get { return Encodings.SelectMany(e => e.Parameters); }
+    }
 
     [StorableConstructor]
-    protected MultiEncoding(bool deserializing) : base(deserializing) { }
+    protected MultiEncoding(bool deserializing)
+      : base(deserializing) {
+      encodings = new List<IEncoding>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncoding(this, cloner); }
     protected MultiEncoding(MultiEncoding original, Cloner cloner)
       : base(original, cloner) {
-      Encodings = cloner.Clone(original.Encodings);
+      encodings = new List<IEncoding>(original.Encodings.Select(cloner.Clone));
     }
     public MultiEncoding()
       : base("MultiEncoding") {
-      Encodings = new NamedItemCollection<IEncoding>();
+      encodings = new List<IEncoding>();
+      SolutionCreator = new MultiEncodingCreator();
+
+      foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>())
+        encodingOperators.Add(@operator);
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new MultiEncoding(this, cloner);
-    }
+    public MultiEncoding Add(IEncoding encoding) {
+      if (encoding is MultiEncoding) throw new InvalidOperationException("Nesting of MultiEncodings is not supported.");
+      if (Encodings.Any(e => e.Name == encoding.Name)) throw new ArgumentException("Encoding name must be unique", "encoding.Name");
+      encodings.Add(encoding);
 
-    public MultiEncoding AddBinaryVector(string variableName, int length) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new BinaryEncoding(variableName, length));
+      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
+        @operator.AddEncoding(encoding);
+      }
       return this;
     }
 
-    public MultiEncoding AddIntegerVector(string variableName, int length, int min, int max, int? step = null) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new IntegerEncoding(variableName, length, min, max, step));
-      return this;
+    public bool Remove(IEncoding encoding) {
+      var success = encodings.Remove(encoding);
+      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
+        @operator.RemoveEncoding(encoding);
+      }
+      return success;
     }
 
-    public MultiEncoding AddIntegerVector(string variableName, int length, IList<int> min, IList<int> max, IList<int> step = null) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new IntegerEncoding(variableName, length, min, max, step));
-      return this;
-    }
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
 
-    public MultiEncoding AddRealVector(string variableName, int length, double min, double max) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new RealEncoding(variableName, length, min, max));
-      return this;
-    }
-
-    public MultiEncoding AddRealVector(string variableName, int length, IList<double> min, IList<double> max) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new RealEncoding(variableName, length, min, max));
-      return this;
-    }
-
-    public MultiEncoding AddPermutation(string variableName, int length, PermutationTypes type) {
-      if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
-      Encodings.Add(new PermutationEncoding(variableName, length, type));
-      return this;
     }
   }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11587)
@@ -60,5 +60,5 @@
 
     public override IEnumerable<IValueParameter> Parameters {
-      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, PermutationTypeParameter }); }
+      get { return new IValueParameter[] { LengthParameter, PermutationTypeParameter }; }
     }
     #endregion
@@ -89,11 +89,13 @@
       RegisterParameterEvents();
     }
+
     public PermutationEncoding(string name, int length, PermutationTypes type)
       : base(name) {
       Length = length;
       Type = type;
+
+      SolutionCreator = new RandomPermutationCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<RandomPermutationCreator>().Single();
     }
 
@@ -138,13 +140,13 @@
       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();
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
 
       ConfigureOperators(newOperators);
-      encodingOperators.AddRange(newOperators);
+      foreach (var @operator in newOperators)
+        encodingOperators.Add(@operator);
     }
     #endregion
 
     public override void ConfigureOperators(IEnumerable<IOperator> operators) {
-      base.ConfigureOperators(operators);
       ConfigureCreators(Operators.OfType<IPermutationCreator>());
       ConfigureCrossovers(Operators.OfType<IPermutationCrossover>());
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs	(revision 11587)
@@ -62,5 +62,5 @@
 
     public override IEnumerable<IValueParameter> Parameters {
-      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
+      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
     }
     #endregion
@@ -101,7 +101,8 @@
       lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
       boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
+
+      SolutionCreator = new UniformRandomRealVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<UniformRandomRealVectorCreator>().Single();
     }
 
@@ -119,7 +120,8 @@
       lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
       boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
+
+      SolutionCreator = new UniformRandomRealVectorCreator();
       RegisterParameterEvents();
       DiscoverOperators();
-      SolutionCreator = Operators.OfType<UniformRandomRealVectorCreator>().Single();
     }
 
@@ -167,8 +169,9 @@
       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();
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
 
       ConfigureOperators(newOperators);
-      encodingOperators.AddRange(newOperators);
+      foreach (var @operator in newOperators)
+        encodingOperators.Add(@operator);
 
       foreach (var strategyVectorCreator in Operators.OfType<IRealVectorStdDevStrategyParameterCreator>())
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 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11587)
@@ -136,4 +136,5 @@
     <Compile Include="Helper.cs" />
     <Compile Include="Interfaces\IEncoding.cs" />
+    <Compile Include="Interfaces\IMultiEncodingOperator.cs" />
     <Compile Include="Interfaces\ISingleObjectiveMoveOperator.cs" />
     <Compile Include="Interfaces\IMultiObjectiveProblemDefinition.cs" />
@@ -144,4 +145,5 @@
     <Compile Include="Operators\MultiEncodingManipulator.cs" />
     <Compile Include="Operators\MultiEncodingCrossover.cs" />
+    <Compile Include="Operators\MultiEncodingOperator.cs" />
     <Compile Include="Operators\SingleObjectiveMoveEvaluator.cs" />
     <Compile Include="Operators\SingleObjectiveMoveGenerator.cs" />
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IEncoding.cs	(revision 11587)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Core;
@@ -34,4 +35,7 @@
     void ConfigureOperator(IOperator @operator);
     void ConfigureOperators(IEnumerable<IOperator> operators);
+
+    event EventHandler SolutionCreatorChanged;
+    //event EventHandler OperatorsChanged;
   }
 }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IMultiEncodingOperator.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IMultiEncodingOperator.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/IMultiEncodingOperator.cs	(revision 11587)
@@ -0,0 +1,29 @@
+﻿#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 HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.Programmable.Interfaces {
+  public interface IMultiEncodingOperator : IOperator {
+    void AddEncoding(IEncoding encoding);
+    bool RemoveEncoding(IEncoding encoding);
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 11587)
@@ -27,12 +27,7 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.Programmable {
@@ -86,5 +81,4 @@
       Operators.Add(new MultiObjectiveAnalyzer());
       Operators.Add(Evaluator);
-      Operators.Add(SolutionCreator);
 
       RegisterEventHandlers();
@@ -156,9 +150,12 @@
       }
 
+      SolutionCreator = encoding.SolutionCreator;
+
       foreach (var param in DynamicEncodingParameters)
         if (Parameters.Contains(param)) Parameters.Remove(param);
       DynamicEncodingParameters.Clear();
 
-      var creator = ConfigureCreator(encoding);
+      DynamicEncodingParameters.AddRange(encoding.Parameters);
+
 
       foreach (var param in DynamicEncodingParameters) {
@@ -167,663 +164,5 @@
       }
 
-      var multiEncoding = encoding as MultiEncoding;
-      if (multiEncoding != null) {
-        ConfigureMultiVectorEncodingOperators((MultiEncodingCreator)creator, multiEncoding);
-      } else {
-        ConfigureSingleEncodingOperators(creator, encoding);
-      }
     }
-
-    protected virtual ISolutionCreator ConfigureCreator(IEncoding encoding) {
-      #region Configure MultiEncoding Creator
-      var multiEncoding = encoding as MultiEncoding;
-      if (multiEncoding != null) {
-        var creator = new MultiEncodingCreator();
-        foreach (var enc in multiEncoding.Encodings) {
-          if (enc is MultiEncoding) throw new InvalidOperationException("MultiEncoding within a MultiEncoding is not supported.");
-          creator.Operators.Add(ConfigureCreator(enc));
-        }
-        return creator;
-      }
-      #endregion
-      #region Configure RealVector Creator
-      var realEnc = encoding as RealEncoding;
-      if (realEnc != null) {
-        DynamicEncodingParameters.AddRange(realEnc.Parameters);
-        return realEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure BinaryVector Creator
-      var binEnc = encoding as BinaryEncoding;
-      if (binEnc != null) {
-        DynamicEncodingParameters.AddRange(binEnc.Parameters);
-        return binEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure IntegerVector Creator
-      var intEnc = encoding as IntegerEncoding;
-      if (intEnc != null) {
-        DynamicEncodingParameters.AddRange(intEnc.Parameters);
-        return intEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure Permutation Creator
-      var permEnc = encoding as PermutationEncoding;
-      if (permEnc != null) {
-        DynamicEncodingParameters.AddRange(permEnc.Parameters);
-        return permEnc.SolutionCreator;
-      }
-      #endregion
-
-
-      throw new ArgumentException(string.Format("Encoding {0} is unknown.", encoding != null ? encoding.GetType().FullName : "(null)"));
-    }
-
-    protected virtual void ConfigureSingleEncodingOperators(ISolutionCreator newCreator, IEncoding encoding) {
-      // remove all multiencoding operators
-      Operators.RemoveAll(x => x is MultiEncodingCrossover
-                            || x is MultiEncodingManipulator
-                            || x is MultiEncodingCreator);
-
-      #region Configure Operators for BinaryVectorEncoding
-      var binCreator = newCreator as IBinaryVectorCreator;
-      if (binCreator != null) {
-        var paramName = binCreator.BinaryVectorParameter.ActualName;
-        // do not replace a binary vector creator that was manually set
-        if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != paramName) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-          Operators.Add(SolutionCreator);
-        }
-
-        #region Wire BinaryVector Crossovers
-        var crossovers = Operators.OfType<IBinaryVectorCrossover>()
-          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorCrossover>(), new TypeEqualityComparer<IBinaryVectorCrossover>())
-          .ToList();
-        foreach (var xo in crossovers) {
-          xo.ChildParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
-          xo.ChildParameter.Hidden = true;
-          xo.ParentsParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
-          xo.ParentsParameter.Hidden = true;
-        }
-        Operators.AddRange(crossovers.Except(Operators.OfType<IBinaryVectorCrossover>()));
-        #endregion
-        #region Wire BinaryVector Manipulators
-        var manipulators = Operators.OfType<IBinaryVectorManipulator>()
-          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorManipulator>(), new TypeEqualityComparer<IBinaryVectorManipulator>())
-          .ToList();
-        foreach (var m in manipulators) {
-          m.BinaryVectorParameter.ActualName = binCreator.BinaryVectorParameter.ActualName;
-          m.BinaryVectorParameter.Hidden = true;
-        }
-        Operators.AddRange(manipulators.Except(Operators.OfType<IBinaryVectorManipulator>()));
-        #endregion
-        #region Wire BinaryVector ShakingOperators
-        var shakingOperators = Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IBinaryVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IBinaryVectorMultiNeighborhoodShakingOperator>())
-          .ToList();
-        foreach (var so in shakingOperators) {
-          so.BinaryVectorParameter.ActualName = paramName;
-          so.BinaryVectorParameter.Hidden = true;
-        }
-        Operators.AddRange(shakingOperators.Except(Operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>()));
-        #endregion
-      } else {
-        Operators.RemoveAll(x => x is IBinaryVectorCrossover
-          || x is IBinaryVectorManipulator
-          || x is IBinaryVectorMultiNeighborhoodShakingOperator);
-      }
-      #endregion
-      #region Configure Operators for IntegerVectorEncoding
-      var intCreator = newCreator as IIntegerVectorCreator;
-      if (intCreator != null) {
-        var paramName = intCreator.IntegerVectorParameter.ActualName;
-        // do not replace an integer vector creator that was manually set
-        if (!(SolutionCreator is IIntegerVectorCreator)
-          || ((IIntegerVectorCreator)SolutionCreator).IntegerVectorParameter.ActualName != intCreator.IntegerVectorParameter.ActualName) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-          Operators.Add(SolutionCreator);
-        }
-
-        #region Wire IntegerVector Crossovers
-        var crossovers = Operators.OfType<IIntegerVectorCrossover>()
-          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorCrossover>(), new TypeEqualityComparer<IIntegerVectorCrossover>())
-          .ToList();
-        foreach (var xo in crossovers) {
-          xo.ChildParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
-          xo.ChildParameter.Hidden = true;
-          xo.ParentsParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
-          xo.ParentsParameter.Hidden = true;
-          var bx = xo as IBoundedIntegerVectorOperator;
-          if (bx != null) {
-            bx.BoundsParameter.ActualName = intCreator.BoundsParameter.ActualName;
-            bx.BoundsParameter.Hidden = true;
-          }
-        }
-        Operators.AddRange(crossovers.Except(Operators.OfType<IIntegerVectorCrossover>()));
-        #endregion
-        #region Wire IntegerVector Manipulators
-        var manipulators = Operators.OfType<IIntegerVectorManipulator>()
-          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>(), new TypeEqualityComparer<IIntegerVectorManipulator>())
-          .ToList();
-        foreach (var m in manipulators) {
-          m.IntegerVectorParameter.ActualName = intCreator.IntegerVectorParameter.ActualName;
-          m.IntegerVectorParameter.Hidden = true;
-          var sm = m as ISelfAdaptiveManipulator;
-          if (sm != null) {
-            var p = sm.StrategyParameterParameter as ILookupParameter;
-            if (p != null) {
-              p.ActualName = paramName + "Strategy";
-              p.Hidden = true;
-            }
-          }
-          var bm = m as IBoundedIntegerVectorOperator;
-          if (bm != null) {
-            bm.BoundsParameter.ActualName = intCreator.BoundsParameter.ActualName;
-            bm.BoundsParameter.Hidden = true;
-          }
-        }
-        Operators.AddRange(manipulators.Except(Operators.OfType<IIntegerVectorManipulator>()));
-        #region Wire IntegerVector StrategyParameters for SelfAdaptiveManipulators
-        var strategyOperators = Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IIntegerVectorStdDevStrategyParameterOperator>())
-          .ToList();
-        var problemSize = ((IntegerEncoding)encoding).Length;
-        var b = ((IntegerEncoding)encoding).Bounds;
-        var bounds = new DoubleMatrix(b.Rows, b.Columns);
-        for (var i = 0; i < bounds.Rows; i++) {
-          bounds[i, 1] = (int)Math.Ceiling(0.33 * (b[i, 1] - b[i, 0]));
-          bounds[i, 0] = 0;
-          if (bounds.Columns > 2) bounds[i, 2] = b[i, 2];
-        }
-        foreach (var s in strategyOperators) {
-          var c = s as IIntegerVectorStdDevStrategyParameterCreator;
-          if (c != null) {
-            c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
-            c.LengthParameter.ActualName = intCreator.LengthParameter.ActualName;
-            c.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-          var m = s as IIntegerVectorStdDevStrategyParameterManipulator;
-          if (m != null) {
-            m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
-            m.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-          var mm = s as Encodings.IntegerVectorEncoding.StdDevStrategyVectorManipulator;
-          if (mm != null) {
-            mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * problemSize));
-            mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(problemSize)));
-          }
-          var x = s as IIntegerVectorStdDevStrategyParameterCrossover;
-          if (x != null) {
-            x.ParentsParameter.ActualName = paramName + "Strategy";
-            x.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-        }
-        Operators.AddRange(strategyOperators.Except(Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>()));
-        #endregion
-        #endregion
-        #region Wire IntegerVector ShakingOperators
-        var shakingOperators = Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IIntegerVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IIntegerVectorMultiNeighborhoodShakingOperator>())
-          .ToList();
-        foreach (var so in shakingOperators) {
-          so.IntegerVectorParameter.ActualName = paramName;
-          so.IntegerVectorParameter.Hidden = true;
-        }
-        Operators.AddRange(shakingOperators.Except(Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>()));
-        #endregion
-      } else {
-        Operators.RemoveAll(x => x is IIntegerVectorCrossover
-          || x is IIntegerVectorManipulator
-          || x is IIntegerVectorStdDevStrategyParameterOperator
-          || x is IIntegerVectorMultiNeighborhoodShakingOperator);
-      }
-      #endregion
-      #region Configure Operators for RealVectorEncoding
-      var realCreator = newCreator as IRealVectorCreator;
-      if (realCreator != null) {
-        var paramName = realCreator.RealVectorParameter.ActualName;
-        // do not replace a real vector creator that was manually set
-        if (!(SolutionCreator is IRealVectorCreator)
-            || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realCreator.RealVectorParameter.ActualName) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-          Operators.Add(SolutionCreator);
-        }
-
-        #region Wire RealVector Crossovers
-        var crossovers = Operators.OfType<IRealVectorCrossover>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorCrossover>(), new TypeEqualityComparer<IRealVectorCrossover>())
-          .ToList();
-        foreach (var xo in crossovers) {
-          xo.ChildParameter.ActualName = paramName;
-          xo.ChildParameter.Hidden = true;
-          xo.ParentsParameter.ActualName = paramName;
-          xo.ParentsParameter.Hidden = true;
-          xo.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
-          xo.BoundsParameter.Hidden = true;
-        }
-        Operators.AddRange(crossovers.Except(Operators.OfType<IRealVectorCrossover>()));
-        #endregion
-        #region Wire RealVector Manipulators
-        var manipulators = Operators.OfType<IRealVectorManipulator>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorManipulator>(), new TypeEqualityComparer<IRealVectorManipulator>())
-          .ToList();
-        foreach (var m in manipulators) {
-          m.RealVectorParameter.ActualName = paramName;
-          m.RealVectorParameter.Hidden = true;
-          m.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
-          m.BoundsParameter.Hidden = true;
-          var sm = m as ISelfAdaptiveManipulator;
-          if (sm != null) {
-            var p = sm.StrategyParameterParameter as ILookupParameter;
-            if (p != null) {
-              p.ActualName = paramName + "Strategy";
-              p.Hidden = true;
-            }
-          }
-        }
-        Operators.AddRange(manipulators.Except(Operators.OfType<IRealVectorManipulator>()));
-        #region Wire RealVector Strategy Parameters for SelfAdaptiveManipulators
-        var strategyOperators = Operators.OfType<IRealVectorStdDevStrategyParameterOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorStdDevStrategyParameterOperator>(), new TypeEqualityComparer<IRealVectorStdDevStrategyParameterOperator>())
-          .ToList();
-        var problemSize = ((RealEncoding)encoding).Length;
-        var bounds = (DoubleMatrix)((RealEncoding)encoding).Bounds.Clone();
-        for (var i = 0; i < bounds.Rows; i++) {
-          bounds[i, 1] = 0.1 * (bounds[i, 1] - bounds[i, 0]);
-          bounds[i, 0] = 0;
-        }
-        foreach (var s in strategyOperators) {
-          var c = s as IRealVectorStdDevStrategyParameterCreator;
-          if (c != null) {
-            c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
-            c.LengthParameter.ActualName = realCreator.LengthParameter.ActualName;
-            c.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-          var m = s as IRealVectorStdDevStrategyParameterManipulator;
-          if (m != null) {
-            m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
-            m.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-          var mm = s as Encodings.RealVectorEncoding.StdDevStrategyVectorManipulator;
-          if (mm != null) {
-            mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * problemSize));
-            mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(problemSize)));
-          }
-          var x = s as IRealVectorStdDevStrategyParameterCrossover;
-          if (x != null) {
-            x.ParentsParameter.ActualName = paramName + "Strategy";
-            x.StrategyParameterParameter.ActualName = paramName + "Strategy";
-          }
-        }
-        Operators.AddRange(strategyOperators.Except(Operators.OfType<IRealVectorStdDevStrategyParameterOperator>()));
-        #endregion
-        #endregion
-        #region Wire RealVector ParticleCreators
-        var particleCreators = Operators.OfType<IRealVectorParticleCreator>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleCreator>(), new TypeEqualityComparer<IRealVectorParticleCreator>())
-          .ToList();
-        foreach (var pc in particleCreators) {
-          pc.RealVectorParameter.ActualName = paramName;
-          pc.RealVectorParameter.Hidden = true;
-          pc.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
-          pc.BoundsParameter.Hidden = true;
-          pc.ProblemSizeParameter.ActualName = realCreator.LengthParameter.ActualName;
-          pc.ProblemSizeParameter.Hidden = true;
-        }
-        Operators.AddRange(particleCreators.Except(Operators.OfType<IRealVectorParticleCreator>()));
-        #endregion
-        #region Wire RealVector ParticleUpdaters
-        var particleUpdaters = Operators.OfType<IRealVectorParticleUpdater>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorParticleUpdater>(), new TypeEqualityComparer<IRealVectorParticleUpdater>())
-          .ToList();
-        foreach (var pu in particleUpdaters) {
-          pu.RealVectorParameter.ActualName = paramName;
-          pu.RealVectorParameter.Hidden = true;
-          pu.BoundsParameter.ActualName = realCreator.BoundsParameter.ActualName;
-          pu.BoundsParameter.Hidden = true;
-        }
-        Operators.AddRange(particleUpdaters.Except(Operators.OfType<IRealVectorParticleUpdater>()));
-        #endregion
-        #region Wire RealVector SwarmUpdaters
-        var swarmUpdaters = Operators.OfType<IRealVectorSwarmUpdater>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorSwarmUpdater>(), new TypeEqualityComparer<IRealVectorSwarmUpdater>())
-          .ToList();
-        foreach (var su in swarmUpdaters) {
-          su.RealVectorParameter.ActualName = paramName;
-          su.RealVectorParameter.Hidden = true;
-          su.MaximizationParameter.ActualName = MaximizationParameter.Name;
-          su.MaximizationParameter.Hidden = true;
-        }
-        Operators.AddRange(swarmUpdaters.Except(Operators.OfType<IRealVectorSwarmUpdater>()));
-        #endregion
-        #region Wire RealVector ShakingOperators
-        var shakingOperators = Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IRealVectorMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IRealVectorMultiNeighborhoodShakingOperator>())
-          .ToList();
-        foreach (var so in shakingOperators) {
-          so.RealVectorParameter.ActualName = paramName;
-          so.RealVectorParameter.Hidden = true;
-        }
-        Operators.AddRange(shakingOperators.Except(Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>()));
-        #endregion
-      } else {
-        Operators.RemoveAll(x => x is IRealVectorCrossover
-          || x is IRealVectorManipulator
-          || x is IRealVectorStdDevStrategyParameterOperator
-          || x is IRealVectorParticleCreator
-          || x is IRealVectorParticleUpdater
-          || x is IRealVectorSwarmUpdater
-          || x is IRealVectorMultiNeighborhoodShakingOperator);
-      }
-      #endregion
-      #region Configure Operators for PermutationEncoding
-      var permCreator = newCreator as IPermutationCreator;
-      if (permCreator != null) {
-        var paramName = permCreator.PermutationParameter.ActualName;
-        // do not replace a permutation creator that was manually set
-        if (!(SolutionCreator is IPermutationCreator)
-            || ((IPermutationCreator)SolutionCreator).PermutationParameter.ActualName != permCreator.PermutationParameter.ActualName) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-          Operators.Add(SolutionCreator);
-        }
-
-        #region Wire Permutation Crossovers
-        var crossovers = Operators.OfType<IPermutationCrossover>()
-          .Union(ApplicationManager.Manager.GetInstances<IPermutationCrossover>(), new TypeEqualityComparer<IPermutationCrossover>())
-          .ToList();
-        foreach (var xo in crossovers) {
-          xo.ChildParameter.ActualName = permCreator.PermutationParameter.ActualName;
-          xo.ChildParameter.Hidden = true;
-          xo.ParentsParameter.ActualName = permCreator.PermutationParameter.ActualName;
-          xo.ParentsParameter.Hidden = true;
-        }
-        Operators.AddRange(crossovers.Except(Operators.OfType<IPermutationCrossover>()));
-        #endregion
-        #region Wire Permutation Manipulators
-        var manipulators = Operators.OfType<IPermutationManipulator>()
-          .Union(ApplicationManager.Manager.GetInstances<IPermutationManipulator>(), new TypeEqualityComparer<IPermutationManipulator>())
-          .ToList();
-        foreach (var m in manipulators) {
-          m.PermutationParameter.ActualName = permCreator.PermutationParameter.ActualName;
-          m.PermutationParameter.Hidden = true;
-        }
-        Operators.AddRange(manipulators.Except(Operators.OfType<IPermutationManipulator>()));
-        #endregion
-        #region Wire Permutation ShakingOperators
-        var shakingOperators = Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>()
-          .Union(ApplicationManager.Manager.GetInstances<IPermutationMultiNeighborhoodShakingOperator>(), new TypeEqualityComparer<IPermutationMultiNeighborhoodShakingOperator>())
-          .ToList();
-        foreach (var op in shakingOperators) {
-          op.PermutationParameter.ActualName = paramName;
-          op.PermutationParameter.Hidden = true;
-        }
-        Operators.AddRange(shakingOperators.Except(Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>()));
-        #endregion
-      } else {
-        Operators.RemoveAll(x => x is IPermutationCrossover
-          || x is IPermutationManipulator
-          || x is IPermutationMultiNeighborhoodShakingOperator);
-      }
-      #endregion
-    }
-
-    protected virtual void ConfigureMultiVectorEncodingOperators(MultiEncodingCreator newCreator, MultiEncoding encoding) {
-      var newBinParams = new HashSet<string>(newCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
-      var newIntParams = new HashSet<string>(newCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
-      var newRealParams = new HashSet<string>(newCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
-      var newPermParams = new HashSet<string>(newCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
-
-      var oldCreator = SolutionCreator as MultiEncodingCreator;
-      if (oldCreator == null) SolutionCreator = newCreator;
-      else {
-        #region Configure BinaryVector Creator
-        var oldBinParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
-        foreach (var toAdd in newBinParams.Except(oldBinParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-          var op = oldCreator.Operators.OfType<IBinaryVectorCreator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure IntegerVector Creator
-        var oldIntParams = new HashSet<string>(oldCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
-        foreach (var toAdd in newIntParams.Except(oldIntParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-          var op = oldCreator.Operators.OfType<IIntegerVectorCreator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure RealVector Creator
-        var oldRealParams = new HashSet<string>(oldCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
-        foreach (var toAdd in newRealParams.Except(oldRealParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-          var op = oldCreator.Operators.OfType<IRealVectorCreator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure Permutation Creator
-        var oldPermParams = new HashSet<string>(oldCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
-        foreach (var toAdd in newPermParams.Except(oldPermParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-          var op = oldCreator.Operators.OfType<IPermutationCreator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
-        foreach (var intersect in newPermParams.Intersect(oldPermParams)) {
-          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
-          var newPermCreator = newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
-          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
-        }
-        #endregion
-
-      }
-
-      // crossover and manipulator for multi-vector encoding
-      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
-      if (Operators.OfType<MultiEncodingCrossover>().Any() && Operators.OfType<MultiEncodingManipulator>().Any()) {
-        #region Update existing multi-vector encoding
-        #region Update ParameterVector Crossover ...
-        foreach (var oldXo in Operators.OfType<MultiEncodingCrossover>()) {
-          #region ... for binary parameters
-          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newBinParams.Except(oldBinParams))
-            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, encoding));
-          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-            var op = oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for integer parameters
-          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newIntParams.Except(oldIntParams))
-            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, encoding));
-          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-            var op = oldXo.Operators.OfType<IIntegerVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for real parameters
-          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newRealParams.Except(oldRealParams))
-            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, encoding));
-          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-            var op = oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for permutation parameters
-          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newPermParams.Except(oldPermParams))
-            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, encoding));
-          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-            var op = oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-        }
-        #endregion
-        #region Update ParameterVector Manipulator ...
-        foreach (var oldM in Operators.OfType<MultiEncodingManipulator>()) {
-          #region ... for binary parameters
-          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>().Select(x => x.BinaryVectorParameter.ActualName));
-          foreach (var toAdd in newBinParams.Except(oldBinParams))
-            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, encoding));
-          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-            var op = oldM.Operators.OfType<IBinaryVectorManipulator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for integer parameters
-          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>().Select(x => x.IntegerVectorParameter.ActualName));
-          foreach (var toAdd in newIntParams.Except(oldIntParams))
-            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, encoding));
-          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-            var op = oldM.Operators.OfType<IIntegerVectorManipulator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for real parameters
-          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>().Select(x => x.RealVectorParameter.ActualName));
-          foreach (var toAdd in newRealParams.Except(oldRealParams))
-            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, encoding));
-          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-            var op = oldM.Operators.OfType<IRealVectorManipulator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for permutation parameters
-          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>().Select(x => x.PermutationParameter.ActualName));
-          foreach (var toAdd in newPermParams.Except(oldPermParams))
-            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, encoding));
-          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-            var op = oldM.Operators.OfType<IPermutationManipulator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-        }
-        #endregion
-        #endregion
-      } else {
-        #region Handle transition from single-vector to multi-vector encoding
-        Operators.RemoveAll(x => x is ICrossover);
-        Operators.RemoveAll(x => x is IManipulator);
-        Operators.RemoveAll(x => x is IStrategyParameterCreator || x is IStrategyParameterManipulator || x is IStrategyParameterCrossover);
-        Operators.RemoveAll(x => x is IParticleCreator);
-        Operators.RemoveAll(x => x is IParticleUpdater);
-        Operators.RemoveAll(x => x is ISwarmUpdater);
-        Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator);
-
-        var crossover = new MultiEncodingCrossover();
-        var manipulator = new MultiEncodingManipulator();
-        foreach (var enc in encoding.Encodings) {
-          if (enc is BinaryEncoding) {
-            crossover.Operators.Add(GetDefaultBinaryCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultBinaryManipulator(enc.Name, encoding));
-            continue;
-          }
-          var intConfig = enc as IntegerEncoding;
-          if (intConfig != null) {
-            crossover.Operators.Add(GetDefaultIntegerCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultIntegerManipulator(enc.Name, encoding));
-            continue;
-          }
-          var realConfig = enc as RealEncoding;
-          if (realConfig != null) {
-            crossover.Operators.Add(GetDefaultRealCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultRealManipulator(enc.Name, encoding));
-            continue;
-          }
-          var permConfig = enc as PermutationEncoding;
-          if (permConfig != null) {
-            crossover.Operators.Add(GetDefaultPermutationCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultPermutationManipulator(enc.Name, encoding));
-            continue;
-          }
-          throw new InvalidOperationException("Unknown type for parameter " + enc.Name);
-        }
-        Operators.Add(crossover);
-        Operators.Add(manipulator);
-        #endregion
-      }
-    }
-
-    #region GetDefaultOperators for Crossovers and Manipulators
-    // ReSharper disable RedundantNameQualifier
-    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, MultiEncoding config) {
-      var binConfig = (BinaryEncoding)config.Encodings[paramName];
-      IBinaryVectorCrossover binXo;
-      if (binConfig.Length > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
-      else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover();
-      binXo.ChildParameter.ActualName = paramName;
-      binXo.ParentsParameter.ActualName = paramName;
-      return binXo;
-    }
-
-    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, MultiEncoding config) {
-      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
-      binM.BinaryVectorParameter.ActualName = paramName;
-      binM.MutationProbabilityParameter.Value = new DoubleValue(0.1);
-      return binM;
-    }
-
-    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, MultiEncoding config) {
-      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaCrossover();
-      intXo.ChildParameter.ActualName = paramName;
-      intXo.ParentsParameter.ActualName = paramName;
-      intXo.BoundsParameter.ActualName = paramName + "Bounds";
-      return intXo;
-    }
-
-    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, MultiEncoding configuration) {
-      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
-      intM.IntegerVectorParameter.ActualName = paramName;
-      intM.BoundsParameter.ActualName = paramName + "Bounds";
-      intM.ProbabilityParameter.Value = new DoubleValue(0.1);
-      return intM;
-    }
-
-    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, MultiEncoding configuration) {
-      var realXo = new Encodings.RealVectorEncoding.BlendAlphaCrossover();
-      realXo.ChildParameter.ActualName = paramName;
-      realXo.ParentsParameter.ActualName = paramName;
-      realXo.BoundsParameter.ActualName = paramName + "Bounds";
-      return realXo;
-    }
-
-    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, MultiEncoding configuration) {
-      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
-      realM.RealVectorParameter.ActualName = paramName;
-      realM.BoundsParameter.ActualName = paramName + "Bounds";
-      return realM;
-    }
-
-    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, MultiEncoding configuration) {
-      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
-      permXo.ChildParameter.ActualName = paramName;
-      permXo.ParentsParameter.ActualName = paramName;
-      return permXo;
-    }
-
-    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, MultiEncoding configuration) {
-      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
-      permM.PermutationParameter.ActualName = paramName;
-      return permM;
-    }
-    // ReSharper restore RedundantNameQualifier
-    #endregion
   }
 }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCreator.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCreator.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCreator.cs	(revision 11587)
@@ -20,19 +20,20 @@
 #endregion
 
+using System;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Programmable.Operators;
 
 namespace HeuristicLab.Problems.Programmable {
-  [Item("MultiEncodingCreator", "Contains solution creators that together create a multiencoding.")]
+  [Item("MultiEncodingCreator", "Contains solution creators that together create a multi-encoding.")]
   [StorableClass]
-  public class MultiEncodingCreator : MultiOperator<ISolutionCreator>, ISolutionCreator {
+  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator {
+    [StorableConstructor]
+    private MultiEncodingCreator(bool deserializing) : base(deserializing) { }
 
-    [StorableConstructor]
-    protected MultiEncodingCreator(bool deserializing) : base(deserializing) { }
-    protected MultiEncodingCreator(MultiEncodingCreator original, Cloner cloner) : base(original, cloner) { }
+    private MultiEncodingCreator(MultiEncodingCreator original, Cloner cloner) : base(original, cloner) { }
     public MultiEncodingCreator() { }
 
@@ -41,7 +42,25 @@
     }
 
-    public override IOperation InstrumentedApply() {
-      var baseOperations = base.InstrumentedApply();
-      return new OperationCollection(new[] { baseOperations }.Concat(Operators.Select(x => ExecutionContext.CreateOperation(x))));
+    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;
     }
   }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCrossover.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCrossover.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingCrossover.cs	(revision 11587)
@@ -20,31 +20,20 @@
 #endregion
 
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Programmable.Operators;
 
 namespace HeuristicLab.Problems.Programmable {
-  [Item("MultiEncoding Crossover", "Applies different crossovers to cross a multiencoding.")]
+  [Item("MultiEncoding Crossover", "Applies different crossovers to cross a multi-encoding.")]
   [StorableClass]
-  public class MultiEncodingCrossover : MultiOperator<ICrossover>, ICrossover {
+  public sealed class MultiEncodingCrossover : MultiEncodingOperator<ICrossover>, ICrossover {
+    [StorableConstructor]
+    private MultiEncodingCrossover(bool deserializing) : base(deserializing) { }
+    private MultiEncodingCrossover(MultiEncodingCrossover original, Cloner cloner) : base(original, cloner) { }
+    public MultiEncodingCrossover() { }
 
-    [StorableConstructor]
-    protected MultiEncodingCrossover(bool deserializing) : base(deserializing) { }
-    protected MultiEncodingCrossover(MultiEncodingCrossover original, Cloner cloner)
-      : base(original, cloner) { }
-    public MultiEncodingCrossover() {
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new MultiEncodingCrossover(this, cloner);
-    }
-
-    public override IOperation InstrumentedApply() {
-      var baseOperations = base.InstrumentedApply();
-      return new OperationCollection(new[] { baseOperations }.Concat(Operators.Select(x => ExecutionContext.CreateOperation(x))));
-    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingCrossover(this, cloner); }
   }
 }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingManipulator.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingManipulator.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingManipulator.cs	(revision 11587)
@@ -20,31 +20,22 @@
 #endregion
 
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Programmable.Operators;
 
 namespace HeuristicLab.Problems.Programmable {
-  [Item("MultiEncoding Manipulator", "Applies different manipulators to change a multiencoding.")]
+  [Item("MultiEncoding Manipulator", "Applies different manipulators to change a multi-encoding.")]
   [StorableClass]
-  public class MultiEncodingManipulator : MultiOperator<IManipulator>, IManipulator {
+  public sealed class MultiEncodingManipulator : MultiEncodingOperator<IManipulator>, IManipulator {
+    [StorableConstructor]
+    private MultiEncodingManipulator(bool deserializing) : base(deserializing) { }
+    private MultiEncodingManipulator(MultiEncodingManipulator original, Cloner cloner)
+      : base(original, cloner) { }
+    public MultiEncodingManipulator() { }
 
-    [StorableConstructor]
-    protected MultiEncodingManipulator(bool deserializing) : base(deserializing) { }
-    protected MultiEncodingManipulator(MultiEncodingManipulator original, Cloner cloner)
-      : base(original, cloner) { }
-    public MultiEncodingManipulator() {
-    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingManipulator(this, cloner); }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new MultiEncodingManipulator(this, cloner);
-    }
-
-    public override IOperation InstrumentedApply() {
-      var baseOperations = base.InstrumentedApply();
-      return new OperationCollection(new[] { baseOperations }.Concat(Operators.Select(x => ExecutionContext.CreateOperation(x))));
-    }
   }
 }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingOperator.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingOperator.cs	(revision 11587)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiEncodingOperator.cs	(revision 11587)
@@ -0,0 +1,64 @@
+﻿#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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Programmable.Interfaces;
+
+namespace HeuristicLab.Problems.Programmable.Operators {
+  public abstract class MultiEncodingOperator<T> : Operator, IMultiEncodingOperator where T : class,IOperator {
+    [StorableConstructor]
+    protected MultiEncodingOperator(bool deserializing) : base(deserializing) { }
+    protected MultiEncodingOperator(MultiEncodingOperator<T> original, Cloner cloner) : base(original, cloner) { }
+
+    protected MultiEncodingOperator() : base() { }
+
+
+    public override IOperation Apply() {
+      var operations = Parameters.Select(p => p.ActualValue).OfType<IOperator>().Select(op => ExecutionContext.CreateOperation(op));
+      return new OperationCollection(operations);
+    }
+
+    public virtual void AddEncoding(IEncoding encoding) {
+      if (Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was already added.", encoding.Name));
+      var param = new ConstrainedValueParameter<T>(encoding.Name, new ItemSet<T>(encoding.Operators.OfType<T>()));
+
+      Parameters.Add(param);
+    }
+
+    public virtual bool RemoveEncoding(IEncoding encoding) {
+      return Parameters.Remove(encoding.Name);
+    }
+
+    public IConstrainedValueParameter<T> GetParameter(IEncoding encoding) {
+      if (!Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was not added to the MultiEncoding.", encoding.Name));
+
+      return (IConstrainedValueParameter<T>)Parameters[encoding.Name];
+    }
+
+
+
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11586)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11587)
@@ -27,8 +27,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
@@ -93,5 +89,4 @@
       Operators.Add(new SingleObjectiveAnalyzer());
       Operators.Add(Evaluator);
-      Operators.Add(SolutionCreator);
 
       RegisterEventHandlers();
@@ -148,4 +143,5 @@
 
       IEncoding encoding = definition.Encoding;
+      SolutionCreator = encoding.SolutionCreator;
 
       EncodingParameter.Value = encoding;
@@ -168,6 +164,5 @@
       DynamicEncodingParameters.Clear();
 
-      var creator = ConfigureCreator(encoding);
-
+      DynamicEncodingParameters.AddRange(encoding.Parameters);
       foreach (var param in DynamicEncodingParameters) {
         param.Hidden = true;
@@ -175,304 +170,13 @@
       }
 
-      var multiEncoding = encoding as MultiEncoding;
-      if (multiEncoding != null) {
-        ConfigureMultiVectorEncodingOperators((MultiEncodingCreator)creator, multiEncoding);
-      } else {
-        ConfigureSingleEncodingOperators(creator, encoding);
-      }
+      ConfigureSingleEncodingOperators();
       UpdateImprovementOperators();
       UpdateMoveOperators();
     }
 
-    protected virtual ISolutionCreator ConfigureCreator(IEncoding encoding) {
-      #region Configure MultiEncoding Creator
-      var multiEncoding = encoding as MultiEncoding;
-      if (multiEncoding != null) {
-        var creator = new MultiEncodingCreator();
-        foreach (var enc in multiEncoding.Encodings) {
-          if (enc is MultiEncoding) throw new InvalidOperationException("MultiEncoding within a MultiEncoding is not supported.");
-          creator.Operators.Add(ConfigureCreator(enc));
-        }
-        return creator;
-      }
-      #endregion
-
-      #region Configure RealVector Creator
-      var realEnc = encoding as RealEncoding;
-      if (realEnc != null) {
-        DynamicEncodingParameters.AddRange(realEnc.Parameters);
-        return realEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure BinaryVector Creator
-      var binEnc = encoding as BinaryEncoding;
-      if (binEnc != null) {
-        DynamicEncodingParameters.AddRange(binEnc.Parameters);
-        return binEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure IntegerVector Creator
-      var intEnc = encoding as IntegerEncoding;
-      if (intEnc != null) {
-        DynamicEncodingParameters.AddRange(intEnc.Parameters);
-        return intEnc.SolutionCreator;
-      }
-      #endregion
-      #region Configure Permutation Creator
-      var permEnc = encoding as PermutationEncoding;
-      if (permEnc != null) {
-        DynamicEncodingParameters.AddRange(permEnc.Parameters);
-        return permEnc.SolutionCreator;
-      }
-      #endregion
-      throw new ArgumentException(string.Format("Encoding {0} is unknown.", encoding != null ? encoding.GetType().FullName : "(null)"));
-    }
-
-    protected virtual void ConfigureSingleEncodingOperators(ISolutionCreator newCreator, IEncoding encoding) {
-      // remove all multiencoding operators
-      Operators.RemoveAll(x => x is MultiEncodingCrossover
-                            || x is MultiEncodingManipulator
-                            || x is MultiEncodingCreator);
-
-      #region Configure Operators for RealVectorEncoding
-      var realEncoding = encoding as RealEncoding;
-      if (realEncoding != null) {
-        // do not replace a real vector creator that was manually set
-        if (!(SolutionCreator is IRealVectorCreator)
-            || ((IRealVectorCreator)SolutionCreator).RealVectorParameter.ActualName != realEncoding.Name) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-        }
-
-        foreach (var su in realEncoding.Operators.OfType<IRealVectorSwarmUpdater>()) {
-          su.MaximizationParameter.ActualName = MaximizationParameter.Name;
-        }
-      }
-      #endregion
-      #region Configure Operators for BinaryVectorEncoding
-      var binEncoding = encoding as BinaryEncoding;
-      if (binEncoding != null) {
-        // do not replace a binary vector creator that was manually set
-        if (!(SolutionCreator is IBinaryVectorCreator) || ((IBinaryVectorCreator)SolutionCreator).BinaryVectorParameter.ActualName != binEncoding.Name) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-        }
-      }
-      #endregion
-      #region Configure Operators for IntegerVectorEncoding
-      var intEncoding = encoding as IntegerEncoding;
-      if (intEncoding != null) {
-        // do not replace an integer vector creator that was manually set
-        if (!(SolutionCreator is IIntegerVectorCreator)
-          || ((IIntegerVectorCreator)SolutionCreator).IntegerVectorParameter.ActualName != intEncoding.Name) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-        }
-      }
-      #endregion
-      #region Configure Operators for PermutationEncoding
-      var permEncoding = encoding as PermutationEncoding;
-      if (permEncoding != null) {
-        // do not replace a permutation creator that was manually set
-        if (!(SolutionCreator is IPermutationCreator)
-            || ((IPermutationCreator)SolutionCreator).PermutationParameter.ActualName != permEncoding.Name) {
-          Operators.Remove(SolutionCreator);
-          SolutionCreator = newCreator;
-        }
-      } else {
-        Operators.RemoveAll(x => x is IPermutationCrossover
-          || x is IPermutationManipulator
-          || x is IPermutationMultiNeighborhoodShakingOperator);
-      }
-      #endregion
-    }
-
-    protected virtual void ConfigureMultiVectorEncodingOperators(MultiEncodingCreator newCreator, MultiEncoding encoding) {
-      var newBinParams = new HashSet<string>(newCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
-      var newIntParams = new HashSet<string>(newCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
-      var newRealParams = new HashSet<string>(newCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
-      var newPermParams = new HashSet<string>(newCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
-
-      var oldCreator = SolutionCreator as MultiEncodingCreator;
-      if (oldCreator == null) SolutionCreator = newCreator;
-      else {
-        #region Configure BinaryVector Creator
-        var oldBinParams = new HashSet<string>(oldCreator.Operators.OfType<IBinaryVectorCreator>().Select(x => x.BinaryVectorParameter.ActualName));
-        foreach (var toAdd in newBinParams.Except(oldBinParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IBinaryVectorCreator>().Single(x => x.BinaryVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-          var op = oldCreator.Operators.OfType<IBinaryVectorCreator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure IntegerVector Creator
-        var oldIntParams = new HashSet<string>(oldCreator.Operators.OfType<IIntegerVectorCreator>().Select(x => x.IntegerVectorParameter.ActualName));
-        foreach (var toAdd in newIntParams.Except(oldIntParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IIntegerVectorCreator>().Single(x => x.IntegerVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-          var op = oldCreator.Operators.OfType<IIntegerVectorCreator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure RealVector Creator
-        var oldRealParams = new HashSet<string>(oldCreator.Operators.OfType<IRealVectorCreator>().Select(x => x.RealVectorParameter.ActualName));
-        foreach (var toAdd in newRealParams.Except(oldRealParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IRealVectorCreator>().Single(x => x.RealVectorParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-          var op = oldCreator.Operators.OfType<IRealVectorCreator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        #endregion
-
-        #region Configure Permutation Creator
-        var oldPermParams = new HashSet<string>(oldCreator.Operators.OfType<IPermutationCreator>().Select(x => x.PermutationParameter.ActualName));
-        foreach (var toAdd in newPermParams.Except(oldPermParams)) {
-          oldCreator.Operators.Add(newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == toAdd));
-        }
-        foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-          var op = oldCreator.Operators.OfType<IPermutationCreator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
-          if (op != null) oldCreator.Operators.Remove(op);
-        }
-        // we also have to sync the permutation type (in case this changes, as it is a value parameter)
-        foreach (var intersect in newPermParams.Intersect(oldPermParams)) {
-          var oldPermCreator = oldCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
-          var newPermCreator = newCreator.Operators.OfType<IPermutationCreator>().Single(x => x.PermutationParameter.ActualName == intersect);
-          oldPermCreator.PermutationTypeParameter.Value = newPermCreator.PermutationTypeParameter.Value;
-        }
-        #endregion
-
-      }
-
-      // crossover and manipulator for multi-vector encoding
-      // the condition checks if a multi-vector encoding is to be updated (there already exists ParameterVectorCrossover and ParameterVectorManipulator)
-      if (Operators.OfType<MultiEncodingCrossover>().Any() && Operators.OfType<MultiEncodingManipulator>().Any()) {
-        #region Update existing multi-vector encoding
-        #region Update ParameterVector Crossover ...
-        foreach (var oldXo in Operators.OfType<MultiEncodingCrossover>()) {
-          #region ... for binary parameters
-          var oldBinParams = new HashSet<string>(oldXo.Operators.OfType<IBinaryVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newBinParams.Except(oldBinParams))
-            oldXo.Operators.Add(GetDefaultBinaryCrossover(toAdd, encoding));
-          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-            var op = oldXo.Operators.OfType<IBinaryVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for integer parameters
-          var oldIntParams = new HashSet<string>(oldXo.Operators.OfType<IIntegerVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newIntParams.Except(oldIntParams))
-            oldXo.Operators.Add(GetDefaultIntegerCrossover(toAdd, encoding));
-          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-            var op = oldXo.Operators.OfType<IIntegerVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for real parameters
-          var oldRealParams = new HashSet<string>(oldXo.Operators.OfType<IRealVectorCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newRealParams.Except(oldRealParams))
-            oldXo.Operators.Add(GetDefaultRealCrossover(toAdd, encoding));
-          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-            var op = oldXo.Operators.OfType<IRealVectorCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for permutation parameters
-          var oldPermParams = new HashSet<string>(oldXo.Operators.OfType<IPermutationCrossover>().Select(x => x.ChildParameter.ActualName));
-          foreach (var toAdd in newPermParams.Except(oldPermParams))
-            oldXo.Operators.Add(GetDefaultPermutationCrossover(toAdd, encoding));
-          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-            var op = oldXo.Operators.OfType<IPermutationCrossover>().SingleOrDefault(x => x.ChildParameter.ActualName == toRemove);
-            if (op != null) oldXo.Operators.Remove(op);
-          }
-          #endregion
-        }
-        #endregion
-        #region Update ParameterVector Manipulator ...
-        foreach (var oldM in Operators.OfType<MultiEncodingManipulator>()) {
-          #region ... for binary parameters
-          var oldBinParams = new HashSet<string>(oldM.Operators.OfType<IBinaryVectorManipulator>().Select(x => x.BinaryVectorParameter.ActualName));
-          foreach (var toAdd in newBinParams.Except(oldBinParams))
-            oldM.Operators.Add(GetDefaultBinaryManipulator(toAdd, encoding));
-          foreach (var toRemove in oldBinParams.Except(newBinParams)) {
-            var op = oldM.Operators.OfType<IBinaryVectorManipulator>().SingleOrDefault(x => x.BinaryVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for integer parameters
-          var oldIntParams = new HashSet<string>(oldM.Operators.OfType<IIntegerVectorManipulator>().Select(x => x.IntegerVectorParameter.ActualName));
-          foreach (var toAdd in newIntParams.Except(oldIntParams))
-            oldM.Operators.Add(GetDefaultIntegerManipulator(toAdd, encoding));
-          foreach (var toRemove in oldIntParams.Except(newIntParams)) {
-            var op = oldM.Operators.OfType<IIntegerVectorManipulator>().SingleOrDefault(x => x.IntegerVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for real parameters
-          var oldRealParams = new HashSet<string>(oldM.Operators.OfType<IRealVectorManipulator>().Select(x => x.RealVectorParameter.ActualName));
-          foreach (var toAdd in newRealParams.Except(oldRealParams))
-            oldM.Operators.Add(GetDefaultRealManipulator(toAdd, encoding));
-          foreach (var toRemove in oldRealParams.Except(newRealParams)) {
-            var op = oldM.Operators.OfType<IRealVectorManipulator>().SingleOrDefault(x => x.RealVectorParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-          #region ... for permutation parameters
-          var oldPermParams = new HashSet<string>(oldM.Operators.OfType<IPermutationManipulator>().Select(x => x.PermutationParameter.ActualName));
-          foreach (var toAdd in newPermParams.Except(oldPermParams))
-            oldM.Operators.Add(GetDefaultPermutationManipulator(toAdd, encoding));
-          foreach (var toRemove in oldPermParams.Except(newPermParams)) {
-            var op = oldM.Operators.OfType<IPermutationManipulator>().SingleOrDefault(x => x.PermutationParameter.ActualName == toRemove);
-            if (op != null) oldM.Operators.Remove(op);
-          }
-          #endregion
-        }
-        #endregion
-        #endregion
-      } else {
-        #region Handle transition from single-vector to multi-vector encoding
-        Operators.RemoveAll(x => x is ICrossover);
-        Operators.RemoveAll(x => x is IManipulator);
-        Operators.RemoveAll(x => x is IStrategyParameterCreator || x is IStrategyParameterManipulator || x is IStrategyParameterCrossover);
-        Operators.RemoveAll(x => x is IParticleCreator);
-        Operators.RemoveAll(x => x is IParticleUpdater);
-        Operators.RemoveAll(x => x is ISwarmUpdater);
-        Operators.RemoveAll(x => x is IMultiNeighborhoodShakingOperator);
-
-        var crossover = new MultiEncodingCrossover();
-        var manipulator = new MultiEncodingManipulator();
-        foreach (var enc in encoding.Encodings) {
-          if (enc is BinaryEncoding) {
-            crossover.Operators.Add(GetDefaultBinaryCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultBinaryManipulator(enc.Name, encoding));
-            continue;
-          }
-          var intConfig = enc as IntegerEncoding;
-          if (intConfig != null) {
-            crossover.Operators.Add(GetDefaultIntegerCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultIntegerManipulator(enc.Name, encoding));
-            continue;
-          }
-          var realConfig = enc as RealEncoding;
-          if (realConfig != null) {
-            crossover.Operators.Add(GetDefaultRealCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultRealManipulator(enc.Name, encoding));
-            continue;
-          }
-          var permConfig = enc as PermutationEncoding;
-          if (permConfig != null) {
-            crossover.Operators.Add(GetDefaultPermutationCrossover(enc.Name, encoding));
-            manipulator.Operators.Add(GetDefaultPermutationManipulator(enc.Name, encoding));
-            continue;
-          }
-          throw new InvalidOperationException("Unknown type for parameter " + enc.Name);
-        }
-        Operators.Add(crossover);
-        Operators.Add(manipulator);
-        #endregion
+
+    protected virtual void ConfigureSingleEncodingOperators() {
+      foreach (var su in GetOperators().OfType<IRealVectorSwarmUpdater>()) {
+        su.MaximizationParameter.ActualName = MaximizationParameter.Name;
       }
     }
@@ -512,72 +216,5 @@
     }
 
-    #region GetDefaultOperators for Crossovers and Manipulators
-    // ReSharper disable RedundantNameQualifier
-    protected virtual IBinaryVectorCrossover GetDefaultBinaryCrossover(string paramName, MultiEncoding config) {
-      var binConfig = (BinaryEncoding)config.Encodings[paramName];
-      IBinaryVectorCrossover binXo;
-      if (binConfig.Length > 3) binXo = new Encodings.BinaryVectorEncoding.SinglePointCrossover();
-      else binXo = new Encodings.BinaryVectorEncoding.UniformCrossover();
-      binXo.ChildParameter.ActualName = paramName;
-      binXo.ParentsParameter.ActualName = paramName;
-      return binXo;
-    }
-
-    protected virtual IBinaryVectorManipulator GetDefaultBinaryManipulator(string paramName, MultiEncoding config) {
-      var binM = new Encodings.BinaryVectorEncoding.SomePositionsBitflipManipulator();
-      binM.BinaryVectorParameter.ActualName = paramName;
-      binM.MutationProbabilityParameter.Value = new DoubleValue(0.1);
-      return binM;
-    }
-
-    protected virtual IIntegerVectorCrossover GetDefaultIntegerCrossover(string paramName, MultiEncoding config) {
-      var intXo = new Encodings.IntegerVectorEncoding.RoundedBlendAlphaBetaCrossover();
-      intXo.ChildParameter.ActualName = paramName;
-      intXo.ParentsParameter.ActualName = paramName;
-      intXo.BoundsParameter.ActualName = paramName + "Bounds";
-      intXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-      intXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      return intXo;
-    }
-
-    protected virtual IIntegerVectorManipulator GetDefaultIntegerManipulator(string paramName, MultiEncoding configuration) {
-      var intM = new Encodings.IntegerVectorEncoding.UniformSomePositionsManipulator();
-      intM.IntegerVectorParameter.ActualName = paramName;
-      intM.BoundsParameter.ActualName = paramName + "Bounds";
-      intM.ProbabilityParameter.Value = new DoubleValue(0.1);
-      return intM;
-    }
-
-    protected virtual IRealVectorCrossover GetDefaultRealCrossover(string paramName, MultiEncoding configuration) {
-      var realXo = new Encodings.RealVectorEncoding.BlendAlphaBetaCrossover();
-      realXo.ChildParameter.ActualName = paramName;
-      realXo.ParentsParameter.ActualName = paramName;
-      realXo.BoundsParameter.ActualName = paramName + "Bounds";
-      realXo.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-      realXo.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      return realXo;
-    }
-
-    protected virtual IRealVectorManipulator GetDefaultRealManipulator(string paramName, MultiEncoding configuration) {
-      var realM = new Encodings.RealVectorEncoding.BreederGeneticAlgorithmManipulator();
-      realM.RealVectorParameter.ActualName = paramName;
-      realM.BoundsParameter.ActualName = paramName + "Bounds";
-      return realM;
-    }
-
-    protected virtual IPermutationCrossover GetDefaultPermutationCrossover(string paramName, MultiEncoding configuration) {
-      var permXo = new Encodings.PermutationEncoding.PartiallyMatchedCrossover();
-      permXo.ChildParameter.ActualName = paramName;
-      permXo.ParentsParameter.ActualName = paramName;
-      return permXo;
-    }
-
-    protected virtual IPermutationManipulator GetDefaultPermutationManipulator(string paramName, MultiEncoding configuration) {
-      var permM = new Encodings.PermutationEncoding.Swap2Manipulator();
-      permM.PermutationParameter.ActualName = paramName;
-      return permM;
-    }
-    // ReSharper restore RedundantNameQualifier
-    #endregion
+
   }
 }
