Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/HeuristicLab.Problems.QuadraticAssignment.Views-3.3.csproj
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/HeuristicLab.Problems.QuadraticAssignment.Views-3.3.csproj	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/HeuristicLab.Problems.QuadraticAssignment.Views-3.3.csproj	(revision 5583)
@@ -120,4 +120,7 @@
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
@@ -140,4 +143,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="QAPAssignmentView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="QAPAssignmentView.Designer.cs">
+      <DependentUpon>QAPAssignmentView.cs</DependentUpon>
+    </Compile>
     <Compile Include="QuadraticAssignmentProblemView.cs">
       <SubType>UserControl</SubType>
@@ -161,4 +170,7 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="QAPAssignmentView.resx">
+      <DependentUpon>QAPAssignmentView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="QuadraticAssignmentProblemView.resx">
       <DependentUpon>QuadraticAssignmentProblemView.cs</DependentUpon>
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/Plugin.cs.frame	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/Plugin.cs.frame	(revision 5583)
@@ -25,14 +25,15 @@
   [Plugin("HeuristicLab.Problems.QuadraticAssignment.Views", "3.3.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.QuadraticAssignment.Views-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.Collections", "3.3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3.3")]
   [PluginDependency("HeuristicLab.Common.Resources", "3.3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3.3")]
   [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3.3")]
-  [PluginDependency("HeuristicLab.Operators", "3.3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3.3")]
-  [PluginDependency("HeuristicLab.Parameters", "3.3.3")]
-  [PluginDependency("HeuristicLab.Persistence", "3.3.3")]
+  [PluginDependency("HeuristicLab.Problems.QuadraticAssignment", "3.3.3")]
   public class HeuristicLabProblemsQuadraticAssignmentViewsPlugin : PluginBase {
   }
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.Designer.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.Designer.cs	(revision 5583)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.Designer.cs	(revision 5583)
@@ -0,0 +1,206 @@
+﻿namespace HeuristicLab.Problems.QuadraticAssignment.Views {
+  partial class QAPAssignmentView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.qualityGroupBox = new System.Windows.Forms.GroupBox();
+      this.qualityViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.visualizationTabPage = new System.Windows.Forms.TabPage();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.valueTabPage = new System.Windows.Forms.TabPage();
+      this.assignmentGroupBox = new System.Windows.Forms.GroupBox();
+      this.assignmentViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.qualityGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.visualizationTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.valueTabPage.SuspendLayout();
+      this.assignmentGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.qualityGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.tabControl);
+      this.splitContainer.Size = new System.Drawing.Size(536, 378);
+      this.splitContainer.SplitterDistance = 64;
+      this.splitContainer.TabIndex = 1;
+      // 
+      // qualityGroupBox
+      // 
+      this.qualityGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.qualityGroupBox.Controls.Add(this.qualityViewHost);
+      this.qualityGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.qualityGroupBox.Name = "qualityGroupBox";
+      this.qualityGroupBox.Size = new System.Drawing.Size(536, 61);
+      this.qualityGroupBox.TabIndex = 0;
+      this.qualityGroupBox.TabStop = false;
+      this.qualityGroupBox.Text = "Quality";
+      // 
+      // qualityViewHost
+      // 
+      this.qualityViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.qualityViewHost.Caption = "View";
+      this.qualityViewHost.Content = null;
+      this.qualityViewHost.Enabled = false;
+      this.qualityViewHost.Location = new System.Drawing.Point(6, 19);
+      this.qualityViewHost.Name = "qualityViewHost";
+      this.qualityViewHost.ReadOnly = false;
+      this.qualityViewHost.Size = new System.Drawing.Size(524, 36);
+      this.qualityViewHost.TabIndex = 0;
+      this.qualityViewHost.ViewsLabelVisible = true;
+      this.qualityViewHost.ViewType = null;
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.visualizationTabPage);
+      this.tabControl.Controls.Add(this.valueTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(536, 307);
+      this.tabControl.TabIndex = 0;
+      // 
+      // visualizationTabPage
+      // 
+      this.visualizationTabPage.Controls.Add(this.pictureBox);
+      this.visualizationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.visualizationTabPage.Name = "visualizationTabPage";
+      this.visualizationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.visualizationTabPage.Size = new System.Drawing.Size(528, 281);
+      this.visualizationTabPage.TabIndex = 0;
+      this.visualizationTabPage.Text = "Visualization";
+      this.visualizationTabPage.UseVisualStyleBackColor = true;
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.Location = new System.Drawing.Point(6, 6);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(516, 269);
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      // 
+      // valueTabPage
+      // 
+      this.valueTabPage.Controls.Add(this.assignmentGroupBox);
+      this.valueTabPage.Location = new System.Drawing.Point(4, 22);
+      this.valueTabPage.Name = "valueTabPage";
+      this.valueTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.valueTabPage.Size = new System.Drawing.Size(528, 281);
+      this.valueTabPage.TabIndex = 1;
+      this.valueTabPage.Text = "Value";
+      this.valueTabPage.UseVisualStyleBackColor = true;
+      // 
+      // assignmentGroupBox
+      // 
+      this.assignmentGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.assignmentGroupBox.Controls.Add(this.assignmentViewHost);
+      this.assignmentGroupBox.Location = new System.Drawing.Point(6, 6);
+      this.assignmentGroupBox.Name = "assignmentGroupBox";
+      this.assignmentGroupBox.Size = new System.Drawing.Size(516, 269);
+      this.assignmentGroupBox.TabIndex = 0;
+      this.assignmentGroupBox.TabStop = false;
+      this.assignmentGroupBox.Text = "Assignment";
+      // 
+      // assignmentViewHost
+      // 
+      this.assignmentViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.assignmentViewHost.Caption = "View";
+      this.assignmentViewHost.Content = null;
+      this.assignmentViewHost.Enabled = false;
+      this.assignmentViewHost.Location = new System.Drawing.Point(6, 19);
+      this.assignmentViewHost.Name = "assignmentViewHost";
+      this.assignmentViewHost.ReadOnly = false;
+      this.assignmentViewHost.Size = new System.Drawing.Size(504, 244);
+      this.assignmentViewHost.TabIndex = 0;
+      this.assignmentViewHost.ViewsLabelVisible = true;
+      this.assignmentViewHost.ViewType = null;
+      // 
+      // QAPAssignmentView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "QAPAssignmentView";
+      this.Size = new System.Drawing.Size(536, 378);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.qualityGroupBox.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.visualizationTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.valueTabPage.ResumeLayout(false);
+      this.assignmentGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox qualityGroupBox;
+    private MainForm.WindowsForms.ViewHost qualityViewHost;
+    private MainForm.WindowsForms.DragOverTabControl tabControl;
+    private System.Windows.Forms.TabPage visualizationTabPage;
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.TabPage valueTabPage;
+    private System.Windows.Forms.GroupBox assignmentGroupBox;
+    private MainForm.WindowsForms.ViewHost assignmentViewHost;
+  }
+}
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.cs	(revision 5583)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.cs	(revision 5583)
@@ -0,0 +1,181 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using System.ComponentModel;
+using System.Drawing;
+using System.Globalization;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.QuadraticAssignment.Views {
+  /// <summary>
+  /// The base class for visual representations of a path tour for a TSP.
+  /// </summary>
+  [View("QAPAssignment View")]
+  [Content(typeof(QAPAssignment), true)]
+  public sealed partial class QAPAssignmentView : ItemView {
+    public new QAPAssignment Content {
+      get { return (QAPAssignment)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PathTSPTourView"/>.
+    /// </summary>
+    public QAPAssignmentView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        qualityViewHost.Content = null;
+        pictureBox.Image = null;
+        assignmentViewHost.Content = null;
+      } else {
+        qualityViewHost.Content = Content.Quality;
+        GenerateImage();
+        assignmentViewHost.Content = Content.Assignment;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      qualityGroupBox.Enabled = Content != null;
+      pictureBox.Enabled = Content != null;
+      assignmentGroupBox.Enabled = Content != null;
+    }
+
+    private void GenerateImage() {
+      if ((pictureBox.Width > 0) && (pictureBox.Height > 0)) {
+        if (Content == null) {
+          pictureBox.Image = null;
+        } else {
+          bool drawDistances = false;
+          DoubleMatrix coordinates = Content.Coordinates;
+          DoubleMatrix distances = Content.Distances;
+          if ((coordinates == null || coordinates.Rows == 0)
+            && (distances == null || distances.Rows == 0)) return;
+          else if ((coordinates == null || coordinates.Rows == 0)
+            && Content.ViewCoordinates == null) {
+            coordinates = new DoubleMatrix(distances.Rows, 2);
+            int columns = (int)Math.Ceiling(Math.Sqrt(coordinates.Rows));
+            int x = 0, y = 0;
+            for (int i = 0; i < coordinates.Rows; i++) {
+              coordinates[i, 0] = 10 * x;
+              coordinates[i, 1] = 10 * y;
+              if (++x > columns) {
+                y++;
+                x = 0;
+              }
+            }
+            Content.ViewCoordinates = coordinates;
+            drawDistances = true;
+          } else if ((coordinates == null || coordinates.Rows == 0)
+            && Content.ViewCoordinates != null) {
+            coordinates = Content.ViewCoordinates;
+            drawDistances = true;
+          }
+
+          DoubleMatrix weights = Content.Weights;
+          Permutation permutation = Content.Assignment;
+          Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+
+          if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+            double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+            for (int i = 0; i < coordinates.Rows; i++) {
+              if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+              if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+              if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+              if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+            }
+
+            int border = 20;
+            double xStep = xMax != xMin ? (pictureBox.Width - 2 * border) / (xMax - xMin) : 1;
+            double yStep = yMax != yMin ? (pictureBox.Height - 2 * border) / (yMax - yMin) : 1;
+
+            Point[] points = new Point[coordinates.Rows];
+            for (int i = 0; i < coordinates.Rows; i++)
+              points[i] = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                    bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+
+            using (Graphics graphics = Graphics.FromImage(bitmap)) {
+              if ((permutation != null) && (permutation.Length == coordinates.Rows) && (permutation.Validate())) {
+                for (int i = 0; i < permutation.Length; i++) {
+                  for (int j = 0; j < permutation.Length; j++) {
+                    if (i != j && weights[i, j] > 0) {
+                      graphics.DrawLine(Pens.Black, points[permutation[i]], points[permutation[j]]);
+                      float midX = ((points[permutation[i]].X + points[permutation[j]].X) / 2.0f) + 5;
+                      float midY = ((points[permutation[i]].Y + points[permutation[j]].Y) / 2.0f) - 5;
+                      graphics.DrawString(weights[i, j].ToString(CultureInfo.InvariantCulture.NumberFormat), Font, Brushes.Black, midX, midY);
+                    }
+                  }
+                }
+              }
+              for (int i = 0; i < points.Length; i++)
+                graphics.FillRectangle(Brushes.Red, points[i].X - 2, points[i].Y - 2, 6, 6);
+            }
+          }
+          pictureBox.Image = bitmap;
+        }
+      }
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
+      else {
+        switch (e.PropertyName) {
+          case "Coordinates":
+          case "Distances":
+          case "Weights":
+            GenerateImage();
+            break;
+          case "Permutation":
+            GenerateImage();
+            assignmentViewHost.Content = Content.Assignment;
+            break;
+          case "Quality":
+            break;
+          default:
+            break;
+        }
+      }
+    }
+
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      GenerateImage();
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.resx
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.resx	(revision 5583)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QAPAssignmentView.resx	(revision 5583)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.Designer.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.Designer.cs	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.Designer.cs	(revision 5583)
@@ -47,5 +47,5 @@
       this.importInstanceButton = new System.Windows.Forms.Button();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
-      this.label1 = new System.Windows.Forms.Label();
+      this.QAPLIBInstancesLabel = new System.Windows.Forms.Label();
       this.instancesComboBox = new System.Windows.Forms.ComboBox();
       this.loadInstanceButton = new System.Windows.Forms.Button();
@@ -81,7 +81,7 @@
       // 
       this.importInstanceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.importInstanceButton.Location = new System.Drawing.Point(375, 0);
+      this.importInstanceButton.Location = new System.Drawing.Point(391, 0);
       this.importInstanceButton.Name = "importInstanceButton";
-      this.importInstanceButton.Size = new System.Drawing.Size(115, 23);
+      this.importInstanceButton.Size = new System.Drawing.Size(99, 23);
       this.importInstanceButton.TabIndex = 5;
       this.importInstanceButton.Text = "Import...";
@@ -96,12 +96,16 @@
       this.openFileDialog.Filter = "Dat files|*.dat|All files|*.*";
       // 
-      // label1
+      // QAPLIBInstancesLabel
       // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 5);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(77, 13);
-      this.label1.TabIndex = 6;
-      this.label1.Text = "Load instance:";
+      this.QAPLIBInstancesLabel.AutoSize = true;
+      this.QAPLIBInstancesLabel.Cursor = System.Windows.Forms.Cursors.Hand;
+      this.QAPLIBInstancesLabel.Location = new System.Drawing.Point(3, 5);
+      this.QAPLIBInstancesLabel.Name = "QAPLIBInstancesLabel";
+      this.QAPLIBInstancesLabel.Size = new System.Drawing.Size(96, 13);
+      this.QAPLIBInstancesLabel.TabIndex = 6;
+      this.QAPLIBInstancesLabel.Text = "QAPLIB instances:";
+      this.toolTip.SetToolTip(this.QAPLIBInstancesLabel, "These instances were taken from the QAPLIB homepage at http://www.seas.upenn.edu/" +
+              "qaplib/");
+      this.QAPLIBInstancesLabel.Click += new System.EventHandler(this.QAPLIBInstancesLabel_Click);
       // 
       // instancesComboBox
@@ -111,7 +115,7 @@
       this.instancesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.instancesComboBox.FormattingEnabled = true;
-      this.instancesComboBox.Location = new System.Drawing.Point(86, 2);
+      this.instancesComboBox.Location = new System.Drawing.Point(105, 2);
       this.instancesComboBox.Name = "instancesComboBox";
-      this.instancesComboBox.Size = new System.Drawing.Size(220, 21);
+      this.instancesComboBox.Size = new System.Drawing.Size(201, 21);
       this.instancesComboBox.TabIndex = 7;
       this.instancesComboBox.SelectedValueChanged += new System.EventHandler(this.instancesComboBox_SelectedValueChanged);
@@ -122,8 +126,9 @@
       this.loadInstanceButton.Location = new System.Drawing.Point(312, 0);
       this.loadInstanceButton.Name = "loadInstanceButton";
-      this.loadInstanceButton.Size = new System.Drawing.Size(57, 23);
+      this.loadInstanceButton.Size = new System.Drawing.Size(73, 23);
       this.loadInstanceButton.TabIndex = 5;
       this.loadInstanceButton.Text = "Load";
       this.loadInstanceButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.loadInstanceButton, "Load the selected QAPLIB instance.");
       this.loadInstanceButton.UseVisualStyleBackColor = true;
       this.loadInstanceButton.Click += new System.EventHandler(this.loadInstanceButton_Click);
@@ -136,10 +141,10 @@
       this.Controls.Add(this.importInstanceButton);
       this.Controls.Add(this.loadInstanceButton);
-      this.Controls.Add(this.label1);
+      this.Controls.Add(this.QAPLIBInstancesLabel);
       this.Name = "QuadraticAssignmentProblemView";
       this.Controls.SetChildIndex(this.descriptionLabel, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.label1, 0);
+      this.Controls.SetChildIndex(this.QAPLIBInstancesLabel, 0);
       this.Controls.SetChildIndex(this.descriptionTextBox, 0);
       this.Controls.SetChildIndex(this.loadInstanceButton, 0);
@@ -157,5 +162,5 @@
     private System.Windows.Forms.Button importInstanceButton;
     private System.Windows.Forms.OpenFileDialog openFileDialog;
-    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label QAPLIBInstancesLabel;
     private System.Windows.Forms.ComboBox instancesComboBox;
     private System.Windows.Forms.Button loadInstanceButton;
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.cs	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.cs	(revision 5583)
@@ -71,4 +71,8 @@
       }
     }
+
+    private void QAPLIBInstancesLabel_Click(object sender, System.EventArgs e) {
+      System.Diagnostics.Process.Start("http://www.seas.upenn.edu/qaplib/");
+    }
   }
 }
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.resx
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.resx	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment.Views/3.3/QuadraticAssignmentProblemView.resx	(revision 5583)
@@ -121,7 +121,4 @@
     <value>107, 17</value>
   </metadata>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>107, 17</value>
-  </metadata>
   <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs	(revision 5583)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs	(revision 5583)
@@ -0,0 +1,133 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.QuadraticAssignment {
+  /// <summary>
+  /// An operator for analyzing the best solution of Quadratic Assignment Problems.
+  /// </summary>
+  [Item("BestQAPSolutionAnalyzer", "An operator for analyzing the best solution of Quadratic Assignment Problems.")]
+  [StorableClass]
+  public sealed class BestQAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public LookupParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    public LookupParameter<DoubleMatrix> DistancesParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["Distances"]; }
+    }
+    public LookupParameter<DoubleMatrix> WeightsParameter {
+      get { return (LookupParameter<DoubleMatrix>)Parameters["Weights"]; }
+    }
+    public ScopeTreeLookupParameter<Permutation> PermutationParameter {
+      get { return (ScopeTreeLookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<QAPAssignment> BestSolutionParameter {
+      get { return (LookupParameter<QAPAssignment>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<Permutation> BestKnownSolutionParameter {
+      get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
+    }
+
+    [StorableConstructor]
+    private BestQAPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    private BestQAPSolutionAnalyzer(BestQAPSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestQAPSolutionAnalyzer(this, cloner);
+    }
+    public BestQAPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the locations."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", "The distances between the locations."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", "The weights between the facilities."));
+      Parameters.Add(new ScopeTreeLookupParameter<Permutation>("Permutation", "The QAP solutions from which the best solution should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the QAP solutions which should be analyzed."));
+      Parameters.Add(new LookupParameter<QAPAssignment>("BestSolution", "The best QAP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best QAP solution should be stored."));
+      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this QAP instance."));
+      Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution of this QAP instance."));
+    }
+
+    public override IOperation Apply() {
+      DoubleMatrix coordinates = CoordinatesParameter.ActualValue;
+      DoubleMatrix distances = DistancesParameter.ActualValue;
+      DoubleMatrix weights = WeightsParameter.ActualValue;
+      ItemArray<Permutation> permutations = PermutationParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      bool max = MaximizationParameter.ActualValue.Value;
+      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+
+      int i = -1;
+      if (!max)
+        i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      else i = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
+
+      if (bestKnownQuality == null ||
+          max && qualities[i].Value > bestKnownQuality.Value ||
+          !max && qualities[i].Value < bestKnownQuality.Value) {
+        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
+        BestKnownSolutionParameter.ActualValue = (Permutation)permutations[i].Clone();
+      }
+
+      QAPAssignment assignment = BestSolutionParameter.ActualValue;
+      if (assignment == null) {
+        assignment = new QAPAssignment(weights, (Permutation)permutations[i].Clone(), new DoubleValue(qualities[i].Value));
+        assignment.Coordinates = coordinates;
+        assignment.Distances = distances;
+        BestSolutionParameter.ActualValue = assignment;
+        results.Add(new Result("Best QAP Solution", assignment));
+      } else {
+        if (max && assignment.Quality.Value < qualities[i].Value ||
+          !max && assignment.Quality.Value > qualities[i].Value) {
+          assignment.Coordinates = coordinates;
+          assignment.Distances = distances;
+          assignment.Weights = weights;
+          assignment.Assignment = (Permutation)permutations[i].Clone();
+          assignment.Quality.Value = qualities[i].Value;
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/kra32.dat
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/kra32.dat	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/kra32.dat	(revision 5583)
@@ -1,3 +1,4 @@
 32
+
 0 2 2 2 2 2 2 2 3 0 3 2 0 0 0 3 3 0 0 2 1 2 1 1 0 3 0 0 0 0 0 0 
 2 0 2 2 3 2 3 2 0 0 2 1 0 0 2 3 3 0 0 2 1 2 1 1 0 3 0 0 0 0 0 0 
@@ -33,34 +34,34 @@
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 
-0 10 20 30 10 20 30 40 20 30 40 50 30 40 50 60 23 33 43 53 33 43 53 63 43 53 63 73 53 63 73 83 
-10 0 10 20 20 10 20 30 30 20 30 40 40 30 40 50 33 23 33 43 43 33 43 53 53 43 53 63 63 53 63 73 
-20 10 0 10 30 20 10 20 40 30 20 30 50 40 30 40 43 33 23 33 53 43 33 43 63 53 43 53 73 63 53 63 
-30 20 10 0 40 30 20 10 50 40 30 20 60 50 40 30 53 43 33 23 63 53 43 33 73 63 53 43 83 73 63 53 
-10 20 30 40 0 10 20 30 10 20 30 40 20 30 40 50 33 43 53 63 23 33 43 53 33 43 53 63 43 53 63 73 
-20 10 20 30 10 0 10 20 20 10 20 30 30 20 30 40 43 33 43 53 33 23 33 43 43 33 43 53 53 43 53 63 
-30 20 10 20 20 10 0 10 30 20 10 20 40 30 20 30 53 43 33 43 43 33 23 33 53 43 33 43 63 53 43 53 
-40 30 20 10 30 20 10 0 40 30 20 10 50 40 30 20 63 53 43 33 53 43 33 23 63 53 43 33 73 63 53 43 
-20 30 40 50 10 20 30 40 0 10 20 30 10 20 30 40 43 53 63 73 33 43 53 63 23 33 43 53 33 43 53 63 
-30 20 30 40 20 10 20 30 10 0 10 20 20 10 20 30 53 43 53 63 43 33 43 53 33 23 33 43 43 33 43 53 
-40 30 20 30 30 20 10 20 20 10 0 10 30 20 10 20 63 53 43 53 53 43 33 43 43 33 23 33 53 43 33 43 
-50 40 30 20 40 30 20 10 30 20 10 0 40 30 20 10 73 63 53 43 63 53 43 33 53 43 33 23 63 53 43 33 
-30 40 50 60 20 30 40 50 10 20 30 40 0 10 20 30 53 63 73 83 43 53 63 73 33 43 53 63 23 33 43 53 
-40 30 40 50 30 20 30 40 20 10 20 30 10 0 10 20 63 53 63 73 53 43 53 63 43 33 43 53 33 23 33 43 
-50 40 30 40 40 30 20 30 30 20 10 20 20 10 0 10 73 63 53 63 63 53 43 53 53 43 33 43 43 33 23 33 
-60 50 40 30 50 40 30 20 40 30 20 10 30 20 10 0 83 73 63 53 73 63 53 43 63 53 43 33 53 43 33 23 
-23 33 43 53 33 43 53 63 43 53 63 73 53 63 73 83 0 10 20 30 10 20 30 40 20 30 40 50 30 40 50 60 
-33 23 33 43 43 33 43 53 53 43 53 63 63 53 63 73 10 0 10 20 20 10 20 30 30 20 30 40 40 30 40 50 
-43 33 23 33 53 43 33 43 63 53 43 53 73 63 53 63 20 10 0 10 30 20 10 20 40 30 20 30 50 40 30 40 
-53 43 33 23 63 53 43 33 73 63 53 43 83 73 63 53 30 20 10 0 40 30 20 10 50 40 30 20 60 50 40 30 
-33 43 53 63 23 33 43 53 33 43 53 63 43 53 63 73 10 20 30 40 0 10 20 30 10 20 30 40 20 30 40 50 
-43 33 43 53 33 23 33 43 43 33 43 53 53 43 53 63 20 10 20 30 10 0 10 20 20 10 20 30 30 20 30 40 
-53 43 33 43 43 33 23 33 53 43 33 43 63 53 43 53 30 20 10 20 20 10 0 10 30 20 10 20 40 30 20 30 
-63 53 43 33 53 43 33 23 63 53 43 33 73 63 53 43 40 30 20 10 30 20 10 0 40 30 20 10 50 40 30 20 
-43 53 63 73 33 43 53 63 23 33 43 53 33 43 53 63 20 30 40 50 10 20 30 40 0 10 20 30 10 20 30 40 
-53 43 53 63 43 33 43 53 33 23 33 43 43 33 43 53 30 20 30 40 20 10 20 30 10 0 10 20 20 10 20 30 
-63 53 43 53 53 43 33 43 43 33 23 33 53 43 33 43 40 30 20 30 30 20 10 20 20 10 0 10 30 20 10 20 
-73 63 53 43 63 53 43 33 53 43 33 23 63 53 43 33 50 40 30 20 40 30 20 10 30 20 10 0 40 30 20 10 
-53 63 73 83 43 53 63 73 33 43 53 63 23 33 43 53 30 40 50 60 20 30 40 50 10 20 30 40 0 10 20 30 
-63 53 63 73 53 43 53 63 43 33 43 53 33 23 33 43 40 30 40 50 30 20 30 40 20 10 20 30 10 0 10 20 
-73 63 53 63 63 53 43 53 53 43 33 43 43 33 23 33 50 40 30 40 40 30 20 30 30 20 10 20 20 10 0 10 
-83 73 63 53 73 63 53 43 63 53 43 33 53 43 33 23 60 50 40 30 50 40 30 20 40 30 20 10 30 20 10 0 
+0 50 100 150 50 100 150 200 100 150 200 250 150 200 250 300 115 165 215 265 165 215 265 315 215 265 315 365 265 315 365 415 
+50 0 50 100 100 50 100 150 150 100 150 200 200 150 200 250 165 115 165 215 215 165 215 265 265 215 265 315 315 265 315 365 
+100 50 0 50 150 100 50 100 200 150 100 150 250 200 150 200 215 165 115 165 265 215 165 215 315 265 215 265 365 315 265 315 
+150 100 50 0 200 150 100 50 250 200 150 100 300 250 200 150 265 215 165 115 315 265 215 165 365 315 265 215 415 365 315 265 
+50 100 150 200 0 50 100 150 50 100 150 200 100 150 200 250 165 215 265 315 115 165 215 265 165 215 265 315 215 265 315 365 
+100 50 100 150 50 0 50 100 100 50 100 150 150 100 150 200 215 165 215 265 165 115 165 215 215 165 215 265 265 215 265 315 
+150 100 50 100 100 50 0 50 150 100 50 100 200 150 100 150 265 215 165 215 215 165 115 165 265 215 165 215 315 265 215 265 
+200 150 100 50 150 100 50 0 200 150 100 50 250 200 150 100 315 265 215 165 265 215 165 115 315 265 215 165 365 315 265 215 
+100 150 200 250 50 100 150 200 0 50 100 150 50 100 150 200 215 265 315 365 165 215 265 315 115 165 215 265 165 215 265 315 
+150 100 150 200 100 50 100 150 50 0 50 100 100 50 100 150 265 215 265 315 215 165 215 265 165 115 165 215 215 165 215 265 
+200 150 100 150 150 100 50 100 100 50 0 50 150 100 50 100 315 265 215 265 265 215 165 215 215 165 115 165 265 215 165 215 
+250 200 150 100 200 150 100 50 150 100 50 0 200 150 100 50 365 315 265 215 315 265 215 165 265 215 165 115 315 265 215 165 
+150 200 250 300 100 150 200 250 50 100 150 200 0 50 100 150 265 315 365 415 215 265 315 365 165 215 265 315 115 165 215 265 
+200 150 200 250 150 100 150 200 100 50 100 150 50 0 50 100 315 265 315 365 265 215 265 315 215 165 215 265 165 115 165 215 
+250 200 150 200 200 150 100 150 150 100 50 100 100 50 0 50 365 315 265 315 315 265 215 265 265 215 165 215 215 165 115 165 
+300 250 200 150 250 200 150 100 200 150 100 50 150 100 50 0 415 365 315 265 365 315 265 215 315 265 215 165 265 215 165 115 
+115 165 215 265 165 215 265 315 215 265 315 365 265 315 365 415 0 50 100 150 50 100 150 200 100 150 200 250 150 200 250 300 
+165 115 165 215 215 165 215 265 265 215 265 315 315 265 315 365 50 0 50 100 100 50 100 150 150 100 150 200 200 150 200 250 
+215 165 115 165 265 215 165 215 315 265 215 265 365 315 265 315 100 50 0 50 150 100 50 100 200 150 100 150 250 200 150 200 
+265 215 165 115 315 265 215 165 365 315 265 215 415 365 315 265 150 100 50 0 200 150 100 50 250 200 150 100 300 250 200 150 
+165 215 265 315 115 165 215 265 165 215 265 315 215 265 315 365 50 100 150 200 0 50 100 150 50 100 150 200 100 150 200 250 
+215 165 215 265 165 115 165 215 215 165 215 265 265 215 265 315 100 50 100 150 50 0 50 100 100 50 100 150 150 100 150 200 
+265 215 165 215 215 165 115 165 265 215 165 215 315 265 215 265 150 100 50 100 100 50 0 50 150 100 50 100 200 150 100 150 
+315 265 215 165 265 215 165 115 315 265 215 165 365 315 265 215 200 150 100 50 150 100 50 0 200 150 100 50 250 200 150 100 
+215 265 315 365 165 215 265 315 115 165 215 265 165 215 265 315 100 150 200 250 50 100 150 200 0 50 100 150 50 100 150 200 
+265 215 265 315 215 165 215 265 165 115 165 215 215 165 215 265 150 100 150 200 100 50 100 150 50 0 50 100 100 50 100 150 
+315 265 215 265 265 215 165 215 215 165 115 165 265 215 165 215 200 150 100 150 150 100 50 100 100 50 0 50 150 100 50 100 
+365 315 265 215 315 265 215 165 265 215 165 115 315 265 215 165 250 200 150 100 200 150 100 50 150 100 50 0 200 150 100 50 
+265 315 365 415 215 265 315 365 165 215 265 315 115 165 215 265 150 200 250 300 100 150 200 250 50 100 150 200 0 50 100 150 
+315 265 315 365 265 215 265 315 215 165 215 265 165 115 165 215 200 150 200 250 150 100 150 200 100 50 100 150 50 0 50 100 
+365 315 265 315 315 265 215 265 265 215 165 215 215 165 115 165 250 200 150 200 200 150 100 150 150 100 50 100 100 50 0 50 
+415 365 315 265 365 315 265 215 315 265 215 165 265 215 165 115 300 250 200 150 250 200 150 100 200 150 100 50 150 100 50 0 
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa30a.dat
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa30a.dat	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa30a.dat	(revision 5583)
@@ -1,3 +1,2 @@
-
  30
 
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa50a.dat
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa50a.dat	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/lipa50a.dat	(revision 5583)
@@ -1,3 +1,2 @@
-
  50
 
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/tai25a.dat
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/tai25a.dat	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Data/tai25a.dat	(revision 5583)
@@ -1,3 +1,3 @@
-          25 1167256 
+25
 
   0 92 69 62 32 97  5 39 50 82 93 71 35 14 20 74 49 50 37 79 19 51 70 42 26
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/HeuristicLab.Problems.QuadraticAssignment-3.3.csproj
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/HeuristicLab.Problems.QuadraticAssignment-3.3.csproj	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/HeuristicLab.Problems.QuadraticAssignment-3.3.csproj	(revision 5583)
@@ -141,7 +141,9 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Analyzers\BestQAPSolutionAnalyzer.cs" />
     <Compile Include="Evaluators\QAPEvaluator.cs" />
     <Compile Include="Interfaces\IQAPEvaluator.cs" />
     <Compile Include="Parsers\QAPLIBParser.cs" />
+    <Compile Include="QAPAssignment.cs" />
     <Compile Include="QuadraticAssignmentProblem.cs" />
     <EmbeddedResource Include="Data\bur26a.dat" />
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPAssignment.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPAssignment.cs	(revision 5583)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QAPAssignment.cs	(revision 5583)
@@ -0,0 +1,99 @@
+﻿using System.ComponentModel;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.QuadraticAssignment {
+  [Item("QAP Assignment", "Represents a solution to the QAP.")]
+  [StorableClass]
+  public sealed class QAPAssignment : Item, INotifyPropertyChanged {
+    [Storable]
+    private DoubleMatrix coordinates;
+    public DoubleMatrix Coordinates {
+      get { return coordinates; }
+      set {
+        bool changed = (coordinates != value);
+        coordinates = value;
+        if (changed) OnPropertyChanged("Coordinates");
+      }
+    }
+
+    public DoubleMatrix ViewCoordinates { get; set; }
+
+    [Storable]
+    private DoubleMatrix distances;
+    public DoubleMatrix Distances {
+      get { return distances; }
+      set {
+        bool changed = (distances != value);
+        distances = value;
+        if (changed) OnPropertyChanged("Distances");
+      }
+    }
+
+    [Storable]
+    private DoubleMatrix weights;
+    public DoubleMatrix Weights {
+      get { return weights; }
+      set {
+        bool changed = (weights != value);
+        weights = value;
+        if (changed) OnPropertyChanged("Weights");
+      }
+    }
+
+    [Storable]
+    private Permutation assignment;
+    public Permutation Assignment {
+      get { return assignment; }
+      set {
+        bool changed = (assignment != value);
+        assignment = value;
+        if (changed) OnPropertyChanged("Assignment");
+      }
+    }
+
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        bool changed = (quality != value);
+        quality = value;
+        if (changed) OnPropertyChanged("Quality");
+      }
+    }
+
+    [StorableConstructor]
+    private QAPAssignment(bool deserializing) : base(deserializing) { }
+    private QAPAssignment(QAPAssignment original, Cloner cloner)
+      : base(original, cloner) {
+      coordinates = cloner.Clone(original.coordinates);
+      distances = cloner.Clone(original.distances);
+      weights = cloner.Clone(original.weights);
+      assignment = cloner.Clone(original.assignment);
+      quality = cloner.Clone(original.quality);
+    }
+    public QAPAssignment(DoubleMatrix weights, Permutation assignment) {
+      this.weights = weights;
+      this.assignment = assignment;
+    }
+    public QAPAssignment(DoubleMatrix weights, Permutation assignment, DoubleValue quality)
+      : this(weights, assignment) {
+      this.quality = quality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new QAPAssignment(this, cloner);
+    }
+
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    private void OnPropertyChanged(string propertyName) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 5563)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 5583)
@@ -97,4 +97,8 @@
       }
     }
+
+    private BestQAPSolutionAnalyzer BestQAPSolutionAnalyzer {
+      get { return Operators.OfType<BestQAPSolutionAnalyzer>().FirstOrDefault(); }
+    }
     #endregion
 
@@ -160,9 +164,12 @@
       ParameterizeSolutionCreator();
       ParameterizeEvaluator();
+      ParameterizeAnalyzers();
       ParameterizeOperators();
       base.OnSolutionCreatorChanged();
     }
     protected override void OnEvaluatorChanged() {
-      ParameterizeEvaluator();
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      ParameterizeEvaluator();
+      ParameterizeAnalyzers();
       ParameterizeOperators();
       base.OnEvaluatorChanged();
@@ -171,4 +178,9 @@
     private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
       ParameterizeEvaluator();
+      ParameterizeAnalyzers();
+      ParameterizeOperators();
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeAnalyzers();
       ParameterizeOperators();
     }
@@ -196,8 +208,11 @@
       Weights.RowsChanged += new EventHandler(Weights_RowsChanged);
       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     }
 
     private void InitializeOperators() {
       Operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>());
+      Operators.Add(new BestQAPSolutionAnalyzer());
+      ParameterizeAnalyzers();
       ParameterizeOperators();
     }
@@ -215,4 +230,17 @@
         Evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
         Evaluator.WeightsParameter.ActualName = WeightsParameter.Name;
+      }
+    }
+    private void ParameterizeAnalyzers() {
+      if (BestQAPSolutionAnalyzer != null) {
+        BestQAPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        BestQAPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        BestQAPSolutionAnalyzer.DistancesParameter.ActualName = DistanceMatrixParameter.Name;
+        BestQAPSolutionAnalyzer.WeightsParameter.ActualName = WeightsParameter.Name;
+        BestQAPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+        BestQAPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
+        BestQAPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
+        BestQAPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+        BestQAPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
       }
     }
