Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASPWithPathRelinking.cs	(revision 7438)
@@ -215,4 +215,5 @@
             param.Depth = 1;
           Analyzer.Operators.Add(a);
+          Analyzer.Operators.SetItemCheckedState(a, a.EnabledByDefault);
         }
         InitializeFromInstallation(LocalImprovementParameter, x => x.ProblemType.IsAssignableFrom(Problem.GetType()));
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentArchiveView.Designer.cs	(revision 7438)
@@ -56,7 +56,5 @@
       chartArea1.AxisX.Title = "FlowDistanceQuality";
       chartArea1.AxisY.Title = "InstallationQuality";
-      chartArea1.CursorX.IsUserEnabled = true;
       chartArea1.CursorX.IsUserSelectionEnabled = true;
-      chartArea1.CursorY.IsUserEnabled = true;
       chartArea1.CursorY.IsUserSelectionEnabled = true;
       chartArea1.Name = "ChartArea1";
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.Designer.cs	(revision 7438)
@@ -50,10 +50,10 @@
       this.assignmentGroupBox = new System.Windows.Forms.GroupBox();
       this.characteristicsGroupBox = new System.Windows.Forms.GroupBox();
+      this.label7 = new System.Windows.Forms.Label();
+      this.overbookedCapacityLabel = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.installationQualityLabel = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
       this.flowDistanceQualityLabel = new System.Windows.Forms.Label();
-      this.label3 = new System.Windows.Forms.Label();
-      this.installationQualityLabel = new System.Windows.Forms.Label();
-      this.label5 = new System.Windows.Forms.Label();
-      this.overbookedCapacityLabel = new System.Windows.Forms.Label();
-      this.label7 = new System.Windows.Forms.Label();
       this.assignmentGroupBox.SuspendLayout();
       this.characteristicsGroupBox.SuspendLayout();
@@ -70,4 +70,6 @@
       this.assignmentTreeView.Size = new System.Drawing.Size(228, 331);
       this.assignmentTreeView.TabIndex = 3;
+      this.assignmentTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.assignmentTreeView_AfterSelect);
+      this.assignmentTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.assignmentTreeView_MouseUp);
       // 
       // label1
@@ -123,4 +125,54 @@
       this.characteristicsGroupBox.Text = "Characteristics";
       // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(6, 76);
+      this.label7.Margin = new System.Windows.Forms.Padding(3);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(71, 13);
+      this.label7.TabIndex = 0;
+      this.label7.Text = "Overbooking:";
+      // 
+      // overbookedCapacityLabel
+      // 
+      this.overbookedCapacityLabel.AutoSize = true;
+      this.overbookedCapacityLabel.Location = new System.Drawing.Point(91, 76);
+      this.overbookedCapacityLabel.Margin = new System.Windows.Forms.Padding(3);
+      this.overbookedCapacityLabel.Name = "overbookedCapacityLabel";
+      this.overbookedCapacityLabel.Size = new System.Drawing.Size(10, 13);
+      this.overbookedCapacityLabel.TabIndex = 4;
+      this.overbookedCapacityLabel.Text = "-";
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(6, 57);
+      this.label5.Margin = new System.Windows.Forms.Padding(3);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(60, 13);
+      this.label5.TabIndex = 0;
+      this.label5.Text = "Installation:";
+      // 
+      // installationQualityLabel
+      // 
+      this.installationQualityLabel.AutoSize = true;
+      this.installationQualityLabel.Location = new System.Drawing.Point(91, 57);
+      this.installationQualityLabel.Margin = new System.Windows.Forms.Padding(3);
+      this.installationQualityLabel.Name = "installationQualityLabel";
+      this.installationQualityLabel.Size = new System.Drawing.Size(10, 13);
+      this.installationQualityLabel.TabIndex = 4;
+      this.installationQualityLabel.Text = "-";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(6, 38);
+      this.label3.Margin = new System.Windows.Forms.Padding(3);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(79, 13);
+      this.label3.TabIndex = 0;
+      this.label3.Text = "Flow/Distance:";
+      // 
       // flowDistanceQualityLabel
       // 
@@ -132,54 +184,4 @@
       this.flowDistanceQualityLabel.TabIndex = 4;
       this.flowDistanceQualityLabel.Text = "-";
-      // 
-      // label3
-      // 
-      this.label3.AutoSize = true;
-      this.label3.Location = new System.Drawing.Point(6, 38);
-      this.label3.Margin = new System.Windows.Forms.Padding(3);
-      this.label3.Name = "label3";
-      this.label3.Size = new System.Drawing.Size(79, 13);
-      this.label3.TabIndex = 0;
-      this.label3.Text = "Flow/Distance:";
-      // 
-      // installationQualityLabel
-      // 
-      this.installationQualityLabel.AutoSize = true;
-      this.installationQualityLabel.Location = new System.Drawing.Point(91, 57);
-      this.installationQualityLabel.Margin = new System.Windows.Forms.Padding(3);
-      this.installationQualityLabel.Name = "installationQualityLabel";
-      this.installationQualityLabel.Size = new System.Drawing.Size(10, 13);
-      this.installationQualityLabel.TabIndex = 4;
-      this.installationQualityLabel.Text = "-";
-      // 
-      // label5
-      // 
-      this.label5.AutoSize = true;
-      this.label5.Location = new System.Drawing.Point(6, 57);
-      this.label5.Margin = new System.Windows.Forms.Padding(3);
-      this.label5.Name = "label5";
-      this.label5.Size = new System.Drawing.Size(60, 13);
-      this.label5.TabIndex = 0;
-      this.label5.Text = "Installation:";
-      // 
-      // overbookedCapacityLabel
-      // 
-      this.overbookedCapacityLabel.AutoSize = true;
-      this.overbookedCapacityLabel.Location = new System.Drawing.Point(91, 76);
-      this.overbookedCapacityLabel.Margin = new System.Windows.Forms.Padding(3);
-      this.overbookedCapacityLabel.Name = "overbookedCapacityLabel";
-      this.overbookedCapacityLabel.Size = new System.Drawing.Size(10, 13);
-      this.overbookedCapacityLabel.TabIndex = 4;
-      this.overbookedCapacityLabel.Text = "-";
-      // 
-      // label7
-      // 
-      this.label7.AutoSize = true;
-      this.label7.Location = new System.Drawing.Point(6, 76);
-      this.label7.Margin = new System.Windows.Forms.Padding(3);
-      this.label7.Name = "label7";
-      this.label7.Size = new System.Drawing.Size(71, 13);
-      this.label7.TabIndex = 0;
-      this.label7.Text = "Overbooking:";
       // 
       // GQAPAssignmentView
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/GQAPAssignmentView.cs	(revision 7438)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
@@ -34,4 +35,6 @@
   [Content(typeof(GQAPAssignment), IsDefaultView = true)]
   public partial class GQAPAssignmentView : ItemView {
+    private static readonly double BrightnessLevel = 0.5;
+
     public new GQAPAssignment Content {
       get { return (GQAPAssignment)base.Content; }
@@ -69,5 +72,5 @@
     }
 
-    #region Event Handlers
+    #region Content Event Handlers
     private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       switch (e.PropertyName) {
@@ -89,4 +92,35 @@
     #endregion
 
+    #region Event Handlers
+    private void assignmentTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (Content != null) {
+        assignmentTreeView.BeginUpdate();
+        try {
+          if (assignmentTreeView.SelectedNode == null) {
+            ColorByInstallationCosts();
+          } else {
+            var equipmentNode = (assignmentTreeView.SelectedNode as EquipmentNode);
+            if (equipmentNode != null) {
+              ColorByWeight(equipmentNode);
+            }
+            var locationNode = (assignmentTreeView.SelectedNode as LocationNode);
+            if (locationNode != null) {
+              ColorByWeight(locationNode);
+            }
+          }
+        } finally { assignmentTreeView.EndUpdate(); }
+      }
+    }
+
+    private void assignmentTreeView_MouseUp(object sender, MouseEventArgs e) {
+      var hit = assignmentTreeView.HitTest(e.X, e.Y);
+      if (hit.Node == null || hit.Location == TreeViewHitTestLocations.None || hit.Location == TreeViewHitTestLocations.RightOfLabel) {
+        assignmentTreeView.SelectedNode = null;
+        ColorByInstallationCosts();
+      }
+    }
+    #endregion
+
+    #region Helpers
     private void UpdateQuality() {
       if (InvokeRequired) Invoke((Action)UpdateQuality);
@@ -145,10 +179,10 @@
               if (Content.LocationNames != null && Content.LocationNames.Length > assignment[i])
                 locationName = Content.LocationNames[assignment[i]];
-              locationNodes.Add(assignment[i], new TreeNode(locationName));
+              locationNodes.Add(assignment[i], new LocationNode(assignment[i], locationName));
             }
             string equipmentName = i.ToString();
             if (Content.EquipmentNames != null && Content.EquipmentNames.Length > i)
               equipmentName = Content.EquipmentNames[i];
-            locationNodes[assignment[i]].Nodes.Add(equipmentName);
+            locationNodes[assignment[i]].Nodes.Add(new EquipmentNode(i, equipmentName));
           }
 
@@ -159,8 +193,120 @@
               node.Expand();
             }
+            ColorByInstallationCosts();
           } finally { assignmentTreeView.EndUpdate(); }
         }
       }
     }
+
+    private void ColorByInstallationCosts() {
+      var installationCosts = new Dictionary<EquipmentNode, double>();
+      foreach (var node in GetAllSubNodes(assignmentTreeView.Nodes).OfType<EquipmentNode>()) {
+        int location = Content.Solution.Assignment[node.Equipment];
+        installationCosts[node] = Content.InstallationCosts[node.Equipment, location];
+      }
+      double max = installationCosts.Values.Max();
+      foreach (var kvp in installationCosts) {
+        if (max == 0) {
+          kvp.Key.BackColor = assignmentTreeView.BackColor;
+          kvp.Key.ForeColor = assignmentTreeView.ForeColor;
+        }
+        int colorComponent = (int)(255 * Math.Pow((max - kvp.Value) / max, 2));
+        kvp.Key.BackColor = Color.FromArgb(255, colorComponent, colorComponent);
+        if (kvp.Key.BackColor.GetBrightness() < BrightnessLevel) kvp.Key.ForeColor = Color.White;
+        else kvp.Key.ForeColor = Color.Black;
+      }
+    }
+
+    private void ColorByWeight(EquipmentNode selectedNode) {
+      int equipment = selectedNode.Equipment;
+      double rowSum = 0, colSum = 0;
+      for (int i = 0; i < Content.Weights.Columns; i++)
+        if (i != equipment) rowSum += Content.Weights[equipment, i];
+      for (int i = 0; i < Content.Weights.Rows; i++)
+        if (i != equipment) colSum += Content.Weights[i, equipment];
+
+      var otherEquipments = GetAllSubNodes(assignmentTreeView.Nodes)
+        .OfType<EquipmentNode>()
+        .Where(x => x != selectedNode);
+
+      selectedNode.BackColor = assignmentTreeView.BackColor;
+      selectedNode.ForeColor = assignmentTreeView.ForeColor;
+      foreach (var other in otherEquipments) {
+        if (rowSum == 0 && colSum == 0) {
+          other.BackColor = assignmentTreeView.BackColor;
+          other.ForeColor = assignmentTreeView.ForeColor;
+        } else {
+          double rowInvProportion = rowSum == 0 ? 1.0 : (rowSum - Content.Weights[equipment, other.Equipment]) / rowSum;
+          double colInvProportion = colSum == 0 ? 1.0 : (colSum - Content.Weights[other.Equipment, equipment]) / colSum;
+          int colorComponent = (int)(255 * Math.Pow(Math.Min(rowInvProportion, colInvProportion), 2));
+          other.BackColor = Color.FromArgb(colorComponent, 255, colorComponent);
+          if (other.BackColor.GetBrightness() < BrightnessLevel) other.ForeColor = Color.White;
+          else other.ForeColor = Color.Black;
+        }
+      }
+    }
+
+    private void ColorByWeight(LocationNode selectedNode) {
+      var equipments = new HashSet<int>(Content.Solution.Assignment.Select((v, i) => new { Index = i, Value = v })
+        .Where(x => x.Value == selectedNode.Location).Select(x => x.Index));
+      var rowSums = new Dictionary<int, double>(equipments.Count);
+      var colSums = new Dictionary<int, double>(equipments.Count);
+      foreach (var e in equipments) {
+        rowSums[e] = 0;
+        colSums[e] = 0;
+        for (int i = 0; i < Content.Weights.Columns; i++) {
+          if (!equipments.Contains(i)) rowSums[e] += Content.Weights[e, i];
+          if (!equipments.Contains(i)) colSums[e] += Content.Weights[i, e];
+        }
+      }
+      var equipmentNodes = GetAllSubNodes(assignmentTreeView.Nodes)
+        .OfType<EquipmentNode>();
+
+      var relevantEquipments = new HashSet<int>(equipments.Where(x => rowSums[x] > 0 || colSums[x] > 0));
+      foreach (var other in equipmentNodes) {
+        if (!relevantEquipments.Any() || equipments.Contains(other.Equipment)) {
+          other.BackColor = assignmentTreeView.BackColor;
+          other.ForeColor = assignmentTreeView.ForeColor;
+        } else {
+          double rowInvProportion = relevantEquipments.Min(x => rowSums[x] == 0 ? 1.0 : (rowSums[x] - Content.Weights[x, other.Equipment]) / rowSums[x]);
+          double colInvProportion = relevantEquipments.Min(x => colSums[x] == 0 ? 1.0 : (colSums[x] - Content.Weights[other.Equipment, x]) / colSums[x]);
+          int colorComponent = (int)(255 * Math.Pow(Math.Min(rowInvProportion, colInvProportion), 2));
+          other.BackColor = Color.FromArgb(colorComponent, 255, colorComponent);
+          if (other.BackColor.GetBrightness() < BrightnessLevel) other.ForeColor = Color.White;
+          else other.ForeColor = Color.Black;
+        }
+      }
+    }
+
+    private IEnumerable<TreeNode> GetAllSubNodes(TreeNodeCollection nodes) {
+      foreach (TreeNode node in nodes) {
+        yield return node;
+        foreach (TreeNode subNode in GetAllSubNodes(node.Nodes))
+          yield return subNode;
+      }
+    }
+    #endregion
+
+    #region Helper Classes
+    private class LocationNode : TreeNode {
+      public int Location { get; set; }
+
+      public LocationNode() : base() { }
+      public LocationNode(int location, string name)
+        : base(name) {
+        Location = location;
+      }
+    }
+
+    private class EquipmentNode : TreeNode {
+      public int Equipment { get; set; }
+
+      public EquipmentNode() : base() { }
+      public EquipmentNode(int equipment, string name)
+        : base(name) {
+        Equipment = equipment;
+      }
+    }
+    #endregion
   }
 }
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;
+    }
+  }
+}
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7438)
@@ -55,4 +55,5 @@
     public static readonly string BestKnownQualityDescription = "The best known quality (if available).";
     public static readonly string BestKnownSolutionDescription = "The best known solution (if available).";
+    public static readonly string BestKnownSolutionsDescription = "Contains an archive of best-known solutions regarding flow-distance quality and installation quality.";
     public static readonly string EquipmentNamesDescription = "Optional: A list of names that describes the equipments.";
     public static readonly string LocationNamesDescription = "Optional: A list of names that describes the locations.";
@@ -83,4 +84,7 @@
     public OptionalValueParameter<IItem> BestKnownSolutionParameter {
       get { return (OptionalValueParameter<IItem>)Parameters["BestKnownSolution"]; }
+    }
+    public OptionalValueParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter {
+      get { return (OptionalValueParameter<GQAPAssignmentArchive>)Parameters["BestKnownSolutions"]; }
     }
     public OptionalValueParameter<StringArray> EquipmentNamesParameter {
@@ -146,14 +150,17 @@
     public GeneralizedQuadraticAssignmentProblem()
       : base(new GQAPEvaluator(), new RandomSolutionCreator()) {
-      Parameters.Add(new ValueParameter<DoubleMatrix>("Weights", WeightsDescription, new DoubleMatrix()));
-      Parameters.Add(new ValueParameter<DoubleMatrix>("Distances", DistancesDescription, new DoubleMatrix()));
-      Parameters.Add(new ValueParameter<DoubleMatrix>("InstallationCosts", InstallationCostsDescription, new DoubleMatrix()));
+      Parameters.Add(new ValueParameter<DoubleMatrix>("Weights", WeightsDescription, new DoubleMatrix(), false));
+      Parameters.Add(new ValueParameter<DoubleMatrix>("Distances", DistancesDescription, new DoubleMatrix(), false));
+      Parameters.Add(new ValueParameter<DoubleMatrix>("InstallationCosts", InstallationCostsDescription, new DoubleMatrix(), false));
       Parameters.Add(new FixedValueParameter<DoubleValue>("TransportationCosts", TransportationCostsDescription, new DoubleValue(1)));
       Parameters.Add(new FixedValueParameter<DoubleValue>("OverbookedCapacityPenalty", OverbookedCapacityPenaltyDescription, new DoubleValue(1000)));
-      Parameters.Add(new ValueParameter<DoubleArray>("Demands", DemandsDescription, new DoubleArray()));
-      Parameters.Add(new ValueParameter<DoubleArray>("Capacities", CapacitiesDescription, new DoubleArray()));
-      Parameters.Add(new OptionalValueParameter<IItem>("BestKnownSolution", BestKnownSolutionDescription, null));
+      Parameters.Add(new ValueParameter<DoubleArray>("Demands", DemandsDescription, new DoubleArray(), false));
+      Parameters.Add(new ValueParameter<DoubleArray>("Capacities", CapacitiesDescription, new DoubleArray(), false));
+      Parameters.Add(new OptionalValueParameter<IItem>("BestKnownSolution", BestKnownSolutionDescription, null, false));
+      Parameters.Add(new OptionalValueParameter<GQAPAssignmentArchive>("BestKnownSolutions", BestKnownSolutionsDescription, null, false));
       Parameters.Add(new OptionalValueParameter<StringArray>("EquipmentNames", EquipmentNamesDescription, null, false));
       Parameters.Add(new OptionalValueParameter<StringArray>("LocationNames", LocationNamesDescription, null, false));
+
+      BestKnownQualityParameter.Value = null;
 
       WeightsParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
@@ -230,6 +237,4 @@
     private void InitializeOperators() {
       Operators.Clear();
-      Operators.Add(new BestGQAPSolutionAnalyzer());
-      Operators.Add(new GQAPSolutionArchiveAnalyzer());
       Operators.AddRange(ApplicationManager.Manager.GetInstances<IGQAPOperator>());
       Operators.AddRange(ApplicationManager.Manager.GetInstances<IIntegerVectorOperator>());
@@ -254,4 +259,7 @@
       foreach (var op in operators.OfType<IBestKnownSolutionAwareGQAPOperator>()) {
         op.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+      }
+      foreach (var op in operators.OfType<IBestKnownSolutionsAwareGQAPOperator>()) {
+        op.BestKnownSolutionsParameter.ActualName = BestKnownSolutionsParameter.Name;
       }
       foreach (var op in operators.OfType<ICapacitiesAwareGQAPOperator>()) {
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj	(revision 7437)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj	(revision 7438)
@@ -94,4 +94,5 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestGQAPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzers\GQAPSolutionArchiveUpdater.cs" />
     <Compile Include="Analyzers\GQAPPopulationDiversityAnalyzer.cs" />
     <Compile Include="Analyzers\GQAPSolutionArchiveAnalyzer.cs" />
@@ -103,4 +104,5 @@
     <Compile Include="GQAPAssignmentArchive.cs" />
     <Compile Include="GQAPSolution.cs" />
+    <Compile Include="Interfaces\IBestKnownSolutionsAwareGQAPOperator.cs" />
     <Compile Include="Interfaces\IGQAPManipulator.cs" />
     <Compile Include="Interfaces\IQualitiesAwareGQAPOperator.cs" />
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionsAwareGQAPOperator.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionsAwareGQAPOperator.cs	(revision 7438)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IBestKnownSolutionsAwareGQAPOperator.cs	(revision 7438)
@@ -0,0 +1,28 @@
+﻿#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 HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment {
+  public interface IBestKnownSolutionsAwareGQAPOperator : IGQAPOperator {
+    ILookupParameter<GQAPAssignmentArchive> BestKnownSolutionsParameter { get; }
+  }
+}
