Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs	(revision 6957)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs	(revision 7311)
@@ -37,4 +37,9 @@
   [StorableClass]
   public sealed class BestGQAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
     public LookupParameter<BoolValue> MaximizationParameter {
       get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
@@ -64,4 +69,10 @@
       get { return (LookupParameter<IntegerVector>)Parameters["BestKnownSolution"]; }
     }
+    public ILookupParameter<StringArray> EquipmentNamesParameter {
+      get { return (ILookupParameter<StringArray>)Parameters["EquipmentNames"]; }
+    }
+    public ILookupParameter<StringArray> LocationNamesParameter {
+      get { return (ILookupParameter<StringArray>)Parameters["LocationNames"]; }
+    }
 
     [StorableConstructor]
@@ -82,4 +93,17 @@
       Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this GQAP instance."));
       Parameters.Add(new LookupParameter<IntegerVector>("BestKnownSolution", "The best known solution of this GQAP instance."));
+      Parameters.Add(new LookupParameter<StringArray>("EquipmentNames", "A list of names that describes the equipments."));
+      Parameters.Add(new LookupParameter<StringArray>("LocationNames", "A list of names that describes the locations."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("EquipmentNames"))
+        Parameters.Add(new LookupParameter<StringArray>("EquipmentNames", "Optional: A list of names that describes the equipments."));
+      if (!Parameters.ContainsKey("LocationNames"))
+        Parameters.Add(new LookupParameter<StringArray>("LocationNames", "Optional: A list of names that describes the locations."));
+      #endregion
     }
 
@@ -107,5 +131,7 @@
       GQAPAssignment assignment = BestSolutionParameter.ActualValue;
       if (assignment == null) {
-        assignment = new GQAPAssignment(weights, (IntegerVector)assignments[i].Clone(), new DoubleValue(qualities[i].Value));
+        StringArray equipmentNames = EquipmentNamesParameter.ActualValue;
+        StringArray locationNames = LocationNamesParameter.ActualValue;
+        assignment = new GQAPAssignment(weights, (IntegerVector)assignments[i].Clone(), new DoubleValue(qualities[i].Value), equipmentNames, locationNames);
         assignment.Distances = distances;
         BestSolutionParameter.ActualValue = assignment;
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluators/GQAPEvaluator.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluators/GQAPEvaluator.cs	(revision 6957)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluators/GQAPEvaluator.cs	(revision 7311)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Linq;
 using HeuristicLab.Common;
@@ -98,4 +99,9 @@
       double infeasibility = 0;
 
+      if (weights.Rows != weights.Columns || distances.Rows != distances.Columns
+        || weights.Rows != installCosts.Rows || distances.Rows != installCosts.Columns
+        || demands.Length != weights.Rows || capacities.Length != distances.Rows)
+        throw new InvalidOperationException("ERROR: The problem configuration is not valid! Check the sizes of the weights (NxN), distances (MxM) and installation costs (NxM) matrices as well as the length of the demand (N) and capacities (M) vectors.");
+
       int len = assignment.Length;
       for (int i = 0; i < len; i++) {
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs	(revision 6957)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GQAPAssignment.cs	(revision 7311)
@@ -76,4 +76,26 @@
     }
 
+    [Storable]
+    private StringArray equipmentNames;
+    public StringArray EquipmentNames {
+      get { return equipmentNames; }
+      set {
+        bool changed = (equipmentNames != value);
+        equipmentNames = value;
+        if (changed) OnPropertyChanged("EquipmentNames");
+      }
+    }
+
+    [Storable]
+    private StringArray locationNames;
+    public StringArray LocationNames {
+      get { return locationNames; }
+      set {
+        bool changed = (locationNames != value);
+        locationNames = value;
+        if (changed) OnPropertyChanged("LocationNames");
+      }
+    }
+
     [StorableConstructor]
     private GQAPAssignment(bool deserializing) : base(deserializing) { }
@@ -84,4 +106,6 @@
       assignment = cloner.Clone(original.assignment);
       quality = cloner.Clone(original.quality);
+      equipmentNames = cloner.Clone(original.equipmentNames);
+      locationNames = cloner.Clone(original.locationNames);
     }
     public GQAPAssignment(DoubleMatrix weights, IntegerVector assignment) {
@@ -92,4 +116,9 @@
       : this(weights, assignment) {
       this.quality = quality;
+    }
+    public GQAPAssignment(DoubleMatrix weights, IntegerVector assignment, DoubleValue quality, StringArray equipmentNames, StringArray locationNames)
+      : this(weights, assignment, quality) {
+      this.equipmentNames = equipmentNames;
+      this.locationNames = locationNames;
     }
 
Index: branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
===================================================================
--- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 6957)
+++ branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7311)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Drawing;
 using System.Linq;
@@ -35,8 +36,10 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IIntegerVectorCreator> {
+  public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IIntegerVectorCreator>, IStorableContent {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
     }
+
+    public string Filename { get; set; }
 
     #region Parameter Properties
@@ -62,5 +65,4 @@
       get { return (OptionalValueParameter<IItem>)Parameters["BestKnownSolution"]; }
     }
-
     #endregion
 
@@ -90,5 +92,4 @@
       set { CapacitiesParameter.Value = value; }
     }
-
     #endregion
 
@@ -116,4 +117,6 @@
       Parameters.Add(new ValueParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations.", new DoubleArray()));
       Parameters.Add(new OptionalValueParameter<IItem>("BestKnownSolution", "The best known solution (if available)", null));
+      Parameters.Add(new OptionalValueParameter<StringArray>("EquipmentNames", "Optional: A list of names that describes the equipments.", null, false));
+      Parameters.Add(new OptionalValueParameter<StringArray>("LocationNames", "Optional: A list of names that describes the locations.", null, false));
 
       WeightsParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
@@ -133,5 +136,5 @@
       Distances[0, 2] = Distances[2, 0] = 2;
 
-      InstallationCosts = new DoubleMatrix(3, 3);
+      InstallationCosts = new DoubleMatrix(5, 3);
 
       TransportationCosts = 1;
@@ -143,6 +146,5 @@
       Capacities[0] = 4; Capacities[1] = 1; Capacities[2] = 4;
 
-      ParameterizeSolutionCreator();
-      ParameterizeEvaluator();
+      Parameterize();
 
       InitializeOperators();
@@ -155,5 +157,25 @@
 
     #region Events
-    // TODO: Add your event handlers here
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      Parameterize();
+    }
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      Parameterize();
+      Evaluator.QualityParameter.ActualNameChanged += new System.EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+    }
+    protected override void OnSolutionCreatorChanged() {
+      base.OnSolutionCreatorChanged();
+      Parameterize();
+      SolutionCreator.IntegerVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
+    }
+
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      Parameterize();
+    }
+    private void SolutionCreator_IntegerVectorParameter_ActualNameChanged(object sender, EventArgs e) {
+      Parameterize();
+    }
     #endregion
 
@@ -161,9 +183,17 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserializationHook() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("EquipmentNames"))
+        Parameters.Add(new OptionalValueParameter<StringArray>("EquipmentNames", "Optional: A list of names that describes the equipments.", null, false));
+      if (!Parameters.ContainsKey("LocationNames"))
+        Parameters.Add(new OptionalValueParameter<StringArray>("LocationNames", "Optional: A list of names that describes the locations.", null, false));
+      #endregion
       AttachEventHandlers();
     }
 
     private void AttachEventHandlers() {
-      // TODO: Add event handlers to the parameters here
+      Evaluator.QualityParameter.ActualNameChanged += new System.EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      SolutionCreator.IntegerVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_IntegerVectorParameter_ActualNameChanged);
     }
 
@@ -172,8 +202,29 @@
       Operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
       Operators.Add(new BestGQAPSolutionAnalyzer());
-      ParameterizeAnalyzers();
-      ParameterizeOperators();
-    }
-    private void ParameterizeAnalyzers() {
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      Evaluator.WeightsParameter.ActualName = WeightsParameter.Name;
+      Evaluator.DistancesParameter.ActualName = DistancesParameter.Name;
+      Evaluator.InstallationCostsParameter.ActualName = InstallationCostsParameter.Name;
+      Evaluator.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name;
+      Evaluator.DemandsParameter.ActualName = DemandsParameter.Name;
+      Evaluator.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
+      Evaluator.AssignmentParameter.ActualName = "Assignment";
+
+      SolutionCreator.LengthParameter.Value = new IntValue(Demands.Length);
+      SolutionCreator.MinimumParameter.Value = new IntValue(0);
+      SolutionCreator.MaximumParameter.Value = new IntValue(Capacities.Length);
+      SolutionCreator.IntegerVectorParameter.ActualName = "Assignment";
+
+      foreach (IIntegerVectorCrossover op in Operators.OfType<IIntegerVectorCrossover>()) {
+        op.ParentsParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.ChildParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+      }
+      foreach (IIntegerVectorManipulator op in Operators.OfType<IIntegerVectorManipulator>()) {
+        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+      }
+
       if (BestSolutionAnalyzer != null) {
         BestSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
@@ -186,28 +237,4 @@
       }
     }
-    private void ParameterizeOperators() {
-      foreach (IIntegerVectorCrossover op in Operators.OfType<IIntegerVectorCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-        op.ChildParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-      }
-      foreach (IIntegerVectorManipulator op in Operators.OfType<IIntegerVectorManipulator>()) {
-        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
-      }
-    }
-    private void ParameterizeSolutionCreator() {
-      SolutionCreator.LengthParameter.Value = new IntValue(Demands.Length);
-      SolutionCreator.MinimumParameter.Value = new IntValue(0);
-      SolutionCreator.MaximumParameter.Value = new IntValue(Capacities.Length);
-      SolutionCreator.IntegerVectorParameter.ActualName = "Assignment";
-    }
-    private void ParameterizeEvaluator() {
-      Evaluator.WeightsParameter.ActualName = WeightsParameter.Name;
-      Evaluator.DistancesParameter.ActualName = DistancesParameter.Name;
-      Evaluator.InstallationCostsParameter.ActualName = InstallationCostsParameter.Name;
-      Evaluator.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name;
-      Evaluator.DemandsParameter.ActualName = DemandsParameter.Name;
-      Evaluator.CapacitiesParameter.ActualName = CapacitiesParameter.Name;
-      Evaluator.AssignmentParameter.ActualName = "Assignment";
-    }
     #endregion
   }
