Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs	(revision 7438)
@@ -41,5 +41,6 @@
     IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator, ITransportationCostsAwareGQAPOperator,
     IOverbookedCapacityPenaltyAwareGQAPOperator, IEquipmentNamesAwareGQAPOperator, ILocationNamesAwareGQAPOperator,
-    IBestKnownQualityAwareGQAPOperator, IBestKnownSolutionAwareGQAPOperator, IAnalyzer {
+    IBestKnownQualityAwareGQAPOperator, IBestKnownSolutionAwareGQAPOperator, IBestKnownSolutionsAwareGQAPOperator,
+    IAnalyzer {
 
     public bool EnabledByDefault {
@@ -47,4 +48,5 @@
     }
 
+    #region Parameter Properties
     public IScopeTreeLookupParameter<IntegerVector> AssignmentParameter {
       get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Assignment"]; }
@@ -98,4 +100,7 @@
       get { return (ILookupParameter<IntegerVector>)Parameters["BestKnownSolution"]; }
     }
+    public ILookupParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter {
+      get { return (ILookupParameter<GQAPAssignmentArchive>)Parameters["BestKnownSolutions"]; }
+    }
     public ILookupParameter<GQAPAssignment> BestSolutionParameter {
       get { return (ILookupParameter<GQAPAssignment>)Parameters["BestSolution"]; }
@@ -104,4 +109,5 @@
       get { return (IValueLookupParameter<ResultCollection>)Parameters["Results"]; }
     }
+    #endregion
 
     [StorableConstructor]
@@ -130,4 +136,5 @@
       Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", GeneralizedQuadraticAssignmentProblem.BestKnownQualityDescription));
       Parameters.Add(new LookupParameter<IntegerVector>("BestKnownSolution", GeneralizedQuadraticAssignmentProblem.BestKnownSolutionDescription));
+      Parameters.Add(new LookupParameter<GQAPAssignmentArchive>("BestKnownSolutions", GeneralizedQuadraticAssignmentProblem.BestKnownSolutionsDescription));
       Parameters.Add(new LookupParameter<GQAPAssignment>("BestSolution", "The best GQAP solution found so far."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best GQAP solution should be stored."));
@@ -152,4 +159,5 @@
       var maximization = MaximizationParameter.ActualValue.Value;
       var bestKnownQuality = BestKnownQualityParameter.ActualValue;
+      var bestKnownSolutions = BestKnownSolutionsParameter.ActualValue;
 
       int bestIndex;
@@ -186,4 +194,15 @@
       }
 
+      GQAPAssignmentArchive archive = BestKnownSolutionsParameter.ActualValue;
+      if (archive == null) {
+        archive = new GQAPAssignmentArchive(equipmentNames, locationNames, distances, weights, installationCosts, demands, capacities, transportationCosts, overbookedCapacityPenalty);
+        BestKnownSolutionsParameter.ActualValue = archive;
+      } else {
+        var solutions = Enumerable.Range(0, assignments.Length)
+        .Select(i => new GQAPSolution(assignments[i], qualities[i], flowDistanceQualities[i], installationQualities[i], overbookedCapacities[i]))
+        .Concat(archive.Solutions);
+        archive.Solutions = GQAPSolutionArchiveUpdater.GetFeasibleParetoFront(solutions);
+      }
+
       return base.Apply();
     }
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPPopulationDiversityAnalyzer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPPopulationDiversityAnalyzer.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPPopulationDiversityAnalyzer.cs	(revision 7438)
@@ -38,8 +38,8 @@
     }
     public new ILookupParameter<BoolValue> MaximizationParameter {
-      get { return MaximizationParameter; }
+      get { return base.MaximizationParameter; }
     }
     public new IScopeTreeLookupParameter<DoubleValue> QualityParameter {
-      get { return QualityParameter; }
+      get { return base.QualityParameter; }
     }
     public IScopeTreeLookupParameter<DoubleValue> FlowDistanceQualityParameter {
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveAnalyzer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveAnalyzer.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveAnalyzer.cs	(revision 7438)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -163,25 +164,8 @@
       }
 
-      ItemList<GQAPSolution> front = new ItemList<GQAPSolution>(archive.Solutions);
-      for (int i = 0; i < assignments.Length; i++) {
-        if (overbookedCapacities[i].Value <= 0.0)
-          front.Add(new GQAPSolution(assignments[i], qualities[i], flowDistanceQualities[i], installationQualities[i], overbookedCapacities[i]));
-      }
-
-      for (int i = 0; i < front.Count - 1; i++) {
-        for (int j = i + 1; j < front.Count; j++) {
-          if (front[i].FlowDistanceQuality.Value < front[j].FlowDistanceQuality.Value
-            && front[i].InstallationQuality.Value < front[j].InstallationQuality.Value) {
-            front.RemoveAt(j);
-            j--;
-          } else if (front[i].FlowDistanceQuality.Value > front[j].FlowDistanceQuality.Value
-            && front[i].InstallationQuality.Value > front[j].InstallationQuality.Value) {
-            front.RemoveAt(i);
-            j = i;
-          }
-        }
-      }
-
-      archive.Solutions = front;
+      var solutions = Enumerable.Range(0, assignments.Length)
+        .Select(i => new GQAPSolution(assignments[i], qualities[i], flowDistanceQualities[i], installationQualities[i], overbookedCapacities[i]))
+        .Concat(archive.Solutions);
+      archive.Solutions = GQAPSolutionArchiveUpdater.GetFeasibleParetoFront(solutions);
 
       return base.Apply();
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveUpdater.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveUpdater.cs	(revision 7438)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/GQAPSolutionArchiveUpdater.cs	(revision 7438)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public static class GQAPSolutionArchiveUpdater {
+    public static ItemList<GQAPSolution> GetFeasibleParetoFront(IEnumerable<GQAPSolution> solutions) {
+      var front = new ItemList<GQAPSolution>(solutions.Where(x => x.OverbookedCapacity.Value <= 0.0));
+
+      for (int i = 0; i < front.Count - 1; i++) {
+        for (int j = i + 1; j < front.Count; j++) {
+          if (front[i].FlowDistanceQuality.Value < front[j].FlowDistanceQuality.Value
+            && front[i].InstallationQuality.Value < front[j].InstallationQuality.Value) {
+            front.RemoveAt(j);
+            j--;
+          } else if (front[i].FlowDistanceQuality.Value > front[j].FlowDistanceQuality.Value
+            && front[i].InstallationQuality.Value > front[j].InstallationQuality.Value) {
+            front.RemoveAt(i);
+            j = i;
+          }
+        }
+      }
+      return front;
+    }
+  }
+}
