Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 5337)
@@ -72,5 +72,5 @@
 
           if (dlgResult == DialogResult.OK) {
-            EngineAlgorithm algorithm = Content.Algorithm;
+            IAlgorithm algorithm = Content.Algorithm;
             if(Content.Problems.Count > 0) algorithm.Problem = Content.Problems.First();
             Experiment experiment;
@@ -93,6 +93,6 @@
       Type type = e.Data.GetData("Type") as Type;
       if ((type != null) && (Content.AlgorithmType.ValidTypes.Contains(type))) {
-        EngineAlgorithm algorithm = e.Data.GetData("Value") as EngineAlgorithm;
-        if (algorithm.Problem == null || Content.ProblemType.ValidTypes.Contains(algorithm.Problem.GetType())) {
+        IAlgorithm algorithm = e.Data.GetData("Value") as IAlgorithm;
+        if (algorithm != null && algorithm.Problem == null || Content.ProblemType.ValidTypes.Contains(algorithm.Problem.GetType())) {
           e.Effect = DragDropEffects.Copy;
         }
@@ -101,5 +101,5 @@
     protected void parameterCollectionView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        EngineAlgorithm algorithm = e.Data.GetData("Value") as EngineAlgorithm;
+        IAlgorithm algorithm = e.Data.GetData("Value") as IAlgorithm;
         Content.ImportAlgorithm(algorithm);
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 5337)
@@ -46,5 +46,5 @@
       this.itemsListView.MultiSelect = false;
       this.itemsListView.Name = "itemsListView";
-      this.itemsListView.Size = new System.Drawing.Size(387, 501);
+      this.itemsListView.Size = new System.Drawing.Size(653, 360);
       this.itemsListView.TabIndex = 2;
       this.itemsListView.UseCompatibleStateImageBehavior = false;
@@ -72,5 +72,5 @@
       this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-      this.cancelButton.Location = new System.Drawing.Point(324, 519);
+      this.cancelButton.Location = new System.Drawing.Point(590, 378);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
@@ -84,5 +84,5 @@
       this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
       this.okButton.Enabled = false;
-      this.okButton.Location = new System.Drawing.Point(243, 519);
+      this.okButton.Location = new System.Drawing.Point(509, 378);
       this.okButton.Name = "okButton";
       this.okButton.Size = new System.Drawing.Size(75, 23);
@@ -98,5 +98,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(411, 554);
+      this.ClientSize = new System.Drawing.Size(677, 413);
       this.Controls.Add(this.cancelButton);
       this.Controls.Add(this.okButton);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx	(revision 5337)
@@ -113,8 +113,8 @@
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
 </root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 5337)
@@ -42,6 +42,6 @@
       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
     }
-    public LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     }
 
@@ -56,5 +56,5 @@
       Parameters.Add(new LookupParameter<RunCollection>("Population", ""));
       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
-      Parameters.Add(new LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
     }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 5337)
@@ -30,6 +30,6 @@
       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
     }
-    public LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     }
 
@@ -40,5 +40,5 @@
       Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
-      Parameters.Add(new LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
     }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/RunsAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/RunsAnalyzer.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/RunsAnalyzer.cs	(revision 5337)
@@ -30,6 +30,6 @@
       get { return (LookupParameter<DoubleArray>)Parameters["ProblemQualityReferences"]; }
     }
-    public LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     }
     public ValueLookupParameter<ItemDictionary<StringValue, RunCollection>> RunsParameter {
@@ -43,5 +43,5 @@
       Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
       Parameters.Add(new LookupParameter<DoubleArray>("ProblemQualityReferences", ""));
-      Parameters.Add(new LookupParameter<ConstrainedItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
       Parameters.Add(new ValueLookupParameter<ItemDictionary<StringValue, RunCollection>>("Runs", "", new ItemDictionary<StringValue, RunCollection>()));
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 5337)
@@ -13,5 +13,5 @@
   [Item("ConstrainedTypeValue", "Represents a type with constraints.")]
   [StorableClass]
-  public abstract class ConstrainedTypeValue : TypeValue {
+  public class ConstrainedTypeValue : TypeValue {
 
     [Storable]
@@ -42,4 +42,7 @@
       this.validTypes = new List<Type>(original.validTypes);
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue(this, cloner);
+    }
   }
 
@@ -56,4 +59,6 @@
       this.Value = value;
     }
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing) : base(deserializing) { }
     protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5337)
@@ -113,5 +113,5 @@
 
     #region constructors and cloning
-    public ParameterConfigurationTree(EngineAlgorithm algorithm)
+    public ParameterConfigurationTree(IAlgorithm algorithm)
       : base(null, algorithm.GetType()) {
       this.Optimize = true; // root must always be optimized
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5337)
@@ -217,14 +217,20 @@
     }
 
-    private IEnumerable<Type> GetValidTypes(IValueParameter parameter) {
+    private static IEnumerable<Type> GetValidTypes(IValueParameter parameter) {
       // in case of IOperator return empty list, otherwise hundreds of types would be returned. this mostly occurs for Successor which will never be optimized
       if (parameter.DataType == typeof(IOperator))
         return new List<Type>();
 
+      // return only one type for ValueTypeValues<> (Int, Double, Percent, Bool). Otherwise 2 types would be returned for DoubleValue (PercentValue which is derived)
+      if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), parameter.DataType))
+        return new List<Type> { parameter.DataType }; 
+      
       if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        // use existing validvalues if known
         var parameterValidValues = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
         return parameterValidValues.Cast<object>().Select(x => x.GetType());
       } else {
-        return ApplicationManager.Manager.GetTypes(valueDataType, true);
+        // otherwise use all assignable types
+        return ApplicationManager.Manager.GetTypes(parameter.DataType, true);
       }
     }
@@ -273,5 +279,7 @@
           return true;
         }
-        toCheck = toCheck.BaseType;
+        toCheck = toCheck.BaseType; // baseType is null when toCheck is an Interface
+        if (toCheck == null)
+          return false;
       }
       return false;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5337)
@@ -29,6 +29,6 @@
     }
 
-    public void ApplyStepSize(DoubleValue value) {
-      value.Value = ((int)Math.Round(value.Value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    public double ApplyStepSize(double value) {
+      return (Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
     }
 
@@ -44,4 +44,5 @@
         solutions.Add(new DoubleValue(value));
         value += StepSize.Value;
+        value = ApplyStepSize(value);
       }
       return solutions;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5337)
@@ -29,6 +29,6 @@
     }
 
-    public void ApplyStepSize(IntValue value) {
-      value.Value = ((int)Math.Round(value.Value / (double)this.StepSize.Value, 0)) * this.StepSize.Value;
+    public int ApplyStepSize(int value) {
+      return ((int)Math.Round(value / (double)this.StepSize.Value, 0)) * this.StepSize.Value;
     }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5337)
@@ -33,6 +33,6 @@
     }
 
-    public void ApplyStepSize(PercentValue value) {
-      value.Value = ((int)Math.Round(value.Value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    public double ApplyStepSize(double value) {
+      return ((int)Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
     }
 
@@ -48,4 +48,5 @@
         solutions.Add(new PercentValue(value));
         value += StepSize.Value;
+        value = ApplyStepSize(value);
       }
       return solutions;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmExecutor.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmExecutor.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmExecutor.cs	(revision 5337)
@@ -11,8 +11,8 @@
   /// </summary>
   public class AlgorithmExecutor {
-    private EngineAlgorithm algorithm;
+    private IAlgorithm algorithm;
     private AutoResetEvent waitHandle = new AutoResetEvent(false);
 
-    public AlgorithmExecutor(EngineAlgorithm algorithm) {
+    public AlgorithmExecutor(IAlgorithm algorithm) {
       this.algorithm = algorithm;
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5337)
@@ -30,6 +30,6 @@
       get { return (ILookupParameter<TypeValue>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
     }
-    public ILookupParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    public ILookupParameter<IItemList<IProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     }
     public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
@@ -58,5 +58,5 @@
       Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
       Parameters.Add(new LookupParameter<TypeValue>(MetaOptimizationProblem.AlgorithmTypeParameterName, "Missing description."));
-      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
+      Parameters.Add(new LookupParameter<IItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
       Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
       Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
@@ -77,6 +77,6 @@
     public override IOperation Apply() {
       ParameterConfigurationTree parameterConfiguration = ParameterConfigurationParameter.ActualValue;
-      EngineAlgorithm algorithm = (EngineAlgorithm)Activator.CreateInstance(AlgorithmTypeParameter.ActualValue.Value);
-      IItemList<ISingleObjectiveProblem> problems = ProblemsParameter.ActualValue;
+      IAlgorithm algorithm = (IAlgorithm)Activator.CreateInstance(AlgorithmTypeParameter.ActualValue.Value);
+      IItemList<IProblem> problems = ProblemsParameter.ActualValue;
       ItemDictionary<StringValue, RunCollection> runsCache = ResultsParameter.ActualValue.ContainsKey("Runs") ? (ItemDictionary<StringValue, RunCollection>)ResultsParameter.ActualValue["Runs"].Value : null;
       double[] referenceQualities = GetReferenceQualities(problems);
@@ -113,5 +113,5 @@
     }
 
-    private double[] GetReferenceQualities(IItemList<ISingleObjectiveProblem> problems) {
+    private double[] GetReferenceQualities(IItemList<IProblem> problems) {
       double[] referenceQualities;
       if (ProblemQualityReferencesParameter.ActualValue == null) {
@@ -127,6 +127,6 @@
     }
 
-    private RunCollection ExecuteAlgorithm(ParameterConfigurationTree parameterConfiguration, EngineAlgorithm algorithm, IItemList<ISingleObjectiveProblem> problems) {
-      EngineAlgorithm algorithmClone = (EngineAlgorithm)algorithm.Clone();
+    private RunCollection ExecuteAlgorithm(ParameterConfigurationTree parameterConfiguration, IAlgorithm algorithm, IItemList<IProblem> problems) {
+      IAlgorithm algorithmClone = (IAlgorithm)algorithm.Clone();
 
       // set parameters
@@ -134,8 +134,10 @@
       algorithmClone.StoreAlgorithmInEachRun = false;
 
-      algorithmClone.Engine = new SequentialEngine.SequentialEngine();
+      if (algorithmClone is EngineAlgorithm) {
+        ((EngineAlgorithm)algorithmClone).Engine = new SequentialEngine.SequentialEngine();
+      }
       algorithmClone.Prepare(true);
 
-      foreach (ISingleObjectiveProblem problem in problems) {
+      foreach (IProblem problem in problems) {
         algorithmClone.Problem = (IProblem)problem.Clone();
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5337)
@@ -49,12 +49,12 @@
 
     #region Parameter Properties
-    public IValueParameter<ConstrainedTypeValue<EngineAlgorithm>> AlgorithmTypeParameter {
-      get { return (ValueParameter<ConstrainedTypeValue<EngineAlgorithm>>)Parameters[AlgorithmTypeParameterName]; }
-    }
-    public IValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>> ProblemTypeParameter {
-      get { return (ValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>>)Parameters[ProblemTypeParameterName]; }
-    }
-    public IValueParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
+    public IValueParameter<ConstrainedTypeValue<IAlgorithm>> AlgorithmTypeParameter {
+      get { return (ValueParameter<ConstrainedTypeValue<IAlgorithm>>)Parameters[AlgorithmTypeParameterName]; }
+    }
+    public IValueParameter<ConstrainedTypeValue<IProblem>> ProblemTypeParameter {
+      get { return (ValueParameter<ConstrainedTypeValue<IProblem>>)Parameters[ProblemTypeParameterName]; }
+    }
+    public IValueParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (ValueParameter<ConstrainedItemList<IProblem>>)Parameters[ProblemsParameterName]; }
     }
     public IValueParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter {
@@ -75,16 +75,16 @@
 
     #region Properties
-    public EngineAlgorithm Algorithm {
+    public IAlgorithm Algorithm {
       get { return CreateAlgorithm(AlgorithmType.Value, ProblemType.Value); }
     }
-    public ConstrainedTypeValue<EngineAlgorithm> AlgorithmType {
+    public ConstrainedTypeValue<IAlgorithm> AlgorithmType {
       get { return AlgorithmTypeParameter.Value; }
       set { AlgorithmTypeParameter.Value = value; }
     }
-    public ConstrainedTypeValue<ISingleObjectiveProblem> ProblemType {
+    public ConstrainedTypeValue<IProblem> ProblemType {
       get { return ProblemTypeParameter.Value; }
       set { ProblemTypeParameter.Value = value; }
     }
-    public ConstrainedItemList<ISingleObjectiveProblem> Problems {
+    public ConstrainedItemList<IProblem> Problems {
       get { return ProblemsParameter.Value; }
       set { ProblemsParameter.Value = value; }
@@ -111,7 +111,7 @@
     public MetaOptimizationProblem()
       : base() {
-      Parameters.Add(new ValueParameter<ConstrainedTypeValue<EngineAlgorithm>>(AlgorithmTypeParameterName, "The algorithm which's parameters should be optimized.", new ConstrainedTypeValue<EngineAlgorithm>(typeof(GeneticAlgorithm))));
-      Parameters.Add(new ValueParameter<ConstrainedTypeValue<ISingleObjectiveProblem>>(ProblemTypeParameterName, "The problem type.", new ConstrainedTypeValue<ISingleObjectiveProblem>(typeof(SingleObjectiveTestFunctionProblem))));
-      Parameters.Add(new ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<ISingleObjectiveProblem>()));
+      Parameters.Add(new ValueParameter<ConstrainedTypeValue<IAlgorithm>>(AlgorithmTypeParameterName, "The algorithm which's parameters should be optimized.", new ConstrainedTypeValue<IAlgorithm>(typeof(GeneticAlgorithm))));
+      Parameters.Add(new ValueParameter<ConstrainedTypeValue<IProblem>>(ProblemTypeParameterName, "The problem type.", new ConstrainedTypeValue<IProblem>()));
+      Parameters.Add(new ValueParameter<ConstrainedItemList<IProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<IProblem>()));
       Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationTreeParameterName, "Tree of algorithm parameters that should be optimized."));
       Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
@@ -137,5 +137,5 @@
       ParameterizeOperators();
 
-      ProblemTypeParameter_ValueChanged(this, EventArgs.Empty);
+      AlgorithmTypeParameter_ValueChanged(this, EventArgs.Empty);
     }
 
@@ -222,4 +222,7 @@
 
     private void AlgorithmType_ValueChanged(object sender, EventArgs e) {
+      IAlgorithm instance = (IAlgorithm)Activator.CreateInstance(AlgorithmType.Value);
+      this.ProblemType.ValidTypes = ApplicationManager.Manager.GetTypes(instance.ProblemType, true).ToList();
+      this.ProblemType.Value = this.ProblemType.ValidTypes.First();
       ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, ProblemType.Value));
     }
@@ -236,15 +239,15 @@
     #endregion
 
-    private EngineAlgorithm CreateAlgorithm(Type algorithmType, Type problemType) {
-      EngineAlgorithm algorithm = (EngineAlgorithm)Activator.CreateInstance(algorithmType);
+    private IAlgorithm CreateAlgorithm(Type algorithmType, Type problemType) {
+      IAlgorithm algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
       algorithm.Problem = (IProblem)Activator.CreateInstance(problemType);
       return algorithm;
     }
 
-    public void ImportAlgorithm(EngineAlgorithm algorithm) {
+    public void ImportAlgorithm(IAlgorithm algorithm) {
       AlgorithmType.Value = algorithm.GetType();
-      if(algorithm.Problem != null) ProblemType.Value = algorithm.Problem.GetType();
+      if (algorithm.Problem != null) ProblemType.Value = algorithm.Problem.GetType();
       ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(algorithm);
-      if(algorithm.Problem != null) Problems.Add((ISingleObjectiveProblem)algorithm.Problem);
+      if (algorithm.Problem != null) Problems.Add((IProblem)algorithm.Problem);
     }
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/AverageDoubleValueCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/AverageDoubleValueCrossover.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/AverageDoubleValueCrossover.cs	(revision 5337)
@@ -34,5 +34,5 @@
     public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
       value.Value = (value.Value + other.Value) / 2;
-      range.ApplyStepSize(value);
+      value.Value = range.ApplyStepSize(value.Value);
     }
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalDoubleValueCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalDoubleValueCrossover.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalDoubleValueCrossover.cs	(revision 5337)
@@ -39,5 +39,5 @@
       do {
         offspring.Value = N.NextDouble();
-        range.ApplyStepSize(offspring);
+        offspring.Value = range.ApplyStepSize(offspring.Value);
       } while (!range.IsInRange(offspring.Value));
       return offspring;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalIntValueCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalIntValueCrossover.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/NormalIntValueCrossover.cs	(revision 5337)
@@ -38,5 +38,5 @@
       do {
         offspring.Value = (int)N.NextDouble();
-        range.ApplyStepSize(offspring);
+        offspring.Value = range.ApplyStepSize(offspring.Value);
       } while (!range.IsInRange(offspring.Value));
       return offspring;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs	(revision 5337)
@@ -45,5 +45,5 @@
         NormalAllPositionsManipulator.Apply(random, vector, strategy);
         value.Value = vector[0];
-        range.ApplyStepSize(value);
+        value.Value = range.ApplyStepSize(value.Value);
         ok = range.IsInRange(value.Value);
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalIntValueManipulator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalIntValueManipulator.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalIntValueManipulator.cs	(revision 5337)
@@ -47,5 +47,5 @@
         NormalAllPositionsManipulator.Apply(random, vector, strategy);
         value.Value = (int)vector[0];
-        range.ApplyStepSize(value);
+        value.Value = range.ApplyStepSize(value.Value);
         ok = range.IsInRange(value.Value);
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs	(revision 5337)
@@ -47,5 +47,5 @@
         UniformOnePositionManipulator.Apply(random, vector, bounds);
         value.Value = vector[0];
-        range.ApplyStepSize(value);
+        value.Value = range.ApplyStepSize(value.Value);
         ok = range.IsInRange(value.Value);
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs	(revision 5328)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs	(revision 5337)
@@ -45,5 +45,5 @@
         UniformOnePositionManipulator.Apply(random, vector, range.LowerBound, new IntValue(range.UpperBound.Value + 1));
         value.Value = vector[0];
-        range.ApplyStepSize(value);
+        value.Value = range.ApplyStepSize(value.Value);
         ok = range.IsInRange(value.Value);
       }
