Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5023)
@@ -69,5 +69,5 @@
     </Reference>
     <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Algorithms.LocalSearch-3.3">
@@ -96,8 +96,8 @@
     </Reference>
     <Reference Include="HeuristicLab.Collections-3.3">
-      <HintPath>..\..\HeuristicLab.Hive\sources\HeuristicLab.Hive\HeuristicLab.Hive.Slave.Core\3.3\bin\Debug\HeuristicLab.Collections-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Common-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3">
@@ -105,5 +105,5 @@
     </Reference>
     <Reference Include="HeuristicLab.Core-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Core.Views-3.3">
@@ -111,23 +111,26 @@
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Data.Views-3.3">
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.DebugEngine-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.DebugEngine-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, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <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.PermutationEncoding-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Encodings.PermutationEncoding.Views-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding.Views-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding.Views-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.Encodings.SymbolicExpressionTreeEncoding-3.3">
@@ -152,6 +155,6 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Netron-3.0.2672.12446.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Operators.Programmable-3.3">
@@ -164,6 +167,6 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators.Views.GraphVisualization-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Optimization.Operators-3.3">
@@ -174,20 +177,20 @@
     </Reference>
     <Reference Include="HeuristicLab.Optimizer-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Parameters.Views-3.3">
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters.Views-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Persistence.GUI-3.3">
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence.GUI-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Problems.ArtificialAnt-3.3">
@@ -230,4 +233,10 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.Knapsack.Views-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.MetaOptimization-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.MetaOptimization.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization.Views-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.OneMax-3.3">
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.OneMax-3.3.dll</HintPath>
@@ -237,5 +246,5 @@
     </Reference>
     <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Problems.TestFunctions.Views-3.3">
@@ -257,12 +266,12 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.ProtobufCS-0.9.1.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Selection-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Selection-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.SequentialEngine-3.3">
-      <HintPath>..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.SharpDevelop-3.1.1.5327">
@@ -311,14 +320,11 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\WeifenLuo.WinFormsUI.Docking-2.3.1.dll</HintPath>
     </Reference>
+    <Reference Include="ZedGraph">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ZedGraph.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\HeuristicLab.Problems.MetaOptimization\3.3\HeuristicLab.Problems.MetaOptimization-3.3.csproj">
-      <Project>{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}</Project>
-      <Name>HeuristicLab.Problems.MetaOptimization-3.3</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5023)
@@ -12,12 +12,16 @@
 using HeuristicLab.Random;
 using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+using System.IO;
+using HeuristicLab.Problems.TestFunctions;
+using System.Text;
+using HeuristicLab.Selection;
 
 namespace HeuristicLab.MetaOptimization.Test {
   class Program {
-    private static int metaAlgorithmPopulationSize = 20;
-    private static int metaAlgorithmMaxGenerations = 100;
-
-    private static int baseAlgorithmPopulationSize = 20;
-    private static int baseAlgorithmMaxGenerations = 30;
+    private static int metaAlgorithmPopulationSize = 40;
+    private static int metaAlgorithmMaxGenerations = 30;
+
+    private static int baseAlgorithmMaxGenerations = 100;
 
     static void Main(string[] args) {
@@ -31,10 +35,10 @@
       IValueConfiguration algorithmVc = SetupAlgorithm(baseLevelAlgorithm, metaOptimizationProblem);
 
-      Console.WriteLine("Press enter to start");
-      Console.ReadLine();
-      TestConfiguration(algorithmVc, baseLevelAlgorithm);
-
-      Console.WriteLine("Press enter to start");
-      Console.ReadLine();
+      //Console.WriteLine("Press enter to start");
+      //Console.ReadLine();
+      //TestConfiguration(algorithmVc, baseLevelAlgorithm);
+
+      //Console.WriteLine("Press enter to start");
+      //Console.ReadLine();
       TestOptimization(metaLevelAlgorithm);
 
@@ -50,6 +54,8 @@
       Console.ReadLine();
 
+      var clones = new List<object>();
       for (int i = 0; i < 1000; i++) {
         var clone = algorithmVc.Clone();
+        clones.Add(clone);
       }
 
@@ -70,10 +76,16 @@
       metaLevelAlgorithm.Problem = metaOptimizationProblem;
       metaLevelAlgorithm.Engine = new SequentialEngine.SequentialEngine();
+
+      metaLevelAlgorithm.Mutator = new ParameterConfigurationManipulator();
+      metaLevelAlgorithm.MutationProbability.Value = 0.15;
+
       return metaLevelAlgorithm;
     }
 
     private static IValueConfiguration SetupAlgorithm(GeneticAlgorithm baseLevelAlgorithm, MetaOptimizationProblem metaOptimizationProblem) {
-      baseLevelAlgorithm.Problem = new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() { ProblemSize = new IntValue(2000) };
-      baseLevelAlgorithm.PopulationSize.Value = baseAlgorithmPopulationSize;
+      baseLevelAlgorithm.Problem = new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() { 
+        Evaluator = new GriewankEvaluator(),
+        ProblemSize = new IntValue(1000) 
+      };
       baseLevelAlgorithm.MaximumGenerations.Value = baseAlgorithmMaxGenerations;
 
@@ -85,9 +97,11 @@
       ConfigureMutationRate(algorithmVc);
       ConfigureMutationOperator(algorithmVc);
+      ConfigureElites(algorithmVc);
+      ConfigureSelectionOperator(algorithmVc);
       return algorithmVc;
     }
 
     private static void TestConfiguration(IValueConfiguration algorithmVc, GeneticAlgorithm baseLevelAlgorithm) {
-      IRandom rand = new MersenneTwister();
+      IRandom rand = new FastRandom(0);
       // set random values
       for (int i = 0; i < 10; i++) {
@@ -99,6 +113,12 @@
         Console.WriteLine(string.Format("MutRate: original: {0}, randomized: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
         Console.WriteLine(string.Format("MutOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
-      }
-
+        Console.WriteLine(string.Format("SelOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
+        Console.WriteLine(string.Format("GrSi: original: {0}, randomized: {1}", "?", ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+
+      Console.WriteLine("=======================");
+      algorithmVc.Randomize(rand);
+      algorithmVc.Parameterize(baseLevelAlgorithm);
       // mutate
       for (int i = 0; i < 10; i++) {
@@ -110,27 +130,41 @@
         Console.WriteLine(string.Format("MutRate: original: {0}, mutated: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
         Console.WriteLine(string.Format("MutOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
-      }
-
+        Console.WriteLine(string.Format("SelOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
+        Console.WriteLine(string.Format("GrSi: original: {0}, mutated: {1}", ((TournamentSelector)baseLevelAlgorithm.Selector).GroupSizeParameter.Value, ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+
+      Console.WriteLine("=======================");
       // cross
       for (int i = 0; i < 10; i++) {
         IValueConfiguration clonedVc1 = (IValueConfiguration)algorithmVc.Clone();
+        IValueConfiguration clonedVc2 = (IValueConfiguration)algorithmVc.Clone();
+
+        GeneticAlgorithm first = (GeneticAlgorithm)clonedVc1.ActualValue.Value.Clone();
+        GeneticAlgorithm second = (GeneticAlgorithm)clonedVc2.ActualValue.Value.Clone();
+
         clonedVc1.Randomize(rand);
-        clonedVc1.Parameterize(baseLevelAlgorithm);
-
-        IValueConfiguration clonedVc2 = (IValueConfiguration)algorithmVc.Clone();
-        GeneticAlgorithm first = (GeneticAlgorithm)clonedVc1.ActualValue.Value;
-        GeneticAlgorithm second = (GeneticAlgorithm)clonedVc2.ActualValue.Value;
+        clonedVc1.Parameterize(first);
+
+        clonedVc2.Randomize(rand);
+        clonedVc2.Parameterize(second);
 
         var popSizeBefore = first.PopulationSize.Value;
         var mutRateBefore = first.MutationProbability.Value;
         var mutOpBefore = first.Mutator;
+        var selOpBefore = first.Selector;
+        var groupSizeBefore = ((TournamentSelector)first.Selector).GroupSizeParameter.Value.Value;
 
         clonedVc1.Cross(clonedVc2, rand);
-        clonedVc1.Parameterize((GeneticAlgorithm)clonedVc2.ActualValue.Value);
+        clonedVc1.Parameterize(first);
 
         Console.WriteLine(string.Format("PopSize: first: {0}, second: {1}, crossed: {2}", popSizeBefore, second.PopulationSize, first.PopulationSize));
         Console.WriteLine(string.Format("MutRate: first: {0}, second: {1}, crossed: {2}", mutRateBefore, second.MutationProbability, first.MutationProbability));
-        Console.WriteLine(string.Format("MutRate: first: {0}, second: {1}, crossed: {2}", mutOpBefore, second.Mutator, first.Mutator));
-      }
+        Console.WriteLine(string.Format("MutOp: first: {0}, second: {1}, crossed: {2}", mutOpBefore, second.Mutator, first.Mutator));
+        Console.WriteLine(string.Format("SelOp: first: {0}, second: {1}, crossed: {2}", selOpBefore, second.Selector, first.Selector));
+        Console.WriteLine(string.Format("GrSi: first: {0}, second: {1}, crossed: {2}", groupSizeBefore, ((TournamentSelector)second.Selector).GroupSizeParameter.Value, ((TournamentSelector)first.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+      Console.WriteLine("=======================");
     }
 
@@ -144,4 +178,29 @@
         mutationOperator.ValueConfigurations.SetItemCheckedState(multiMutator, false);
       }
+    }
+
+    private static void ConfigureSelectionOperator(IValueConfiguration algorithmVc) {
+      var selectionOperatorPc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Selector").SingleOrDefault();
+      selectionOperatorPc.Optimize = true;
+
+      foreach (var vc in selectionOperatorPc.ValueConfigurations) {
+        if (vc.ActualValue.ValueDataType == typeof(TournamentSelector)) {
+          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
+          vc.Optimize = true;
+          ConfigureTournamentGroupSize(vc);
+        } else {
+          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, false);
+        }
+      }
+    }
+
+    private static void ConfigureTournamentGroupSize(IValueConfiguration tournamentVc) {
+      var groupSizePc = tournamentVc.ParameterConfigurations.Where(x => x.ParameterName == "GroupSize").SingleOrDefault();
+      groupSizePc.Optimize = true;
+
+      groupSizePc.ValueConfigurations.First().Optimize = true;
+      groupSizePc.ValueConfigurations.First().RangeConstraint.LowerBound = new IntValue(0);
+      groupSizePc.ValueConfigurations.First().RangeConstraint.UpperBound = new IntValue(100);
+      groupSizePc.ValueConfigurations.First().RangeConstraint.StepSize = new IntValue(1);
     }
 
@@ -151,5 +210,5 @@
       var populationSizeVc = populationSizePc.ValueConfigurations.First();
       populationSizeVc.Optimize = true;
-      populationSizeVc.RangeConstraint.LowerBound = new IntValue(0);
+      populationSizeVc.RangeConstraint.LowerBound = new IntValue(20);
       populationSizeVc.RangeConstraint.UpperBound = new IntValue(100);
       populationSizeVc.RangeConstraint.StepSize = new IntValue(1);
@@ -166,28 +225,70 @@
     }
 
+    private static void ConfigureElites(IValueConfiguration algorithmVc) {
+      var elitesPc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Elites").SingleOrDefault();
+      elitesPc.Optimize = true;
+      var elitesVc = elitesPc.ValueConfigurations.First();
+      elitesVc.Optimize = true;
+      elitesVc.RangeConstraint.LowerBound = new IntValue(0);
+      elitesVc.RangeConstraint.UpperBound = new IntValue(20);
+      elitesVc.RangeConstraint.StepSize = new IntValue(1);
+    }
+
     private static void TestOptimization(GeneticAlgorithm metaLevelAlgorithm) {
-      metaLevelAlgorithm.Start();
-      do {
-        Thread.Sleep(1000);
-        Console.Clear();
-        try {
-          foreach (var result in metaLevelAlgorithm.Results) {
-            Console.WriteLine(result.ToString());
-            if (result.Name == "Population") {
-              RunCollection rc = (RunCollection)result.Value;
-              var orderedRuns = rc.OrderBy(x => x.Results["BestQuality"]);
-              foreach (IRun run in orderedRuns) {
-                Console.WriteLine("Q: {0} PoSi: {1} MuRa: {2} MuOp: {3}",
-                  ((DoubleValue)run.Results["BestQuality"]).Value.ToString("0.00").PadLeft(4, ' '),
-                  ((IntValue)run.Parameters["PopulationSize"]).Value.ToString().PadLeft(3, ' '),
-                  ((DoubleValue)run.Parameters["MutationProbability"]).Value.ToString("0.00").PadRight(3, ' '),
-                  run.Parameters["Mutator"]);
-              }
-            }
+      ContentManager.Initialize(new PersistenceContentManager());
+      string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Results");
+      if(!Directory.Exists(path))
+        Directory.CreateDirectory(path);
+      string id = DateTime.Now.ToString("MM.dd.yy - HH;mm;ss,ffff");
+      string resultPath = Path.Combine(path, string.Format("Test - {0} - Result.hl", id));
+      string outputPath = Path.Combine(path, string.Format("Test - {0} - Console.txt", id));
+
+      using (var sw = new StreamWriter(outputPath)) {
+        metaLevelAlgorithm.Start();
+        int i = 0;
+        int currentGeneration = -1;
+        do {
+          Thread.Sleep(500);
+          try {
+            if (metaLevelAlgorithm.Results.ContainsKey("Generations") && ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value != currentGeneration) {
+              StringBuilder sb = new StringBuilder();
+              sb.AppendLine(DateTime.Now.ToLongTimeString());
+              sb.AppendLine("=================================");
+
+              foreach (var result in metaLevelAlgorithm.Results) {
+                sb.AppendLine(result.ToString());
+                if (result.Name == "Population") {
+                  RunCollection rc = (RunCollection)result.Value;
+                  var orderedRuns = rc.OrderBy(x => x.Results["BestQuality"]);
+                  
+                  sb.AppendLine("Qality PoSi MutRa Eli GrSi MutOp");
+                  foreach (IRun run in orderedRuns) {
+                    sb.AppendLine(string.Format("{0} {1} {2} {3} {4} {5}",
+                      ((DoubleValue)run.Results["BestQuality"]).Value.ToString("#0.00").PadLeft(7, ' '),
+                      ((IntValue)run.Parameters["PopulationSize"]).Value.ToString().PadLeft(3, ' ').PadRight(3, ' '),
+                      ((DoubleValue)run.Parameters["MutationProbability"]).Value.ToString("0.00").PadLeft(5, ' '),
+                      ((IntValue)run.Parameters["Elites"]).Value.ToString().PadLeft(3, ' '),
+                      ((TournamentSelector)run.Parameters["Selector"]).GroupSizeParameter.Value.ToString().PadLeft(4, ' '),
+                      run.Parameters["Mutator"]));
+                  }
+                }
+              } // foreach
+              Console.Clear();
+              Console.WriteLine(sb.ToString());
+              sw.WriteLine(sb.ToString());
+              sw.Flush();
+              currentGeneration = ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value;
+            } // if
+            if (i % 30 == 0) GC.Collect();
+            i++;
           }
-        }
-        catch { }
-      } while (metaLevelAlgorithm.ExecutionState != ExecutionState.Stopped);
-
+          catch { }
+        } while (metaLevelAlgorithm.ExecutionState != ExecutionState.Stopped);
+      }
+
+      Console.WriteLine();
+      Console.WriteLine("Storing...");
+
+      ContentManager.Save(metaLevelAlgorithm, resultPath, true);
       Console.WriteLine("Finished");
     }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5023)
@@ -56,5 +56,6 @@
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|x86.ActiveCfg = Debug|x86
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|x86.Build.0 = Debug|x86
-		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Any CPU.ActiveCfg = Release|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Any CPU.Build.0 = Release|Any CPU
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Mixed Platforms.ActiveCfg = Release|x86
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Mixed Platforms.Build.0 = Release|x86
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5023)
@@ -55,5 +55,5 @@
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3">
-      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Data.Views-3.3">
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 5023)
@@ -17,5 +17,4 @@
   [StorableClass]
   public sealed class BestParameterConfigurationAnalyzer : SingleSuccessorOperator, IAnalyzer {
-    // Wagner: Spezielle View für die Lösungen (ParameterConfigurations): So wie bei Runs: die zu Optimierenden Parameter(-werte) der besten solution anzeigen
 
     public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
@@ -62,12 +61,13 @@
       ResultCollection results = ResultsParameter.ActualValue;
       DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
-      ItemArray<ParameterConfigurationTree> parameterConfigurations = ParameterConfigurationParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
 
       int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
 
-      EngineAlgorithm bestAlg = ((EngineAlgorithm)((ParameterConfigurationTree)parameterConfigurations[i]).ActualValue.Value);
+      EngineAlgorithm bestAlg = ((EngineAlgorithm)((ParameterConfigurationTree)parameterTrees[i]).ActualValue.Value);
       Run bestRun = new Run(bestAlg);
+      ((ParameterConfigurationTree)parameterTrees[i]).CollectResultValues(bestRun.Results);
 
-      if (bestKnownQuality == null || qualities[i].Value < bestKnownQuality.Value) {
+      if (bestKnownQuality == null || qualities[i].Value < bestKnownQuality.Value) { // todo: respect Maximization:true/false
         BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
         BestKnownSolutionParameter.ActualValue = bestRun;
@@ -83,10 +83,11 @@
       }
 
+      // population
       RunCollection rc = new RunCollection();
-      
-      foreach (ParameterConfigurationTree pc in parameterConfigurations.OrderBy(x => x.Quality.Value*-1)) {
-        IAlgorithm alg = (IAlgorithm)pc.ActualValue.Value;
+      foreach (ParameterConfigurationTree pt in parameterTrees.OrderByDescending(x => x.BestQuality.Value)) { // todo: respect Maximization:true/false
+        IAlgorithm alg = (IAlgorithm)pt.ActualValue.Value;
         alg.StoreAlgorithmInEachRun = false;
         IRun run = new Run(alg);
+        pt.CollectResultValues(run.Results);
         rc.Add(run);
       }
@@ -98,5 +99,4 @@
         results["Population"].Value = rc;
       }
-      GC.Collect();
 
       return base.Apply();
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurationTree.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurationTree.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurationTree.cs	(revision 5023)
@@ -13,27 +13,21 @@
   [StorableClass]
   public class ParameterConfigurationTree : ValueConfiguration {
-    //[Storable]
-    //protected EngineAlgorithm algorithm;
-    //public EngineAlgorithm Algorithm {
-    //  get { return algorithm; }
-    //  set {
-    //    if (algorithm != value) {
-    //      if (algorithm != null) DeregisterAlgorithmEvents();
-    //      algorithm = value;
-    //      if (algorithm != null) RegisterAlgorithmEvents();
-    //      OnAlgorithmChanged();
-    //    }
-    //  }
-    //}
+    [Storable]
+    public EngineAlgorithm Algorithm {
+      get { return (EngineAlgorithm)base.ActualValue.Value; }
+      set {
+        base.ActualValue.Value = value;
+      }
+    }
 
     [Storable]
-    private DoubleValue quality;
-    public DoubleValue Quality {
-      get { return quality; }
+    private DoubleValue bestQuality;
+    public DoubleValue BestQuality {
+      get { return bestQuality; }
       set {
-        if (quality != value) {
-          if (quality != null) DeregisterQualityEvents();
-          quality = value;
-          if (quality != null) RegisterQualityEvents();
+        if (bestQuality != value) {
+          if (bestQuality != null) DeregisterQualityEvents();
+          bestQuality = value;
+          if (bestQuality != null) RegisterQualityEvents();
           OnQualityChanged();
         }
@@ -41,9 +35,53 @@
     }
 
+    [Storable]
+    private DoubleValue averageQuality;
+    public DoubleValue AverageQuality {
+      get { return averageQuality; }
+      set { averageQuality = value; }
+    }
+
+    [Storable]
+    private DoubleValue worstQuality;
+    public DoubleValue WorstQuality {
+      get { return worstQuality; }
+      set { worstQuality = value; }
+    }
+    
+    [Storable]
+    private DoubleValue qualityVariance;
+    public DoubleValue QualityVariance {
+      get { return qualityVariance; }
+      set { qualityVariance = value; }
+    }
+    
+    [Storable]
+    private DoubleValue qualityStandardDeviation;
+    public DoubleValue QualityStandardDeviation {
+      get { return qualityStandardDeviation; }
+      set { qualityStandardDeviation = value; }
+    }
+    
+    [Storable]
+    private TimeSpanValue averageExecutionTime;
+    public TimeSpanValue AverageExecutionTime {
+      get { return averageExecutionTime; }
+      set { averageExecutionTime = value; }
+    }
+
+    [Storable]
+    private IntValue repetitions;
+    public IntValue Repetitions {
+      get { return repetitions; }
+      set { repetitions = value; }
+    }
+
+    [Storable]
+    public RunCollection Runs { get; set; }
+    
     #region constructors and cloning
     public ParameterConfigurationTree(EngineAlgorithm algorithm) : base(algorithm, algorithm.GetType()) {
       this.Optimize = true; // root must always be optimized
-      this.Quality = new DoubleValue();
-      //this.algorithm = algorithm;
+      this.BestQuality = new DoubleValue();
     }
     public ParameterConfigurationTree() {
@@ -53,5 +91,7 @@
     protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
     protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner) : base(original, cloner) {
-      this.quality = cloner.Clone(original.Quality);
+      this.bestQuality = cloner.Clone(original.BestQuality);
+      this.Algorithm.Prepare();
+      this.Algorithm.Runs.Clear();
       Initialize();
     }
@@ -67,5 +107,16 @@
     private void Initialize() {
       //if (algorithm != null) RegisterAlgorithmEvents();
-      if (quality != null) RegisterQualityEvents();
+      if (bestQuality != null) RegisterQualityEvents();
+    }
+
+    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
+      values.Add("RunsAverageExecutionTime", AverageExecutionTime);
+      values.Add("Repetitions", Repetitions);
+      values.Add("RunsBestQuality", BestQuality);
+      values.Add("RunsAverageQuality", AverageQuality);
+      values.Add("RunsWorstQuality", WorstQuality);
+      values.Add("RunsQualityVariance", QualityVariance);
+      values.Add("RunsQualityStandardDeviation", QualityStandardDeviation);
+      values.Add("Runs", Runs);
     }
 
@@ -89,8 +140,8 @@
     //}
     private void RegisterQualityEvents() {
-      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+      BestQuality.ValueChanged += new EventHandler(Quality_ValueChanged);
     }
     private void DeregisterQualityEvents() {
-      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+      BestQuality.ValueChanged -= new EventHandler(Quality_ValueChanged);
     }
 
@@ -99,4 +150,5 @@
     }
     #endregion
+
   }
 }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 5023)
@@ -127,4 +127,5 @@
       this.ActualValue = cloner.Clone(original.ActualValue);
       this.optimize = original.optimize;
+      this.actualValueConfigurationIndex = original.actualValueConfigurationIndex;
       if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
     }
@@ -270,5 +271,10 @@
 
     public void Parameterize(IValueParameter parameter) {
-      parameter.ActualValue = this.ActualValue.Value;
+      if (Optimize) {
+        if (this.ActualValue.Value is IParameterizedItem) {
+          this.ValueConfigurations.CheckedItems.ElementAt(actualValueConfigurationIndex).Parameterize((IParameterizedItem)this.ActualValue.Value);
+        }
+      }
+      parameter.Value = this.ActualValue.Value;
     }
 
@@ -298,4 +304,7 @@
           this.ValueConfigurations.ElementAt(i).Cross(otherPc.ValueConfigurations.ElementAt(i), random);
         }
+        if (random.NextDouble() > 0.5) {
+          actualValueConfigurationIndex = ((ParameterConfiguration)other).actualValueConfigurationIndex;
+        }
         this.ActualValue = this.ValueConfigurations.CheckedItems.ElementAt(actualValueConfigurationIndex).ActualValue;
       }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/DoubleValueRange.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/DoubleValueRange.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/DoubleValueRange.cs	(revision 5023)
@@ -21,5 +21,5 @@
     }
 
-    public override DoubleValue GetRandomValue(IRandom random) {
+    protected override DoubleValue GetRandomSample(IRandom random) {
       double val;
       do {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/IntValueRange.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/IntValueRange.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/IntValueRange.cs	(revision 5023)
@@ -21,5 +21,5 @@
     }
 
-    public override IntValue GetRandomValue(IRandom random) {
+    protected override IntValue GetRandomSample(IRandom random) {
       int val;
       do {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/PercentValueRange.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/PercentValueRange.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/PercentValueRange.cs	(revision 5023)
@@ -21,5 +21,5 @@
     }
 
-    public override PercentValue GetRandomValue(IRandom random) {
+    protected override PercentValue GetRandomSample(IRandom random) {
       double val;
       do {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/Range.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/Range.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/Range.cs	(revision 5023)
@@ -191,5 +191,19 @@
     #endregion
 
-    public abstract T GetRandomValue(IRandom random);
+    public T GetRandomValue(IRandom random) {
+      // by a chance return the extreme values of this range to intensify search in those regions
+      if (random.NextDouble() < 0.1) {
+        if (random.NextDouble() < 0.5) {
+          return LowerBound;
+        } else {
+          return UpperBound;
+        }
+      }
+
+      // otherwise sample a random value from the range
+      return GetRandomSample(random);
+    }
+
+    protected abstract T GetRandomSample(IRandom random);
 
     IItem IRange.GetRandomValue(IRandom random) {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 5023)
@@ -6,4 +6,6 @@
 using HeuristicLab.Data;
 using System.Drawing;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -92,5 +94,6 @@
     [StorableConstructor]
     protected ValueConfiguration(bool deserializing) { }
-    protected ValueConfiguration(ValueConfiguration original, Cloner cloner) : base(original, cloner) {
+    protected ValueConfiguration(ValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
       this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
       this.actualValue = cloner.Clone(original.ActualValue);
@@ -228,22 +231,43 @@
         if (rangeConstraint != null) {
           if (this.actualValue.ValueDataType == typeof(IntValue)) {
-            this.actualValue.Value = new IntValue((((IntValue)this.actualValue.Value).Value + ((IntValue)other.ActualValue.Value).Value) / 2);
+            //this.actualValue.Value = new IntValue((((IntValue)this.actualValue.Value).Value + ((IntValue)other.ActualValue.Value).Value) / 2);
+
+            IntegerVector[] parents = new IntegerVector[2];
+            parents[0] = new IntegerVector(new int[] { ((IntValue)this.actualValue.Value).Value });
+            parents[1] = new IntegerVector(new int[] { ((IntValue)other.ActualValue.Value).Value });
+
+            this.actualValue.Value = new IntValue(HeuristicLab.Encodings.IntegerVectorEncoding.DiscreteCrossover.Apply(random, parents[0], parents[1]).First());
+
           } else if (this.actualValue.ValueDataType == typeof(DoubleValue)) {
-            this.actualValue.Value = new DoubleValue((((DoubleValue)this.actualValue.Value).Value + ((DoubleValue)other.ActualValue.Value).Value) / 2);
+            //this.actualValue.Value = new DoubleValue((((DoubleValue)this.actualValue.Value).Value + ((DoubleValue)other.ActualValue.Value).Value) / 2);
+            RealVector[] parents = new RealVector[2];
+            parents[0] = new RealVector( new double[] {((DoubleValue)this.actualValue.Value).Value} );
+            parents[1] = new RealVector( new double[] {((DoubleValue)other.ActualValue.Value).Value} );
+
+            if (random.NextDouble() < 0.5) {
+              this.actualValue.Value = new DoubleValue(AverageCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
+            } else {
+              this.actualValue.Value = new DoubleValue(HeuristicLab.Encodings.RealVectorEncoding.DiscreteCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
+            }
+            //this.actualValue.Value = new DoubleValue(AverageCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
+            
           } else if (this.actualValue.ValueDataType == typeof(PercentValue)) {
-            this.actualValue.Value = new PercentValue((((PercentValue)this.actualValue.Value).Value + ((PercentValue)other.ActualValue.Value).Value) / 2);
+            //this.actualValue.Value = new PercentValue((((PercentValue)this.actualValue.Value).Value + ((PercentValue)other.ActualValue.Value).Value) / 2);
+
+            RealVector[] parents = new RealVector[2];
+            parents[0] = new RealVector(new double[] { ((PercentValue)this.actualValue.Value).Value });
+            parents[1] = new RealVector(new double[] { ((PercentValue)other.ActualValue.Value).Value });
+
+            if (random.NextDouble() < 0.5) {
+              this.actualValue.Value = new PercentValue(AverageCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
+            } else {
+              this.actualValue.Value = new PercentValue(HeuristicLab.Encodings.RealVectorEncoding.DiscreteCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
+            }
+
           } else if (this.actualValue.ValueDataType == typeof(BoolValue)) {
-            bool first = ((BoolValue)this.actualValue.Value).Value;
-            bool second = ((BoolValue)other.ActualValue.Value).Value;
-            if (first && second) {
-              this.actualValue.Value = new BoolValue(true);
-            } else if (!first && !second) {
-              this.actualValue.Value = new BoolValue(false);
-            } else {
-              if (random.NextDouble() > 0.5)
-                this.actualValue.Value = new BoolValue(true);
-              else
-                this.actualValue.Value = new BoolValue(false);
-            }
+            if (random.NextDouble() > 0.5)
+              this.actualValue.Value = this.actualValue.Value;
+            else
+              this.actualValue.Value = other.ActualValue.Value;
           } else {
             throw new NotImplementedException();
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 5023)
@@ -1,3 +1,4 @@
 ﻿using System;
+using System.Linq;
 using System.Threading;
 using HeuristicLab.Common;
@@ -8,4 +9,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -69,26 +71,47 @@
       algorithm.Stopped += new EventHandler(ActualValue_Stopped);
 
-      double qualitySum = 0;
+      List<double> qualities = new List<double>();
+      List<TimeSpan> executionTimes = new List<TimeSpan>();
+      algorithm.Prepare(true);
 
-      //foreach (ISingleObjectiveProblem problem in ProblemsParameter.ActualValue) {
-      algorithm.Engine = new SequentialEngine.SequentialEngine();
-      //algorithm.Problem = problem;
-      algorithm.Prepare();
-      algorithm.Start();
-      while (!algorithmStopped) {
-        Thread.Sleep(1000); // 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)
+      for (int i = 0; i < Repetitions.Value; i++) {
+        algorithm.Engine = new SequentialEngine.SequentialEngine();
+        algorithm.Prepare();
+        algorithm.Start();
+        while (!algorithmStopped) {
+          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);
+
+        algorithmStopped = false;
       }
-      double quality = ((DoubleValue)algorithm.Results["BestQuality"].Value).Value;
-      ParameterConfigurationParameter.ActualValue.Quality.Value = quality;
-      qualitySum += quality;
-      //}
-
       algorithm.Stopped -= new EventHandler(ActualValue_Stopped);
 
-      //double qualityAvg = qualitySum / ProblemsParameter.ActualValue.Count;
-      //this.QualityParameter.ActualValue = new DoubleValue(qualityAvg);
+      qualities = qualities.OrderBy(x => x).ToList();  // todo: respect Maximization:true/false
+      
+      ParameterConfigurationParameter.ActualValue.AverageExecutionTime = new TimeSpanValue(TimeSpan.FromMilliseconds(executionTimes.Average(t => t.TotalMilliseconds)));
+      ParameterConfigurationParameter.ActualValue.Repetitions = Repetitions;
+      ParameterConfigurationParameter.ActualValue.BestQuality = new DoubleValue(qualities.First());
+      ParameterConfigurationParameter.ActualValue.AverageQuality = new DoubleValue(qualities.Average());
+      ParameterConfigurationParameter.ActualValue.WorstQuality = new DoubleValue(qualities.Last());
+      ParameterConfigurationParameter.ActualValue.QualityVariance = new DoubleValue(qualities.Variance());
+      ParameterConfigurationParameter.ActualValue.QualityStandardDeviation = new DoubleValue(qualities.StandardDeviation());
+      ParameterConfigurationParameter.ActualValue.Runs = algorithm.Runs;
+
+      double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
       this.QualityParameter.ActualValue = new DoubleValue(quality);
+      
+      return base.Apply();
+    }
 
-      return base.Apply();
+    public static double Variance(IEnumerable<double> source) {
+      double avg = source.Average();
+      double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
+      return d / (source.Count() - 1);
+    }
+
+    public static double StandardDeviation(IEnumerable<double> source) {
+      return Math.Sqrt(source.Variance());
     }
 
@@ -96,14 +119,4 @@
       algorithmStopped = true;
     }
-
-    //private void ParameterizeAlgorithm() {
-    //  foreach (IParameterConfiguration parameter in ParameterVectorParameter.ActualValue) {
-    //    if (typeof(IAlgorithm).IsAssignableFrom(parameter.OperatorType)) {
-    //      this.AlgorithmParameter.ActualValue.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
-    //    } else if (typeof(IProblem).IsAssignableFrom(parameter.OperatorType)) {
-    //      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 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5023)
@@ -91,4 +91,5 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestParameterConfigurationAnalyzer.cs" />
+    <None Include="ClassDiagram1.cd" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <None Include="HeuristicLabProblemsMetaOptimizationPlugin.cs.frame" />
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5022)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5023)
@@ -15,5 +15,5 @@
     void Mutate(IRandom random);
     void Cross(IOptimizable other, IRandom random);
-
+    
     event EventHandler IsOptimizableChanged;
     event EventHandler OptimizeChanged;
