Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterSetCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterSetCreator.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterSetCreator.cs	(revision 4525)
@@ -7,4 +7,5 @@
 using HeuristicLab.Operators;
 using HeuristicLab.Parameters;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -26,4 +27,5 @@
     }
 
+    [Storable]
     private ParameterConfigurationList parametersToOptimize;
     public ParameterConfigurationList ParametersToOptimize {
@@ -42,4 +44,12 @@
       return base.Apply();
     }
+
+    #region Cloning
+    public override IDeepCloneable Clone(Cloner cloner) {
+      RandomParameterSetCreator clone = (RandomParameterSetCreator) base.Clone(cloner);
+      clone.parametersToOptimize = (ParameterConfigurationList)this.parametersToOptimize.Clone();
+      return clone;
+    }
+    #endregion
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs	(revision 4525)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs	(revision 4525)
@@ -0,0 +1,88 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization.Encodings.Crossovers {
+  /// <summary>
+  /// 
+  /// </summary>
+  [Item("ParameterSetCrossover", "TODO")]
+  [StorableClass]
+  public class ParameterSetCrossover : SingleSuccessorOperator, IParameterSetOperator, ICrossover {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemArray<IParameterSet>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IParameterSet>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<IParameterSet> ChildParameter {
+      get { return (ILookupParameter<IParameterSet>)Parameters["Child"]; }
+    }
+
+    public IValueParameter<IBinaryVectorCrossover> BinaryVectorCrossoverParameter {
+      get { return (IValueParameter<IBinaryVectorCrossover>)Parameters["BinaryVectorCrossover"]; }
+    }
+    public IValueParameter<IIntegerVectorCrossover> IntegerVectorCrossoverParameter {
+      get { return (IValueParameter<IIntegerVectorCrossover>)Parameters["IntegerVectorCrossover"]; }
+    }
+    public IValueParameter<IRealVectorCrossover> RealVectorCrossoverParameter {
+      get { return (IValueParameter<IRealVectorCrossover>)Parameters["RealVectorCrossover"]; }
+    }
+    public ParameterSetCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+      Parameters.Add(new ScopeTreeLookupParameter<IParameterSet>("Parents", "The parent vectors which should be crossed."));
+      ParentsParameter.ActualName = "ParameterSet";
+      Parameters.Add(new LookupParameter<IParameterSet>("Child", "The child vector resulting from the crossover."));
+      ChildParameter.ActualName = "ParameterSet";
+      Parameters.Add(new ValueParameter<IRealVectorCrossover>("BinaryVectorCrossover", "Crossover operator used for crossing binary parameters"));
+      Parameters.Add(new ValueParameter<IRealVectorCrossover>("IntegerVectorCrossover", "Crossover operator used for crossing integer parameters"));
+      Parameters.Add(new ValueParameter<IRealVectorCrossover>("RealVectorCrossover", "Crossover operator used for crossing real parameters"));
+    }
+    public override IOperation Apply() {
+      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters1 = GetIntegerParameters(ParentsParameter.ActualValue[0]);
+      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters2 = GetIntegerParameters(ParentsParameter.ActualValue[1]);
+      IParameterSet child = (IParameterSet)ParentsParameter.ActualValue[0].Clone();
+      
+      // TODO: use specific crossover operators to do the crossing
+      // for now: just swap the int-values
+      foreach (var par in integerParameters1) {
+        ParentsParameter.ActualValue[1].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
+      }
+      foreach (var par in integerParameters2) {
+        ParentsParameter.ActualValue[0].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
+      }
+
+      ChildParameter.ActualValue = child;
+      return base.Apply();
+    }
+
+    private IEnumerable<IndexedItem<IParameterConfiguration>> GetIntegerParameters(IParameterSet parameterSet) {
+      List<IndexedItem<IParameterConfiguration>> integerParameters = new List<IndexedItem<IParameterConfiguration>>();
+      int i = 0;
+      foreach (var item in parameterSet.Parameters) {
+        if (item.Parameter.DataType == typeof(IntValue)) {
+          integerParameters.Add(new IndexedItem<IParameterConfiguration>(i, (IParameterConfiguration)item.Clone()));
+        }
+        i++;
+      }
+      return integerParameters;
+    }
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NumericParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NumericParameterConfiguration.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NumericParameterConfiguration.cs	(revision 4525)
@@ -6,7 +6,10 @@
 using HeuristicLab.Core;
 using HeuristicLab.Collections;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
   public class NumericParameterConfiguration : ParameterConfiguration {
+    [Storable]
     private NumericRangeList ranges;
     public NumericRangeList Ranges {
@@ -15,4 +18,8 @@
 
     protected NumericParameterConfiguration() { }
+    
+    [StorableConstructor]
+    protected NumericParameterConfiguration(bool deserializing) : base(deserializing) { }
+
     public NumericParameterConfiguration(IParameter parameter, string category)
       : base(parameter, category) {
@@ -22,4 +29,6 @@
       this.ranges.CollectionReset += new CollectionItemsChangedEventHandler<INumericRange>(ranges_CollectionReset);
     }
+
+
 
     void ranges_CollectionReset(object sender, CollectionItemsChangedEventArgs<INumericRange> e) {
@@ -55,4 +64,5 @@
     }
 
+    #region Cloning
     public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
       NumericParameterConfiguration clone = (NumericParameterConfiguration)base.Clone(cloner);
@@ -63,4 +73,5 @@
       return clone;
     }
+    #endregion
 
     void range_ToStringChanged(object sender, EventArgs e) {
@@ -72,10 +83,8 @@
     }
 
-    public override IParameter GetParameterWithRandomValue(IRandom random) {
+    public override void SetParameterWithRandomValue(IRandom random) {
       int rangeIndex = random.Next(ranges.Count);
       int value = random.Next(ranges.ElementAt(rangeIndex).LowerBound.Value, ranges.ElementAt(rangeIndex).UpperBound.Value); // TODO: respect StepSize parameter
-      IParameter clone = (IParameter)this.Parameter.Clone();
-      clone.ActualValue = new IntValue(value);
-      return clone;
+      this.Parameter.ActualValue = new IntValue(value);
     }
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs	(revision 4525)
@@ -5,12 +5,20 @@
 using HeuristicLab.Core;
 using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
   public abstract class ParameterConfiguration : IParameterConfiguration {
-    public bool Optimize { get; set; }
+    [Storable]
     public IParameter Parameter { get; set; }
+
+    [Storable]
     public string Category { get; set; }
 
     public ParameterConfiguration() { }
+    
+    [StorableConstructor]
+    protected ParameterConfiguration(bool deserializing) { }
+
     public ParameterConfiguration(IParameter parameter, string category) {
       this.Parameter = parameter;
@@ -74,5 +82,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.Parameter = (IParameter)cloner.Clone(this.Parameter);
-      clone.Optimize = this.Optimize;
+      clone.Category = this.Category;
       return clone;
     }
@@ -87,5 +95,5 @@
     }
     
-    public abstract IParameter GetParameterWithRandomValue(IRandom random);
+    public abstract void SetParameterWithRandomValue(IRandom random);
 
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterSet.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterSet.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterSet.cs	(revision 4525)
@@ -4,23 +4,41 @@
 using System.Text;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
   public class ParameterSet : Item, IParameterSet {
-    private List<KeyValuePair<string, IParameter>> parameters;
-    public IEnumerable<KeyValuePair<string, IParameter>> Parameters {
+    [Storable]
+    private List<IParameterConfiguration> parameters;
+    public IEnumerable<IParameterConfiguration> Parameters {
       get { return parameters; }
     }
 
     public ParameterSet() {
-      this.parameters = new List<KeyValuePair<string, IParameter>>();
+      this.parameters = new List<IParameterConfiguration>();
     }
+
+    [StorableConstructor]
+    protected ParameterSet(bool deserializing) : base(deserializing) { }
+
     public ParameterSet(ParameterConfigurationList parametersToOptimize, IRandom random)
       : this() {
       foreach (IParameterConfiguration config in parametersToOptimize.CheckedItems) {
-        parameters.Add(new KeyValuePair<string, IParameter>(config.Category, config.GetParameterWithRandomValue(random)));
+        IParameterConfiguration clone = (IParameterConfiguration)config.Clone();
+        clone.SetParameterWithRandomValue(random);
+        parameters.Add(clone);
       }
     }
 
-
+    #region Cloning
+    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      ParameterSet clone = (ParameterSet)base.Clone(cloner);
+      clone.parameters = new List<IParameterConfiguration>();
+      foreach (var param in this.parameters) {
+        clone.parameters.Add((IParameterConfiguration)param.Clone(cloner));
+      }
+      return clone;
+    }
+    #endregion
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4525)
@@ -57,9 +57,9 @@
 
     private void ParametrizeAlgorithm() {
-      foreach (KeyValuePair<string, IParameter> parameter in ParameterSetParameter.ActualValue.Parameters) {
-        if (parameter.Key == "Algorithm") {
-          this.AlgorithmParameter.ActualValue.Parameters[parameter.Value.Name].ActualValue = parameter.Value.ActualValue;
-        } else if (parameter.Key == "Problem") {
-          this.AlgorithmParameter.ActualValue.Problem.Parameters[parameter.Value.Name].ActualValue = parameter.Value.ActualValue;
+      foreach (IParameterConfiguration parameter in ParameterSetParameter.ActualValue.Parameters) {
+        if (parameter.Category == "Algorithm") {
+          this.AlgorithmParameter.ActualValue.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
+        } else if (parameter.Category == "Problem") {
+          this.AlgorithmParameter.ActualValue.Problem.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
         }
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 4525)
@@ -54,4 +54,13 @@
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Operators-3.3">
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
@@ -81,4 +90,6 @@
     <Compile Include="Creators\RandomParameterSetCreator.cs" />
     <Compile Include="Encodings\BooleanParameterConfiguration.cs" />
+    <Compile Include="Encodings\Crossovers\ParameterSetCrossover.cs" />
+    <Compile Include="Interfaces\IParameterSetOperator.cs" />
     <Compile Include="NumericRangeList.cs" />
     <Compile Include="Encodings\EnumerableParameterConfiguration.cs" />
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4525)
@@ -7,9 +7,8 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   public interface IParameterConfiguration : INamedItem {
-    bool Optimize { get; set; }
     IParameter Parameter { get; set; }
     string Category { get; set; }
 
-    IParameter GetParameterWithRandomValue(IRandom random);
+    void SetParameterWithRandomValue(IRandom random);
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSet.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSet.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSet.cs	(revision 4525)
@@ -7,5 +7,5 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   public interface IParameterSet : IItem {
-    IEnumerable<KeyValuePair<string, IParameter>> Parameters { get; }
+    IEnumerable<IParameterConfiguration> Parameters { get; }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetOperator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetOperator.cs	(revision 4525)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetOperator.cs	(revision 4525)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An interface which represents an operator dealing with parameter sets.
+  /// </summary>
+  public interface IParameterSetOperator : IOperator { }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4525)
@@ -172,4 +172,5 @@
     }
 
+    #region Cloning
     public override IDeepCloneable Clone(Cloner cloner) {
       MetaOptimizationProblem clone = (MetaOptimizationProblem)base.Clone(cloner);
@@ -179,4 +180,5 @@
       return clone;
     }
+    #endregion
 
     #region Helpers
@@ -195,5 +197,9 @@
       operators.Add(new BestQualityAnalyzer());
       ParameterizeAnalyzer();
+      operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterSetOperator>().Cast<IOperator>());
       ParameterizeOperators();
+
+      //UpdateMoveEvaluators();
+      //InitializeMoveGenerators();
     }
     private void ParameterizeSolutionCreator() {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRange.cs	(revision 4517)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRange.cs	(revision 4525)
@@ -5,7 +5,10 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
   public class NumericRange : Item, INumericRange {
+    [Storable]
     private IntValue lowerBound;
     public IntValue LowerBound {
@@ -25,4 +28,5 @@
     }
 
+    [Storable]
     private IntValue upperBound;
     public IntValue UpperBound {
@@ -42,4 +46,5 @@
     }
 
+    [Storable]
     private IntValue stepSize;
     public IntValue StepSize {
@@ -63,4 +68,20 @@
       UpperBound = new IntValue(0);
       StepSize = new IntValue(1);
+    }
+
+    [StorableConstructor]
+    protected NumericRange(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (lowerBound != null) {
+        lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
+      }
+      if (upperBound != null) {
+        upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
+      }
+      if (stepSize != null) {
+        stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
+      }
     }
 
@@ -95,4 +116,14 @@
       return string.Format("[{0},{1}:{2}]", LowerBound.ToString(), UpperBound.ToString(), StepSize.ToString());
     }
+
+    #region Cloning
+    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      NumericRange clone = (NumericRange)base.Clone(cloner);
+      clone.LowerBound = (IntValue)this.LowerBound.Clone();
+      clone.UpperBound = (IntValue)this.UpperBound.Clone();
+      clone.StepSize = (IntValue)this.StepSize.Clone();
+      return base.Clone(cloner);
+    }
+    #endregion
   }
 }
