Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 5184)
@@ -21,9 +21,9 @@
     }
     public ILookupParameter<ParameterConfigurationTree> InitialParameterConfigurationParameter {
-      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["InitialParameterConfigurationTree"]; }
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters[MetaOptimizationProblem.ParameterConfigurationTreeParameterName]; }
     }
 
-    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
-      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    public IValueLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (IValueLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTreeSolutionCandidate"]; }
     }
 
@@ -33,6 +33,6 @@
     public RandomParameterConfigurationCreator() : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
-      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("InitialParameterConfigurationTree", "The parameter configuration tree on which the new solution will be based on."));
-      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "The new random parameter set."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>(MetaOptimizationProblem.ParameterConfigurationTreeParameterName, "The parameter configuration tree on which the new solution will be based on."));
+      Parameters.Add(new ValueLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTreeSolutionCandidate", "The new random parameter set."));
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs	(revision 5184)
@@ -15,5 +15,5 @@
   [Item("ParameterConfigurationCrossover", "TODO")]
   [StorableClass]
-  public class ParameterConfigurationCrossover : SingleSuccessorOperator, IParameterConfigurationOperator, ICrossover {
+  public class ParameterConfigurationCrossover : SingleSuccessorOperator, IParameterConfigurationOperator, IParameterConfigurationCrossover {
     public override bool CanChangeName {
       get { return false; }
@@ -23,9 +23,9 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
-    public ILookupParameter<ItemArray<IValueConfiguration>> ParentsParameter {
-      get { return (ScopeTreeLookupParameter<IValueConfiguration>)Parameters["Parents"]; }
+    public ILookupParameter<ItemArray<ParameterConfigurationTree>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["Parents"]; }
     }
-    public ILookupParameter<IValueConfiguration> ChildParameter {
-      get { return (ILookupParameter<IValueConfiguration>)Parameters["Child"]; }
+    public ILookupParameter<ParameterConfigurationTree> ChildParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["Child"]; }
     }
 
@@ -43,8 +43,6 @@
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
-      Parameters.Add(new ScopeTreeLookupParameter<IValueConfiguration>("Parents", "The parent vectors which should be crossed."));
-      ParentsParameter.ActualName = "ParameterConfigurationTree";
-      Parameters.Add(new LookupParameter<IValueConfiguration>("Child", "The child vector resulting from the crossover."));
-      ChildParameter.ActualName = "ParameterConfigurationTree";
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("Parents", "The parent vectors which should be crossed."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("Child", "The child vector resulting from the crossover."));
 
       Parameters.Add(new ValueLookupParameter<IIntValueCrossover>(MetaOptimizationProblem.IntValueCrossoverParameterName, ""));
@@ -56,6 +54,6 @@
 
     public override IOperation Apply() {
-      IValueConfiguration child1 = (IValueConfiguration)ParentsParameter.ActualValue[0].Clone();
-      IValueConfiguration child2 = (IValueConfiguration)ParentsParameter.ActualValue[1];
+      ParameterConfigurationTree child1 = (ParameterConfigurationTree)ParentsParameter.ActualValue[0].Clone();
+      ParameterConfigurationTree child2 = (ParameterConfigurationTree)ParentsParameter.ActualValue[1];
 
       //child1.Cross(child2, RandomParameter.ActualValue);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 5184)
@@ -10,5 +10,6 @@
     private IOptimizable node;
     private List<IEnumerator> enumerators;
-    IEnumerator valueEnumerator;
+    private EnumeratorCollectionEnumerator<IItem> valueEnumerator;
+    private bool initialized = false;
 
     public ParameterCombinationsEnumerator(IOptimizable node) {
@@ -21,5 +22,9 @@
     }
     object IEnumerator.Current {
-      get { return Current; }
+      get {
+        if (!initialized)
+          throw new SystemException("Enumeration not started. Call MoveNext!");
+        return Current; 
+      }
     }
 
@@ -27,21 +32,30 @@
 
     public bool MoveNext() {
-      int i = 0;
-      bool ok = false;
-      while (!ok && i < enumerators.Count) {
-        if (enumerators[i].MoveNext()) {
-          ok = true;
+      if (!initialized) {
+        foreach (var enu in enumerators) {
+          enu.Reset();
+          if (!enu.MoveNext())
+            return false;
+        }
+        initialized = true;
+      } else {
+        int i = 0;
+        bool ok = false;
+        while (!ok && i < enumerators.Count) {
+          if (enumerators[i].MoveNext()) {
+            ok = true;
+          } else {
+            i++;
+          }
+        }
+
+        if (ok) {
+          for (int k = i - 1; k >= 0; k--) {
+            enumerators[k].Reset();
+            enumerators[k].MoveNext();
+          }
         } else {
-          i++;
+          return false;
         }
-      }
-
-      if (ok) {
-        for (int k = i - 1; k >= 0; k--) {
-          enumerators[k].Reset();
-          enumerators[k].MoveNext();
-        }
-      } else {
-        return false;
       }
 
@@ -61,10 +75,9 @@
       enumerators.Clear();
       valueEnumerator = null;
+      initialized = false;
 
       var pc = node as IParameterConfiguration;
       if (pc != null) {
-        valueEnumerator = pc.ValueConfigurations.CheckedItems.ToArray().GetEnumerator();
-        //valueEnumerator.Reset();
-        enumerators.Add(valueEnumerator);
+        valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
 
         foreach (var valueConfiguration in pc.ValueConfigurations.CheckedItems) {
@@ -72,8 +85,11 @@
             var enumerator = new ParameterCombinationsEnumerator(valueConfiguration);
             enumerator.Reset();
-            enumerator.MoveNext();
-            enumerators.Add(enumerator);
+            valueEnumerator.AddEnumerator(enumerator);
+          } else {
+            valueEnumerator.AddEnumerator(new List<IItem> { valueConfiguration }.GetEnumerator());
           }
         }
+        valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
       }
 
@@ -81,7 +97,7 @@
       if (vc != null) {
         if (vc.RangeConstraint != null) {
-          valueEnumerator = vc.RangeConstraint.GetCombinations().ToArray().GetEnumerator();
-          //valueEnumerator.Reset();
-          //enumerator.MoveNext();
+          valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
+          valueEnumerator.AddEnumerator(vc.RangeConstraint.GetCombinations().GetEnumerator());
+          valueEnumerator.Reset();
           enumerators.Add(valueEnumerator);
         } else {
@@ -90,5 +106,4 @@
               var enumerator = new ParameterCombinationsEnumerator(parameterConfiguration);
               enumerator.Reset();
-              enumerator.MoveNext();
               enumerators.Add(enumerator);
             }
@@ -97,5 +112,50 @@
       }
     }
+  }
 
+  /// <summary>
+  /// Enumerator which can enumerate all elements of a list of enumerators
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  public class EnumeratorCollectionEnumerator<T> : IEnumerator<T> {
+    private List<IEnumerator<T>> enumerators = new List<IEnumerator<T>>();
+    private IEnumerator<IEnumerator<T>> currentEnumerator;
+
+    public EnumeratorCollectionEnumerator() { }
+
+    public void AddEnumerator(IEnumerator<T> enumerator) {
+      enumerators.Add(enumerator);
+    }
+
+    public void Dispose() {  }
+
+    public T Current {
+      get { return currentEnumerator.Current.Current; }
+    }
+
+    object IEnumerator.Current {
+      get { return this.Current; }
+    }
+
+    public bool MoveNext() {
+      bool ok = currentEnumerator.Current.MoveNext();
+      if (!ok) {
+        ok = currentEnumerator.MoveNext();
+        if (!ok)
+          return false;
+        else
+          return this.MoveNext();
+      }
+      return true;
+    }
+
+    public void Reset() {
+      foreach (var enu in enumerators) {
+        enu.Reset();
+      }
+      currentEnumerator = enumerators.GetEnumerator();
+      currentEnumerator.Reset();
+      currentEnumerator.MoveNext();
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5184)
@@ -14,12 +14,4 @@
   [StorableClass]
   public class ParameterConfigurationTree : ValueConfiguration, IEnumerable {
-    //[Storable]
-    //public EngineAlgorithm Algorithm {
-    //  get { return (EngineAlgorithm)base.ActualValue.Value; }
-    //  set {
-    //    base.ActualValue.Value = value;
-    //  }
-    //}
-
     [Storable]
     private DoubleValue bestQuality;
@@ -83,6 +75,7 @@
       get { return runs; }
       set { runs = value; }
-     }
-
+    }
+
+    [Storable]
     protected IDictionary<string, IItem> parameters;
     public IDictionary<string, IItem> Parameters {
@@ -109,4 +102,11 @@
       : base(original, cloner) {
       this.bestQuality = cloner.Clone(original.BestQuality);
+      this.averageQuality = cloner.Clone(original.averageQuality);
+      this.worstQuality = cloner.Clone(original.worstQuality);
+      this.qualityStandardDeviation = cloner.Clone(original.qualityStandardDeviation);
+      this.qualityVariance = cloner.Clone(original.qualityVariance);
+      this.averageExecutionTime = cloner.Clone(original.averageExecutionTime);
+      this.repetitions = cloner.Clone(original.repetitions);
+      this.runs = cloner.Clone(original.runs);
       this.parameters = new Dictionary<string, IItem>();
       foreach (var p in original.parameters) {
@@ -182,13 +182,25 @@
     }
 
-    public Experiment GenerateExperiment(IAlgorithm algorithm) {
+    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
       Experiment experiment = new Experiment();
       foreach (IValueConfiguration combination in this) {
         IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
-        clonedAlg.Name = combination.ToParameterInfoString();
+        clonedAlg.Name = combination.ParameterInfoString;
         combination.Parameterize(clonedAlg);
-        experiment.Optimizers.Add(clonedAlg);
+        clonedAlg.StoreAlgorithmInEachRun = false;
+        if (createBatchRuns) {
+          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
+          batchRun.Algorithm = clonedAlg;
+          batchRun.Repetitions = repetitions;
+          experiment.Optimizers.Add(batchRun);
+        } else {
+          experiment.Optimizers.Add(clonedAlg);
+        }
       }
       return experiment;
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm) {
+      return GenerateExperiment(algorithm, false, 0);
     }
 
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 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5184)
@@ -300,17 +300,21 @@
     }
 
-    public string ToParameterInfoString() {
-      StringBuilder sb = new StringBuilder();
-      if (this.Optimize) {
-        sb.Append(string.Format("{0}: {1}", parameterName, this.ActualValue.Value));
-        //sb.Append(" (");
-        //var subParams = new List<string>();
-        //if (this.ActualValue.Value is IParameterizedItem) {
-        //  subParams.Add(this.ValueConfigurations.CheckedItems.ElementAt(actualValueConfigurationIndex).ToParameterInfoString());
-        //}
-        //sb.Append(string.Join(", ", subParams.ToArray()));
-        //sb.Append(")");
-      }
-      return sb.ToString();
+    public string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if (this.Optimize) {
+          sb.Append(string.Format("{0}: {1}", parameterName, this.ActualValue.Value != null ? this.ActualValue.Value.ToString() : "null"));
+
+          if (this.ActualValue.Value is IParameterizedItem) {
+            string subParams = this.ValueConfigurations.CheckedItems.ElementAt(actualValueConfigurationIndex).ParameterInfoString;
+            if (!string.IsNullOrEmpty(subParams)) {
+              sb.Append(" (");
+              sb.Append(subParams);
+              sb.Append(")");
+            }
+          }
+        }
+        return sb.ToString();
+      }
     }
 
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 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5184)
@@ -44,5 +44,4 @@
 
       while (value <= UpperBound.Value) {
-        //yield return new DoubleValue(value);
         solutions.Add(new DoubleValue(value));
         value += StepSize.Value;
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 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5184)
@@ -44,5 +44,4 @@
 
       while (value <= this.UpperBound.Value) {
-        //yield return new IntValue(value);
         solutions.Add(new IntValue(value));
         value += 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 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5184)
@@ -39,5 +39,4 @@
 
       while (value <= UpperBound.Value) {
-        //yield return new PercentValue(value);
         solutions.Add(new PercentValue(value));
         value += StepSize.Value;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5184)
@@ -95,5 +95,5 @@
         RangeConstraint = new DoubleValueRange(new DoubleValue(0), (DoubleValue)value, new DoubleValue(0.01));
       } else if (actualValue.ValueDataType == typeof(PercentValue)) {
-        RangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
+        RangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.01));
       } else if (actualValue.ValueDataType == typeof(BoolValue)) {
         this.IsOptimizable = false; // there is nothing to configure for bools
@@ -211,16 +211,18 @@
     }
 
-    public string ToParameterInfoString() {
-      StringBuilder sb = new StringBuilder();
-      if (this.Optimize) {
-        if (this.ParameterConfigurations.Count > 0) {
-          var parameterInfos = new List<string>();
-          foreach (var pc in this.ParameterConfigurations) {
-            if (pc.Optimize) parameterInfos.Add(pc.ToParameterInfoString());
-          }
-          sb.Append(string.Join(", ", parameterInfos.ToArray()));
-        }
-      }
-      return sb.ToString();
+    public string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if (this.Optimize) {
+          if (this.ParameterConfigurations.Count > 0) {
+            var parameterInfos = new List<string>();
+            foreach (var pc in this.ParameterConfigurations) {
+              if (pc.Optimize) parameterInfos.Add(pc.ParameterInfoString);
+            }
+            sb.Append(string.Join(", ", parameterInfos.ToArray()));
+          }
+        }
+        return sb.ToString();
+      }
     }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5184)
@@ -19,4 +19,5 @@
   public class ParameterConfigurationEvaluator : SingleSuccessorOperator, IParameterConfigurationEvaluator {
     private bool algorithmStopped;
+    private bool algorithmExceptionOccured;
 
     public ILookupParameter<DoubleValue> QualityParameter {
@@ -69,5 +70,8 @@
 
       algorithmStopped = false;
-      algorithm.Stopped += new EventHandler(ActualValue_Stopped);
+      algorithmExceptionOccured = false;
+      algorithm.Stopped += new EventHandler(algorithm_Stopped);
+      algorithm.Paused += new EventHandler(algorithm_Paused);
+      algorithm.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(algorithm_ExceptionOccurred);
 
       List<double> qualities = new List<double>();
@@ -85,18 +89,26 @@
             Thread.Sleep(200); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
           }
-          qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
-          executionTimes.Add(algorithm.ExecutionTime);
 
-          // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
-          algorithm.Runs.Last().Parameters.Clear();
-          // but keep the problem, since this differs in runs
-          algorithm.Runs.Last().Parameters.Add("Problem", problem);
+          if (algorithmExceptionOccured) {
+            // this parametercombination was bad. set penalty for this solution
+            qualities.Add(double.MaxValue); // todo: respect Maximization
+            executionTimes.Add(algorithm.ExecutionTime);
+          } else {
+            qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
+            executionTimes.Add(algorithm.ExecutionTime);
+
+            // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
+            algorithm.Runs.Last().Parameters.Clear();
+            // but keep the problem, since this differs in runs
+            algorithm.Runs.Last().Parameters.Add("Problem", problem);
+          }
           algorithmStopped = false;
+          algorithmExceptionOccured = false;
         }
-
       }
 
-
-      algorithm.Stopped -= new EventHandler(ActualValue_Stopped);
+      algorithm.Stopped -= new EventHandler(algorithm_Stopped);
+      algorithm.Paused -= new EventHandler(algorithm_Paused);
+      algorithm.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(algorithm_ExceptionOccurred);
       algorithm.Prepare();
 
@@ -104,5 +116,5 @@
 
       ParameterConfigurationParameter.ActualValue.AverageExecutionTime = new TimeSpanValue(TimeSpan.FromMilliseconds(executionTimes.Average(t => t.TotalMilliseconds)));
-      ParameterConfigurationParameter.ActualValue.Repetitions = Repetitions;
+      ParameterConfigurationParameter.ActualValue.Repetitions = (IntValue)Repetitions.Clone();
       ParameterConfigurationParameter.ActualValue.BestQuality = new DoubleValue(qualities.First());
       ParameterConfigurationParameter.ActualValue.AverageQuality = new DoubleValue(qualities.Average());
@@ -110,5 +122,5 @@
       ParameterConfigurationParameter.ActualValue.QualityVariance = new DoubleValue(qualities.Variance());
       ParameterConfigurationParameter.ActualValue.QualityStandardDeviation = new DoubleValue(qualities.StandardDeviation());
-      ParameterConfigurationParameter.ActualValue.Runs = algorithm.Runs;
+      ParameterConfigurationParameter.ActualValue.Runs = (RunCollection)algorithm.Runs.Clone();
 
       double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
@@ -116,4 +128,16 @@
 
       return base.Apply();
+    }
+
+    private void algorithm_Paused(object sender, EventArgs e) {
+      algorithmStopped = true;
+    }
+
+    private void algorithm_Stopped(object sender, EventArgs e) {
+      algorithmStopped = true;
+    }
+
+    void algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      algorithmExceptionOccured = true;
     }
 
@@ -128,7 +152,5 @@
     }
 
-    void ActualValue_Stopped(object sender, EventArgs e) {
-      algorithmStopped = true;
-    }
+
   }
 }
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 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5184)
@@ -11,5 +11,5 @@
     <RootNamespace>HeuristicLab.Problems.MetaOptimization</RootNamespace>
     <AssemblyName>HeuristicLab.Problems.MetaOptimization-3.3</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
@@ -147,4 +147,5 @@
     <Compile Include="Encoding\ValueConfigurations\ValueConfiguration.cs" />
     <Compile Include="Encoding\ValueConfigurations\CheckedValueConfigurationCollection.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationCrossover.cs" />
     <Compile Include="Interfaces\ICheckedValueConfigurationCollection.cs" />
     <Compile Include="Operators\Crossovers\DiscreteIntValueCrossover.cs" />
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5184)
@@ -18,5 +18,5 @@
     void Mutate(IRandom random, MutateDelegate mutate, ParameterConfigurationManipulator pcmanip);
     void Cross(IRandom random, IOptimizable other, CrossDelegate cross, ParameterConfigurationCrossover pccross);
-    string ToParameterInfoString();
+    string ParameterInfoString { get; }
 
     event EventHandler IsOptimizableChanged;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 5184)
@@ -2,5 +2,5 @@
 
 namespace HeuristicLab.Problems.MetaOptimization {
-  public interface IParameterConfigurationCreator : ISolutionCreator {
+  public interface IParameterConfigurationCreator : ISolutionCreator, IParameterConfigurationOperator {
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs	(revision 5184)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs	(revision 5184)
@@ -0,0 +1,9 @@
+﻿using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfigurationCrossover : ICrossover, IParameterConfigurationOperator {
+    ILookupParameter<ItemArray<ParameterConfigurationTree>> ParentsParameter { get; }
+    ILookupParameter<ParameterConfigurationTree> ChildParameter { get; }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 5184)
@@ -5,4 +5,4 @@
   /// An interface which represents an evaluation operator for Meta Optimization Problems.
   /// </summary>
-  public interface IParameterConfigurationEvaluator : ISingleObjectiveEvaluator {  }
+  public interface IParameterConfigurationEvaluator : ISingleObjectiveEvaluator, IParameterConfigurationOperator { }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5184)
@@ -40,5 +40,5 @@
     public const string ProblemTypeParameterName = "ProblemType";
     public const string ProblemsParameterName = "Problems";
-    public const string ParameterConfigurationTreeParameterName = "ParameterConfigurationTree";
+    public const string ParameterConfigurationTreeParameterName = "InitialParameterConfigurationTree";
     public const string RepetitionsParameterName = "Repetitions";
 
@@ -95,4 +95,7 @@
       set { RepetitionsParameter.Value = value; }
     }
+    private BestParameterConfigurationAnalyzer BestParameterConfigurationAnalyzer {
+      get { return Operators.OfType<BestParameterConfigurationAnalyzer>().FirstOrDefault(); }
+    }
     #endregion
 
@@ -101,5 +104,5 @@
       Parameters.Add(new ValueParameter<ISingleObjectiveProblem>(ProblemTypeParameterName, "The problem type.", new SingleObjectiveTestFunctionProblem()));
       Parameters.Add(new ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<ISingleObjectiveProblem>()));
-      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationTreeParameterName, "List of algorithm parameters that should be optimized."));
+      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)));
 
@@ -109,5 +112,4 @@
       Parameters.Add(new ConstrainedValueParameter<IDoubleValueManipulator>(DoubleValueManipulatorParameterName, "", validDoubleManipulators, new NormalDoubleValueManipulator()));
 
-
       Maximization = new BoolValue(false);
       SolutionCreator = new RandomParameterConfigurationCreator();
@@ -116,4 +118,5 @@
       InitializeOperators();
       RegisterParameterEvents();
+      ParameterizeAnalyzer();
       ParameterizeSolutionCreator();
       ParameterizeEvaluator();
@@ -158,7 +161,16 @@
     }
     private void ParameterizeAnalyzer() {
+      if (BestParameterConfigurationAnalyzer != null) {
+        BestParameterConfigurationAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
     }
     private void ParameterizeOperators() {
-      
+      foreach (IParameterConfigurationCrossover op in Operators.OfType<IParameterConfigurationCrossover>()) {
+        op.ParentsParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+        op.ChildParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      foreach (IParameterConfigurationManipulator op in Operators.OfType<IParameterConfigurationManipulator>()) {
+        op.ParameterConfigurationTreeParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
     }
 
