Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/QAPPopulationDiversityAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/QAPPopulationDiversityAnalyzer.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/QAPPopulationDiversityAnalyzer.cs	(revision 15217)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
@@ -27,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.QuadraticAssignment {
@@ -34,6 +36,8 @@
   [Item("QAPPopulationDiversityAnalyzer", "An operator for analyzing the diversity of solutions of Quadratic Assignment Problems regarding their structural identity (number of equal facilty->location assignments).")]
   [StorableClass]
+  [Obsolete("Use the PopulationSimilarityAnalyzer in the HeuristicLab.Analysis plugin instead.")]
+  [NonDiscoverableType]
 #pragma warning disable 0612
-  public sealed class QAPPopulationDiversityAnalyzer : PopulationDiversityAnalyzer<Permutation> {
+  internal sealed class QAPPopulationDiversityAnalyzer : PopulationDiversityAnalyzer<Permutation> {
 #pragma warning restore 0612
     public IValueParameter<BoolValue> UsePhenotypeSimilarityParameter {
@@ -85,5 +89,5 @@
           if (phenotypeSimilarity)
             similarities[i, j] = QAPPermutationProximityCalculator.CalculatePhenotypeSimilarity(solutions[i], solutions[j], weights, distances);
-          else similarities[i, j] = QAPPermutationProximityCalculator.CalculateGenotypeSimilarity(solutions[i], solutions[j]);
+          else similarities[i, j] = HammingSimilarityCalculator.CalculateSimilarity(solutions[i], solutions[j]);
           similarities[j, i] = similarities[i, j];
         }
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPPermutationProximityCalculator.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPPermutationProximityCalculator.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPPermutationProximityCalculator.cs	(revision 15217)
@@ -26,16 +26,4 @@
 namespace HeuristicLab.Problems.QuadraticAssignment {
   public static class QAPPermutationProximityCalculator {
-
-    public static double CalculateGenotypeSimilarity(Permutation a, Permutation b) {
-      int similar = 0;
-      for (int i = 0; i < a.Length; i++) {
-        if (a[i] == b[i]) similar++;
-      }
-      return similar / (double)a.Length;
-    }
-
-    public static double CalculateGenotypeDistance(Permutation a, Permutation b) {
-      return 1.0 - CalculateGenotypeSimilarity(a, b);
-    }
 
     public static double CalculatePhenotypeSimilarity(Permutation a, Permutation b, DoubleMatrix weights, DoubleMatrix distances) {
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPSimilarityCalculator.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPSimilarityCalculator.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPSimilarityCalculator.cs	(revision 15217)
@@ -23,6 +23,8 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.QuadraticAssignment {
@@ -34,9 +36,19 @@
   /// </remarks>
   [Item("QAPSimilarityCalculator", "An operator that performs similarity calculation between two quadratic assignment solutions. The operator calculates the similarity based on the number of edges the two solutions have in common.")]
+  [StorableClass]
   public sealed class QAPSimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator {
     protected override bool IsCommutative { get { return true; } }
 
+    [Storable]
+    public DoubleMatrix Weights { get; set; }
+    [Storable]
+    public DoubleMatrix Distances { get; set; }
+
     private QAPSimilarityCalculator(bool deserializing) : base(deserializing) { }
-    private QAPSimilarityCalculator(QAPSimilarityCalculator original, Cloner cloner) : base(original, cloner) { }
+    private QAPSimilarityCalculator(QAPSimilarityCalculator original, Cloner cloner)
+      : base(original, cloner) {
+      Weights = cloner.Clone(original.Weights);
+      Distances = cloner.Clone(original.Distances);
+    }
     public QAPSimilarityCalculator() : base() { }
 
@@ -45,12 +57,14 @@
     }
 
-    public static double CalculateSimilarity(Permutation left, Permutation right) {
+    public static double CalculateSimilarity(Permutation left, Permutation right, DoubleMatrix weights, DoubleMatrix distances) {
       if (left == null || right == null)
         throw new ArgumentException("Cannot calculate similarity because one of the provided solutions or both are null.");
       if (left.Length != right.Length)
         throw new ArgumentException("Cannot calculate similarity because the provided solutions have different lengths.");
-      if (object.ReferenceEquals(left, right)) return 1.0;
+      if (left.Length == 0)
+        throw new ArgumentException("Cannot calculate similarity because solutions are of length 0.");
+      if (ReferenceEquals(left, right)) return 1.0;
 
-      return QAPPermutationProximityCalculator.CalculateGenotypeSimilarity(left, right);
+      return QAPPermutationProximityCalculator.CalculatePhenotypeSimilarity(left, right, weights, distances);
     }
 
@@ -59,5 +73,5 @@
       var sol2 = rightSolution.Variables[SolutionVariableName].Value as Permutation;
 
-      return CalculateSimilarity(sol1, sol2);
+      return CalculateSimilarity(sol1, sol2, Weights, Distances);
     }
   }
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 15217)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,4 +30,5 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -301,5 +303,4 @@
       Operators.Add(new BestQAPSolutionAnalyzer());
       Operators.Add(new QAPAlleleFrequencyAnalyzer());
-      Operators.Add(new QAPPopulationDiversityAnalyzer());
 
       Operators.Add(new QAPExhaustiveInsertionLocalImprovement());
@@ -308,5 +309,9 @@
       Operators.Add(new QAPExhaustiveSwap2LocalImprovement());
 
+      Operators.Add(new HammingSimilarityCalculator());
       Operators.Add(new QAPSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
       ParameterizeAnalyzers();
       ParameterizeOperators();
@@ -393,8 +398,12 @@
       }
 
-      QAPSimilarityCalculator similarityCalculator = Operators.OfType<QAPSimilarityCalculator>().SingleOrDefault();
-      if (similarityCalculator != null) {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
         similarityCalculator.SolutionVariableName = SolutionCreator.PermutationParameter.ActualName;
         similarityCalculator.QualityVariableName = Evaluator.QualityParameter.ActualName;
+        var qapsimcalc = similarityCalculator as QAPSimilarityCalculator;
+        if (qapsimcalc != null) {
+          qapsimcalc.Weights = Weights;
+          qapsimcalc.Distances = Distances;
+        }
       }
     }
