Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5522)
@@ -44,7 +44,4 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="ALGLIB-2.5.0">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\ALGLIB-2.5.0.dll</HintPath>
-    </Reference>
     <Reference Include="ALGLIB-3.1.0">
       <HintPath>C:\Program Files\HeuristicLab 3.3\ALGLIB-3.1.0.dll</HintPath>
@@ -52,7 +49,4 @@
     <Reference Include="Google.ProtocolBuffers-0.9.1">
       <HintPath>C:\Program Files\HeuristicLab 3.3\Google.ProtocolBuffers-0.9.1.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.ALGLIB-2.5.0">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.ALGLIB-2.5.0.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.ALGLIB-3.1.0">
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5522)
@@ -23,7 +23,24 @@
 using HeuristicLab.Hive.ExperimentManager;
 using System.Threading.Tasks;
+using HeuristicLab.PluginInfrastructure.Manager;
+using System.Reflection;
 
 namespace HeuristicLab.MetaOptimization.Test {
   class Program {
+    static void Main(string[] args) {
+      //PluginLoader.pluginAssemblies.Any();
+      PluginManager pm = new PluginManager(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
+      pm.DiscoverAndCheckPlugins();
+
+      pm.Run(pm.Applications.Where(x => x.Name == "TestApp").SingleOrDefault());
+    }
+  }
+
+  [Plugin("TestPlugin", "1.0.0.0")]
+  [PluginFile("HeuristicLab.MetaOptimization.Test.exe", PluginFileType.Assembly)]
+  public class TestPlugin : PluginBase { }
+
+  [Application("TestApp")]
+  public class TestApp : ApplicationBase {
     //private static int metaAlgorithmPopulationSize = 50;
     //private static int metaAlgorithmMaxGenerations = 30;
@@ -31,16 +48,17 @@
     //private static int baseAlgorithmMaxGenerations = 1000;
 
-    private static int metaAlgorithmPopulationSize = 10;
-    private static int metaAlgorithmMaxGenerations = 10;
+    private static int metaAlgorithmPopulationSize = 20;
+    private static int metaAlgorithmMaxGenerations = 20;
     private static int metaProblemRepetitions = 2;
-    private static int baseAlgorithmMaxGenerations = 20;
+    private static int baseAlgorithmMaxGenerations = 10;
     private static double mutationProbability = 0.10;
 
-    static void Main(string[] args) {
+    public override void Run() {
       ContentManager.Initialize(new PersistenceContentManager());
-      
+
       //TestTableBuilder();
       //TestShorten();
 
+      //TestSimilarities(); return;
       //TestIntSampling();
       //TestDoubleSampling(); return;
@@ -51,5 +69,5 @@
       //TestCombinations3();
       //TestEnumeratorCollectionEnumerator();
-      TestCombinations4(); return;
+      //TestCombinations4(); return;
       //TestAlgorithmPerformanceIssue();
       //TestWaitAny();
@@ -59,5 +77,5 @@
       //TestItemDictionary();
 
-      
+
 
       MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
@@ -87,4 +105,67 @@
     }
 
+    private static void TestSimilarities() {
+      Console.WriteLine("\nDoubleRange:");
+      var doubleRange = new DoubleValueRange(new DoubleValue(0), new DoubleValue(10), new DoubleValue(1));
+      var a = new DoubleValue(5.0);
+
+      for (double d = 0; d < 10; d += 0.1) {
+        var similarity = doubleRange.CalculateSimilarity(a, new DoubleValue(d));
+        Console.WriteLine("{0}: {1}", d, similarity);
+      }
+
+      Console.WriteLine("\nPecentRange:");
+      var percentRange = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(1));
+      var b = new PercentValue(0.05);
+
+      for (double d = 0; d < 1; d += 0.01) {
+        var similarity = percentRange.CalculateSimilarity(b, new PercentValue(d));
+        Console.WriteLine("{0}: {1}", d, similarity);
+      }
+
+      Console.WriteLine("\nIntRange:");
+      var intRange = new IntValueRange(new IntValue(50), new IntValue(100), new IntValue(1));
+      var c = new IntValue(90);
+
+      for (int i = 0; i < 100; i++) {
+        var similarity = intRange.CalculateSimilarity(c, new IntValue(i));
+        Console.WriteLine("{0}: {1}", i, similarity);
+      }
+
+      Console.WriteLine("\nValueConfigurations:");
+      var vc1 = SetupGAAlgorithm(typeof(GeneticAlgorithm), new MetaOptimizationProblem());
+      vc1.ParameterConfigurations.Single(x => x.Name == "Elites").Optimize = true;
+      vc1.ParameterConfigurations.Single(x => x.Name == "PopulationSize").Optimize = true;
+      vc1.ParameterConfigurations.Single(x => x.Name == "MutationProbability").Optimize = true;
+      vc1.ParameterConfigurations.Single(x => x.Name == "Selector").Optimize = true;
+
+      var vc2 = (IValueConfiguration)vc1.Clone();
+      Console.WriteLine("Assert(1): {0}", vc1.CalculateSimilarity(vc2));
+
+      ((IntValue)vc2.ParameterConfigurations.Single(x => x.Name == "PopulationSize").ValueConfigurations[0].ActualValue.Value).Value = 75;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      ((PercentValue)vc2.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.15;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      ((PercentValue)vc2.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.25;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.35;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.45;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.55;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      vc2.ParameterConfigurations.Single(x => x.Name == "Selector").ActualValueConfigurationIndex = 3;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      var random = new Random.MersenneTwister(0);
+      for (int i = 0; i < 10; i++) {
+        vc2.Randomize(random);
+        Console.WriteLine("Randomized: {0}", vc1.CalculateSimilarity(vc2));
+      }
+    }
+
     private static void TestItemDictionary() {
       var dict = new ItemDictionary<StringValue, RunCollection>();
@@ -116,5 +197,5 @@
       using (var sw = new StreamWriter("normalCrossover-IntValue.txt")) {
         for (int i = 0; i < 10000; i++) {
-         sw.WriteLine(NormalIntValueCrossover.ApplyStatic(random, new IntValue(i1), new IntValue(i2), intRange));
+          sw.WriteLine(NormalIntValueCrossover.ApplyStatic(random, new IntValue(i1), new IntValue(i2), intRange));
         }
       }
@@ -557,18 +638,18 @@
         ProblemSize = new IntValue(2)
       });
-      metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
-        Evaluator = new GriewankEvaluator(),
-        ProblemSize = new IntValue(20)
-      });
-      metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
-        Evaluator = new GriewankEvaluator(),
-        ProblemSize = new IntValue(500)
-      });
+      //metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
+      //  Evaluator = new GriewankEvaluator(),
+      //  ProblemSize = new IntValue(20)
+      //});
+      //metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
+      //  Evaluator = new GriewankEvaluator(),
+      //  ProblemSize = new IntValue(500)
+      //});
 
       ConfigurePopulationSize(algorithmVc, 0, 20, 1);
-      //ConfigureMutationRate(algorithmVc, 0.0, 1.0, 0.01);
-      //ConfigureMutationOperator(algorithmVc);
+      ConfigureMutationRate(algorithmVc, 0.0, 1.0, 0.01);
+      ConfigureMutationOperator(algorithmVc);
       ConfigureElites(algorithmVc, 0, 30, 1);
-      //ConfigureSelectionOperator(algorithmVc, true);
+      ConfigureSelectionOperator(algorithmVc, true);
       return algorithmVc;
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5522)
@@ -10,15 +10,9 @@
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F96C8DD1-9B68-4F2D-AD4F-1A174F596041}"
 	ProjectSection(SolutionItems) = preProject
-		HeuristicLab.MetaOptimization.vsmdi = HeuristicLab.MetaOptimization.vsmdi
-		Local.testsettings = Local.testsettings
 		Performance1.psess = Performance1.psess
 		PreBuildEvent.cmd = PreBuildEvent.cmd
-		TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
 	EndProjectSection
 EndProject
 Global
-	GlobalSection(TestCaseManagementSettings) = postSolution
-		CategoryFile = HeuristicLab.MetaOptimization.vsmdi
-	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 5522)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 5522)
@@ -0,0 +1,44 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Analysis;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An operator for analyzing the diversity of solutions of Traveling Salesman Problems given in path representation.
+  /// </summary>
+  [Item("PMOPopulationDiversityAnalyzer", "An operator for analyzing the diversity of solutions of Parameter Meta-Optimization.")]
+  [StorableClass]
+  public sealed class PMOPopulationDiversityAnalyzer : PopulationDiversityAnalyzer<ParameterConfigurationTree> {
+    [StorableConstructor]
+    private PMOPopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
+    private PMOPopulationDiversityAnalyzer(PMOPopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public PMOPopulationDiversityAnalyzer() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOPopulationDiversityAnalyzer(this, cloner);
+    }
+
+    protected override double[,] CalculateSimilarities(ParameterConfigurationTree[] solutions) {
+      int count = solutions.Length;
+      double[,] similarities = new double[count, count];
+
+      for (int i = 0; i < count; i++) {
+        similarities[i, i] = 1;
+        for (int j = i + 1; j < count; j++) {
+          similarities[i, j] = CalculateSimilarity(solutions[i], solutions[j]);
+          similarities[j, i] = similarities[i, j];
+        }
+      }
+      return similarities;
+    }
+
+    private double CalculateSimilarity(ParameterConfigurationTree pca, ParameterConfigurationTree pcb) {
+      return pca.CalculateSimilarity(pcb);
+    }
+  }
+}
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5522)
@@ -493,4 +493,13 @@
       }
     }
+
+    public double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IParameterConfiguration)optimizable;
+      if (this.ActualValueConfigurationIndex == other.ActualValueConfigurationIndex) {
+        return this.ValueConfigurations[this.ActualValueConfigurationIndex].CalculateSimilarity(other.ValueConfigurations[other.ActualValueConfigurationIndex]);
+      } else {
+        return 0.0;
+      }
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs	(revision 5522)
@@ -86,5 +86,5 @@
     #endregion
 
-    void value_ToStringChanged(object sender, EventArgs e) {
+    private void value_ToStringChanged(object sender, EventArgs e) {
       OnToStringChanged();
     }
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5522)
@@ -48,4 +48,10 @@
       return solutions;
     }
+
+    protected override double CalculateSimilarityValue(DoubleValue a, DoubleValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff*2)) / range);
+    }
   }
 }
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5522)
@@ -47,4 +47,10 @@
       return solutions;
     }
+
+    protected override double CalculateSimilarityValue(IntValue a, IntValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
   }
 }
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5522)
@@ -52,4 +52,10 @@
       return solutions;
     }
+
+    protected override double CalculateSimilarityValue(PercentValue a, PercentValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 5522)
@@ -208,4 +208,5 @@
 
     protected abstract T GetRandomSample(IRandom random);
+
     IItem IRange.GetRandomValue(IRandom random) {
       return GetRandomValue(random);
@@ -216,4 +217,10 @@
       return GetCombinations().Cast<IItem>().ToArray();
     }
+
+    public virtual double CalculateSimilarity(IItem a, IItem b) {
+      return CalculateSimilarityValue((T)a, (T)b);
+    }
+
+    protected abstract double CalculateSimilarityValue(T a, T b);
   }
 }
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5522)
@@ -326,4 +326,21 @@
       return list;
     }
+
+    public double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IValueConfiguration)optimizable;
+      if (rangeConstraint != null) {
+        return this.RangeConstraint.CalculateSimilarity(this.ActualValue.Value, other.ActualValue.Value);
+      } else {
+        double sum = 0;
+        int count = 0;
+        for (int i = 0; i < ParameterConfigurations.Count; i++) {
+          if (this.ParameterConfigurations.ElementAt(i).Optimize) {
+            sum += this.ParameterConfigurations.ElementAt(i).CalculateSimilarity(other.ParameterConfigurations.ElementAt(i));
+            count++;
+          }
+        }
+        return count == 0 ? 1.0 : sum / (double)count;
+      }
+    }
   }
 }
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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5522)
@@ -75,4 +75,7 @@
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3">
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
@@ -119,4 +122,7 @@
     <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>
     <Reference Include="HeuristicLab.SequentialEngine-3.3">
@@ -133,4 +139,5 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestParameterConfigurationAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOPopulationDiversityAnalyzer.cs" />
     <Compile Include="ConstrainedTypeValue.cs" />
     <Compile Include="MetaOptimizationUtil.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 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5522)
@@ -20,4 +20,5 @@
     string ParameterInfoString { get; }
     void CollectOptimizedParameterNames(List<string> parameterNames, string prefix);
+    double CalculateSimilarity(IOptimizable optimizable);
 
     /// <summary>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 5522)
@@ -18,4 +18,6 @@
 
     IEnumerable<IItem> GetCombinations();
+
+    double CalculateSimilarity(IItem a, IItem b);
   }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5361)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5522)
@@ -107,4 +107,7 @@
       get { return Operators.OfType<SolutionCacheAnalyzer>().FirstOrDefault(); }
     }
+    private PMOPopulationDiversityAnalyzer PMOPopulationDiversityAnalyzer {
+      get { return Operators.OfType<PMOPopulationDiversityAnalyzer>().FirstOrDefault(); }
+    }    
     #endregion
 
@@ -170,4 +173,5 @@
       Operators.Add(new ReferenceQualityAnalyzer());
       Operators.Add(new SolutionCacheAnalyzer());
+      Operators.Add(new PMOPopulationDiversityAnalyzer());
     }
     private void ParameterizeSolutionCreator() {
@@ -185,4 +189,8 @@
       if (RunsAnalyzer != null) {
         RunsAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      } 
+      if (PMOPopulationDiversityAnalyzer != null) {
+        PMOPopulationDiversityAnalyzer.SolutionParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+        PMOPopulationDiversityAnalyzer.StoreHistoryParameter.Value.Value = true;
       }
     }
