Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/Plugin.cs.frame	(revision 7538)
@@ -36,4 +36,6 @@
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
   public class HeuristicLabProblemsGeneralizedQuadraticAssignmentAlgorithmsPlugin : PluginBase {
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,14 @@
   [Plugin("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabProblemsGeneralizedQuadraticAssignmentCommonPlugin : PluginBase {
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,5 @@
   [Plugin("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
@@ -30,4 +31,5 @@
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
   [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
@@ -37,4 +39,6 @@
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Problems.GeneralizedQuadraticAssignment", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
   public class HeuristicLabProblemsGeneralizedQuadraticAssignmentViewsPlugin : PluginBase {
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.Designer.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.Designer.cs	(revision 7538)
@@ -21,5 +21,5 @@
 
 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views {
-  partial class ProblemInstanceProviderView {
+  partial class ProblemInstanceProviderView<T> {
     /// <summary> 
     /// Required designer variable.
@@ -48,4 +48,6 @@
       this.label2 = new System.Windows.Forms.Label();
       this.instancesComboBox = new System.Windows.Forms.ComboBox();
+      this.importButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
       this.SuspendLayout();
       // 
@@ -53,5 +55,5 @@
       // 
       this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.loadButton.Location = new System.Drawing.Point(535, -1);
+      this.loadButton.Location = new System.Drawing.Point(451, -1);
       this.loadButton.Name = "loadButton";
       this.loadButton.Size = new System.Drawing.Size(75, 23);
@@ -78,7 +80,23 @@
       this.instancesComboBox.Location = new System.Drawing.Point(54, 0);
       this.instancesComboBox.Name = "instancesComboBox";
-      this.instancesComboBox.Size = new System.Drawing.Size(475, 21);
+      this.instancesComboBox.Size = new System.Drawing.Size(391, 21);
       this.instancesComboBox.TabIndex = 7;
       this.instancesComboBox.DataSourceChanged += new System.EventHandler(this.comboBox_DataSourceChanged);
+      // 
+      // importButton
+      // 
+      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.importButton.Location = new System.Drawing.Point(532, -1);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(75, 23);
+      this.importButton.TabIndex = 6;
+      this.importButton.Text = "Import";
+      this.importButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.Filter = "All files|*.*";
       // 
       // ProblemInstanceProviderView
@@ -87,4 +105,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.instancesComboBox);
+      this.Controls.Add(this.importButton);
       this.Controls.Add(this.loadButton);
       this.Controls.Add(this.label2);
@@ -101,4 +120,6 @@
     private System.Windows.Forms.Label label2;
     private System.Windows.Forms.ComboBox instancesComboBox;
+    private System.Windows.Forms.Button importButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
 
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.cs	(revision 7538)
@@ -23,4 +23,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -29,9 +30,9 @@
 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views {
   [View("ProblemInstanceProviderView")]
-  [Content(typeof(IProblemInstanceProvider), IsDefaultView = true)]
-  public partial class ProblemInstanceProviderView : AsynchronousContentView {
+  [Content(typeof(IProblemInstanceProvider<>), IsDefaultView = true)]
+  public partial class ProblemInstanceProviderView<T> : AsynchronousContentView {
 
-    public new IProblemInstanceProvider Content {
-      get { return (IProblemInstanceProvider)base.Content; }
+    public new IProblemInstanceProvider<T> Content {
+      get { return (IProblemInstanceProvider<T>)base.Content; }
       set { base.Content = value; }
     }
@@ -39,4 +40,5 @@
     public ProblemInstanceProviderView() {
       InitializeComponent();
+      importButton.Image = VSImageLibrary.Open;
     }
 
@@ -53,12 +55,32 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      instancesComboBox.Enabled = !ReadOnly && !Locked && Content != null && Content.ConsumerCanBeFed;
-      loadButton.Enabled = !ReadOnly && !Locked && Content != null && Content.ConsumerCanBeFed;
+      instancesComboBox.Enabled = !ReadOnly && !Locked && Content != null && Content.Consumer != null;
+      loadButton.Enabled = !ReadOnly && !Locked && Content != null && Content.Consumer != null;
     }
 
     private void loadButton_Click(object sender, EventArgs e) {
-      var instance = (IInstanceDescriptor)instancesComboBox.SelectedItem;
-      if (!Content.FeedConsumer(instance)) {
-        MessageBox.Show("This problem does not support loading the instance " + instance.Name + ".", "Cannot load instance");
+      var descriptor = (IInstanceDescriptor)instancesComboBox.SelectedItem;
+      var instance = Content.LoadInstance(descriptor);
+      if (!Content.Consumer.LoadFrom(instance)) {
+        MessageBox.Show("This problem does not support loading the instance " + descriptor.Name + ".", "Cannot load instance");
+      }
+    }
+
+    private void importButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        T instance = default(T);
+        try {
+          instance = Content.LoadInstance(openFileDialog.FileName);
+        } catch {
+          MessageBox.Show("There was an error parsing the file.", "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
+          return;
+        }
+        try {
+          if (!Content.Consumer.LoadFrom(instance)) {
+            MessageBox.Show("This problem does not support loading the instance in the file.", "Cannot load instance", MessageBoxButtons.OK, MessageBoxIcon.Error);
+          }
+        } catch {
+          MessageBox.Show("There was an error while importing the file.");
+        }
       }
     }
@@ -69,9 +91,4 @@
         comboBox.Items.Clear();
     }
-
-    private void instancesComboBox_ToolTipRequired(object sender, ToolTipRequiredEventArgs e) {
-      var instance = (IInstanceDescriptor)instancesComboBox.SelectedItem;
-      e.ToolTip = instance.Description;
-    }
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.resx
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.resx	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemInstanceProviderView.resx	(revision 7538)
@@ -118,3 +118,6 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
 </root>
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.Designer.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.Designer.cs	(revision 7538)
@@ -103,8 +103,10 @@
       // problemInstanceProviderComboBox
       // 
-      this.problemInstanceProviderComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
+      this.problemInstanceProviderComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
       this.problemInstanceProviderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.problemInstanceProviderComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
       this.problemInstanceProviderComboBox.FormattingEnabled = true;
       this.problemInstanceProviderComboBox.Location = new System.Drawing.Point(50, 5);
+      this.problemInstanceProviderComboBox.MaxDropDownItems = 16;
       this.problemInstanceProviderComboBox.Name = "problemInstanceProviderComboBox";
       this.problemInstanceProviderComboBox.Size = new System.Drawing.Size(173, 21);
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ProblemView.cs	(revision 7538)
@@ -63,7 +63,15 @@
       if (problemInstanceProviderComboBox.SelectedIndex >= 0) {
         var provider = (IProblemInstanceProvider)problemInstanceProviderComboBox.SelectedItem;
-        provider.SetConsumer((IProblemInstanceConsumer)Content);
+        var genericType = provider.GetType().GetInterfaces().Single(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IProblemInstanceProvider<>)).GetGenericArguments().First();
+        this.GetType().GetMethod("SetConsumable").MakeGenericMethod(genericType).Invoke(this, new object[] { provider, Content });
         problemInstanceProviderViewHost.Content = provider;
       }
+    }
+
+    /// <summary>
+    /// Do not change method name without changing the string reference above
+    /// </summary>
+    private void SetConsumable<T>(IProblemInstanceProvider<T> producer, IConsumable<T> consumer) {
+      producer.Consumer = consumer;
     }
 
@@ -77,5 +85,5 @@
       var consumerTypes = Content.GetType().GetInterfaces()
         .Where(x => x.IsGenericType
-          && typeof(IProblemInstanceConsumer).IsAssignableFrom(x));
+          && x.GetGenericTypeDefinition() == typeof(IConsumable<>));
 
       if (consumerTypes.Any()) {
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.Designer.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.Designer.cs	(revision 7538)
@@ -48,4 +48,8 @@
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       this.SuspendLayout();
+      // 
+      // ToolTipComboBox
+      // 
+      this.MaxDropDownItems = 16;
       this.ResumeLayout(false);
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Views/3.3/ToolTipComboBox.cs	(revision 7538)
@@ -29,5 +29,4 @@
 
     private ComboBoxState comboBoxState = ComboBoxState.Normal;
-    private bool mouseOver = false;
 
     public ToolTipComboBox()
@@ -36,15 +35,6 @@
       SetStyle(ControlStyles.UserPaint, true);
       InitializeComponent();
-      DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
+      DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
       DropDownStyle = ComboBoxStyle.DropDownList;
-    }
-
-    protected override void OnMeasureItem(MeasureItemEventArgs e) {
-      base.OnMeasureItem(e);
-      string text = GetItemText(Items[e.Index]);
-      if (string.IsNullOrEmpty(text)) text = "test";
-      var rect = TextRenderer.MeasureText(text, Font);
-      e.ItemHeight = rect.Height - 2;
-      e.ItemWidth = rect.Width;
     }
 
@@ -72,7 +62,6 @@
         } else {
           using (var b = new SolidBrush(ForeColor)) {
-            Rectangle r = e.Bounds;
-            r.Offset(0, 1);
-            e.Graphics.DrawString(GetItemText(Items[e.Index]), Font, b, r);
+            var rect = new Rectangle(2, 4, Size.Width - 2, Size.Height - 4);
+            e.Graphics.DrawString(GetItemText(Items[e.Index]), Font, b, rect);
           }
         }
@@ -84,6 +73,6 @@
       base.OnPaint(e);
       if (Enabled == false) comboBoxState = ComboBoxState.Disabled;
-      Rectangle clip = Bounds; // using e.ClipRectangle leads to strange behavior when maximizing/unmaximizing, just redraw the entire region all the time
-      clip.Offset(-clip.X, -clip.Y); // x and y need to be 0
+      Rectangle clip = new Rectangle(new Point(0, 0), Size);
+      clip.Inflate(0, 1);
       if (VisualStyleInformation.IsSupportedByOS && VisualStyleInformation.IsEnabledByUser) {
         PushButtonState pb_State = PushButtonState.Normal;
@@ -109,7 +98,5 @@
         ComboBoxRenderer.DrawDropDownButton(e.Graphics, r, comboBoxState);
       }
-      Rectangle rect = clip;
-      rect.Inflate(-2, -4);
-      rect.Offset(1, 0);
+      var rect = new Rectangle(2, 4, Size.Width - 2, Size.Height - 4);
       if (SelectedIndex > -1 && Items.Count > 0) {
         using (var b = new SolidBrush(ForeColor)) {
@@ -141,5 +128,4 @@
     protected override void OnMouseEnter(EventArgs e) {
       base.OnMouseEnter(e);
-      mouseOver = true;
       if (comboBoxState == ComboBoxState.Normal) {
         comboBoxState = ComboBoxState.Hot;
@@ -158,5 +144,4 @@
     protected override void OnMouseLeave(EventArgs e) {
       base.OnMouseLeave(e);
-      mouseOver = false;
       if (comboBoxState == ComboBoxState.Hot) {
         comboBoxState = ComboBoxState.Normal;
@@ -167,6 +152,8 @@
     protected override void OnMouseDown(MouseEventArgs e) {
       base.OnMouseDown(e);
-      comboBoxState = ComboBoxState.Pressed;
-      Invalidate();
+      if (e.Button == MouseButtons.Left) {
+        comboBoxState = ComboBoxState.Pressed;
+        Invalidate();
+      }
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs	(revision 7538)
@@ -39,9 +39,9 @@
   [StorableClass]
   public sealed class GeneralizedQuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IGQAPEvaluator, IGQAPSolutionCreator>, IStorableContent,
-    IProblemInstanceConsumer<IQAPInstance>,
-    IProblemInstanceConsumer<ICTAPInstance>,
-    IProblemInstanceConsumer<ITSPInstance>,
-    IProblemInstanceConsumer<IATSPInstance>,
-    IProblemInstanceConsumer<IGQAPInstance> {
+    IConsumable<QAPInstance>,
+    IConsumable<CTAPInstance>,
+    IConsumable<TSPInstance>,
+    IConsumable<ATSPInstance>,
+    IConsumable<GQAPInstance> {
 
     public override Image ItemImage {
@@ -214,5 +214,5 @@
 
     #region Problem Instance Consumptions
-    public bool LoadFrom(IQAPInstance instance) {
+    public bool LoadFrom(QAPInstance instance) {
       try {
         Name = instance.Name;
@@ -240,5 +240,5 @@
     }
 
-    public bool LoadFrom(ICTAPInstance instance) {
+    public bool LoadFrom(CTAPInstance instance) {
       try {
         Name = instance.Name;
@@ -270,5 +270,5 @@
     }
 
-    public bool LoadFrom(ITSPInstance instance) {
+    public bool LoadFrom(TSPInstance instance) {
       try {
         if (instance.Dimension > 1000) return false;
@@ -304,5 +304,5 @@
     }
 
-    public bool LoadFrom(IATSPInstance instance) {
+    public bool LoadFrom(ATSPInstance instance) {
       try {
         Name = instance.Name;
@@ -336,5 +336,5 @@
     }
 
-    public bool LoadFrom(IGQAPInstance instance) {
+    public bool LoadFrom(GQAPInstance instance) {
       try {
         Name = instance.Name;
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,5 @@
   [Plugin("HeuristicLab.Problems.GeneralizedQuadraticAssignment", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
@@ -33,7 +34,9 @@
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.GeneralizedQuadraticAssignment.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   public class HeuristicLabProblemsGeneralizedQuadraticAssignmentPlugin : PluginBase {
   }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances.CordeauGQAP {
-  public class CordeauGQAPInstance : IGQAPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-
-    public int Equipments { get; set; }
-    public int Locations { get; set; }
-    public double[] Demands { get; set; }
-    public double[] Capacities { get; set; }
-    public double[,] Weights { get; set; }
-    public double[,] Distances { get; set; }
-    public double[,] InstallationCosts { get; set; }
-
-    public double TransportationCosts { get; set; }
-
-    public int[] BestKnownAssignment { get; set; }
-    public double? BestKnownQuality { get; set; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 7538)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Reflection;
@@ -27,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.CordeauGQAP {
-  public class CordeauGQAPInstanceProvider : ProblemInstanceProvider<IGQAPInstance> {
+  public class CordeauGQAPInstanceProvider : ProblemInstanceProvider<GQAPInstance> {
     public override string Name {
       get { return "Cordeau et al. GQAP instances"; }
@@ -56,24 +57,44 @@
     }
 
-    public override IGQAPInstance GetInstance(IInstanceDescriptor id) {
+    public override GQAPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (CordeauGQAPInstanceDescriptor)id;
-      var instance = new CordeauGQAPInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
         var parser = new CordeauGQAPParser();
         parser.Parse(stream);
-        if (parser.Error != null) throw parser.Error;
-        instance.Equipments = parser.Equipments;
-        instance.Locations = parser.Locations;
-        instance.Demands = parser.Demands;
-        instance.Capacities = parser.Capacities;
-        instance.Weights = parser.Weights;
-        instance.Distances = parser.Distances;
-        instance.InstallationCosts = parser.InstallationCosts;
-        instance.TransportationCosts = parser.TransportationCosts;
+        var instance = Load(parser);
 
         instance.Name = id.Name;
         instance.Description = id.Description;
+
+        return instance;
       }
+    }
+
+    public override GQAPInstance LoadInstance(string path) {
+      var parser = new CordeauGQAPParser();
+      parser.Parse(path);
+      var instance = Load(parser);
+
+      instance.Name = Path.GetFileName(path);
+      instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now.ToString();
+
+      return instance;
+    }
+
+    public override void SaveInstance(GQAPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private GQAPInstance Load(CordeauGQAPParser parser) {
+      var instance = new GQAPInstance();
+      instance.Equipments = parser.Equipments;
+      instance.Locations = parser.Locations;
+      instance.Demands = parser.Demands;
+      instance.Capacities = parser.Capacities;
+      instance.Weights = parser.Weights;
+      instance.Distances = parser.Distances;
+      instance.InstallationCosts = parser.InstallationCosts;
+      instance.TransportationCosts = parser.TransportationCosts;
       return instance;
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPParser.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPParser.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPParser.cs	(revision 7538)
@@ -34,5 +34,4 @@
     public double[] Demands { get; private set; }
     public double[] Capacities { get; private set; }
-    public Exception Error { get; private set; }
 
     public CordeauGQAPParser() {
@@ -48,10 +47,9 @@
       Demands = null;
       Capacities = null;
-      Error = null;
     }
 
-    public bool Parse(string file) {
+    public void Parse(string file) {
       using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
-        return Parse(stream);
+        Parse(stream);
       }
     }
@@ -64,62 +62,53 @@
     /// </remarks>
     /// <param name="stream">The stream to read data from.</param>
-    /// <returns>True if the file was successfully read or false otherwise.</returns>
-    public bool Parse(Stream stream) {
-      Error = null;
+    public void Parse(Stream stream) {
       var separator = new char[] { ' ', '\t' };
-      try {
-        StreamReader reader = new StreamReader(stream);
-        string line = Continue(reader);
+      var reader = new StreamReader(stream);
+      string line = Continue(reader);
 
-        var info = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-        Equipments = int.Parse(info[0]);
-        Locations = int.Parse(info[1]);
-        TransportationCosts = double.Parse(info[2]);
+      var info = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+      Equipments = int.Parse(info[0]);
+      Locations = int.Parse(info[1]);
+      TransportationCosts = double.Parse(info[2]);
 
+      line = Continue(reader);
+
+      Weights = new double[Equipments, Equipments];
+      for (int i = 0; i < Equipments; i++) {
+        var weightsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+        for (int j = 0; j < Equipments; j++) {
+          Weights[i, j] = double.Parse(weightsPerEquipment[j], CultureInfo.InvariantCulture.NumberFormat);
+        }
         line = Continue(reader);
+      }
 
-        Weights = new double[Equipments, Equipments];
-        for (int i = 0; i < Equipments; i++) {
-          var weightsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-          for (int j = 0; j < Equipments; j++) {
-            Weights[i, j] = double.Parse(weightsPerEquipment[j], CultureInfo.InvariantCulture.NumberFormat);
-          }
-          line = Continue(reader);
+      Distances = new double[Locations, Locations];
+      for (int i = 0; i < Locations; i++) {
+        var distancePerLocation = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+        for (int j = 0; j < Locations; j++) {
+          Distances[i, j] = double.Parse(distancePerLocation[j], CultureInfo.InvariantCulture.NumberFormat);
         }
+        line = Continue(reader);
+      }
 
-        Distances = new double[Locations, Locations];
-        for (int i = 0; i < Locations; i++) {
-          var distancePerLocation = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-          for (int j = 0; j < Locations; j++) {
-            Distances[i, j] = double.Parse(distancePerLocation[j], CultureInfo.InvariantCulture.NumberFormat);
-          }
-          line = Continue(reader);
-        }
+      InstallationCosts = new double[Equipments, Locations];
+      for (int i = 0; i < Equipments; i++) {
+        var costsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+        for (int j = 0; j < Locations; j++)
+          InstallationCosts[i, j] = double.Parse(costsPerEquipment[j], CultureInfo.InvariantCulture.NumberFormat);
+        line = Continue(reader);
+      }
 
-        InstallationCosts = new double[Equipments, Locations];
-        for (int i = 0; i < Equipments; i++) {
-          var costsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-          for (int j = 0; j < Locations; j++)
-            InstallationCosts[i, j] = double.Parse(costsPerEquipment[j], CultureInfo.InvariantCulture.NumberFormat);
-          line = Continue(reader);
-        }
+      Demands = new double[Equipments];
+      var demandsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+      for (int i = 0; i < Equipments; i++)
+        Demands[i] = double.Parse(demandsPerEquipment[i], CultureInfo.InvariantCulture.NumberFormat);
 
-        Demands = new double[Equipments];
-        var demandsPerEquipment = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-        for (int i = 0; i < Equipments; i++)
-          Demands[i] = double.Parse(demandsPerEquipment[i], CultureInfo.InvariantCulture.NumberFormat);
+      line = Continue(reader);
 
-        line = Continue(reader);
-
-        Capacities = new double[Locations];
-        string[] capacityPerLocation = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-        for (int i = 0; i < Locations; i++)
-          Capacities[i] = double.Parse(capacityPerLocation[i], CultureInfo.InvariantCulture.NumberFormat);
-
-        return true;
-      } catch (Exception e) {
-        Error = e;
-        return false;
-      }
+      Capacities = new double[Locations];
+      string[] capacityPerLocation = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+      for (int i = 0; i < Locations; i++)
+        Capacities[i] = double.Parse(capacityPerLocation[i], CultureInfo.InvariantCulture.NumberFormat);
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/HeuristicLab.Problems.Instances.CordeauGQAP-3.3.csproj
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/HeuristicLab.Problems.Instances.CordeauGQAP-3.3.csproj	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/HeuristicLab.Problems.Instances.CordeauGQAP-3.3.csproj	(revision 7538)
@@ -111,5 +111,4 @@
     <None Include="Plugin.cs.frame" />
     <Compile Include="CordeauGQAPParser.cs" />
-    <Compile Include="CordeauGQAPInstance.cs" />
     <Compile Include="CordeauGQAPInstanceProvider.cs" />
     <Compile Include="CordeauGQAPInstanceDescriptor.cs" />
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,6 @@
   [Plugin("HeuristicLab.Problems.Instances.CordeauGQAP", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.CordeauGQAP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   public class HeuristicLabProblemsInstancesCordeauGQAPPlugin : PluginBase {
   }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,35 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances.ElloumiCTAP {
-  internal class ElloumiCTAPInstance : ICTAPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Processors { get; set; }
-    public int Tasks { get; set; }
-    public double[,] ExecutionCosts { get; set; }
-    public double[,] CommunicationCosts { get; set; }
-    public double[] MemoryRequirements { get; set; }
-    public double[] MemoryCapacities { get; set; }
-    public int[] BestKnownAssignment { get; set; }
-    public double? BestKnownQuality { get; set; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 7538)
@@ -28,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.ElloumiCTAP {
-  public class ElloumiCTAPInstanceProvider : ProblemInstanceProvider<ICTAPInstance> {
+  public class ElloumiCTAPInstanceProvider : ProblemInstanceProvider<CTAPInstance> {
     public override string Name {
       get { return "Elloumi's CTAP instances"; }
@@ -62,18 +62,11 @@
     }
 
-    public override ICTAPInstance GetInstance(IInstanceDescriptor id) {
+    public override CTAPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (ElloumiCTAPInstanceDescriptor)id;
-      var instance = new ElloumiCTAPInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
-        ElloumiCTAPParser datParser = new ElloumiCTAPParser();
-        datParser.Parse(stream);
-        if (datParser.Error != null) throw datParser.Error;
-        instance.Processors = datParser.Processors;
-        instance.Tasks = datParser.Tasks;
-        instance.ExecutionCosts = datParser.ExecutionCosts;
-        instance.CommunicationCosts = datParser.CommunicationCosts;
-        instance.MemoryRequirements = datParser.MemoryRequirements;
-        instance.MemoryCapacities = datParser.MemoryCapacities;
+        var parser = new ElloumiCTAPParser();
+        parser.Parse(stream);
+        var instance = Load(parser);
 
         instance.Name = id.Name;
@@ -91,5 +84,29 @@
           }
         }
+        return instance;
       }
+    }
+
+    public override CTAPInstance LoadInstance(string path) {
+      var parser = new ElloumiCTAPParser();
+      parser.Parse(path);
+      var instance = Load(parser);
+      instance.Name = Path.GetFileName(path);
+      instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now.ToString();
+      return instance;
+    }
+
+    public override void SaveInstance(CTAPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private CTAPInstance Load(ElloumiCTAPParser parser) {
+      var instance = new CTAPInstance();
+      instance.Processors = parser.Processors;
+      instance.Tasks = parser.Tasks;
+      instance.ExecutionCosts = parser.ExecutionCosts;
+      instance.CommunicationCosts = parser.CommunicationCosts;
+      instance.MemoryRequirements = parser.MemoryRequirements;
+      instance.MemoryCapacities = parser.MemoryCapacities;
       return instance;
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPParser.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPParser.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPParser.cs	(revision 7538)
@@ -32,5 +32,4 @@
     public double[] MemoryRequirements { get; private set; }
     public double[] MemoryCapacities { get; private set; }
-    public Exception Error { get; private set; }
 
     public ElloumiCTAPParser() {
@@ -45,10 +44,9 @@
       MemoryRequirements = null;
       MemoryCapacities = null;
-      Error = null;
     }
 
-    public bool Parse(string file) {
+    public void Parse(string file) {
       using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
-        return Parse(stream);
+        Parse(stream);
       }
     }
@@ -62,54 +60,47 @@
     /// <param name="stream">The stream to read data from.</param>
     /// <returns>True if the file was successfully read or false otherwise.</returns>
-    public bool Parse(Stream stream) {
-      Error = null;
+    public void Parse(Stream stream) {
       var separator = new char[] { ' ', '\t' };
-      try {
-        StreamReader reader = new StreamReader(stream);
-        string line = Continue(reader);
+      var reader = new StreamReader(stream);
+      string line = Continue(reader);
 
-        Tasks = int.Parse(line);
+      Tasks = int.Parse(line);
 
+      line = Continue(reader);
+
+      Processors = int.Parse(line);
+
+      line = Continue(reader);
+
+      ExecutionCosts = new double[Processors, Tasks];
+      for (int i = 0; i < Processors; i++) {
+        string[] costsPerTask = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+        for (int j = 0; j < Tasks; j++)
+          ExecutionCosts[i, j] = double.Parse(costsPerTask[j], CultureInfo.InvariantCulture.NumberFormat);
         line = Continue(reader);
+      }
 
-        Processors = int.Parse(line);
+      CommunicationCosts = new double[Tasks, Tasks];
+      for (int i = 0; i < Tasks - 1; i++) {
+        string[] costsTaskToTasks = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+        for (int j = i + 1; j < Tasks; j++) {
+          CommunicationCosts[i, j] = double.Parse(costsTaskToTasks[j - i - 1], CultureInfo.InvariantCulture.NumberFormat);
+          CommunicationCosts[j, i] = CommunicationCosts[i, j];
+        }
+        line = Continue(reader);
+      }
 
-        line = Continue(reader);
+      MemoryRequirements = new double[Tasks];
+      string[] requirementsPerTask = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+      for (int i = 0; i < Tasks; i++)
+        MemoryRequirements[i] = double.Parse(requirementsPerTask[i], CultureInfo.InvariantCulture.NumberFormat);
 
-        ExecutionCosts = new double[Processors, Tasks];
-        for (int i = 0; i < Processors; i++) {
-          string[] costsPerTask = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-          for (int j = 0; j < Tasks; j++)
-            ExecutionCosts[i, j] = double.Parse(costsPerTask[j], CultureInfo.InvariantCulture.NumberFormat);
-          line = Continue(reader);
-        }
+      line = Continue(reader);
 
-        CommunicationCosts = new double[Tasks, Tasks];
-        for (int i = 0; i < Tasks - 1; i++) {
-          string[] costsTaskToTasks = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-          for (int j = i + 1; j < Tasks; j++) {
-            CommunicationCosts[i, j] = double.Parse(costsTaskToTasks[j - i - 1], CultureInfo.InvariantCulture.NumberFormat);
-            CommunicationCosts[j, i] = CommunicationCosts[i, j];
-          }
-          line = Continue(reader);
-        }
+      MemoryCapacities = new double[Processors];
+      string[] capacitiesPerProcessor = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
+      for (int i = 0; i < Processors; i++)
+        MemoryCapacities[i] = double.Parse(capacitiesPerProcessor[i], CultureInfo.InvariantCulture.NumberFormat);
 
-        MemoryRequirements = new double[Tasks];
-        string[] requirementsPerTask = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-        for (int i = 0; i < Tasks; i++)
-          MemoryRequirements[i] = double.Parse(requirementsPerTask[i], CultureInfo.InvariantCulture.NumberFormat);
-
-        line = Continue(reader);
-
-        MemoryCapacities = new double[Processors];
-        string[] capacitiesPerProcessor = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
-        for (int i = 0; i < Processors; i++)
-          MemoryCapacities[i] = double.Parse(capacitiesPerProcessor[i], CultureInfo.InvariantCulture.NumberFormat);
-
-        return true;
-      } catch (Exception e) {
-        Error = e;
-        return false;
-      }
     }
 
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/HeuristicLab.Problems.Instances.ElloumiCTAP-3.3.csproj
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/HeuristicLab.Problems.Instances.ElloumiCTAP-3.3.csproj	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/HeuristicLab.Problems.Instances.ElloumiCTAP-3.3.csproj	(revision 7538)
@@ -133,5 +133,4 @@
     <EmbeddedResource Include="Data\tassc2005De.dat" />
     <None Include="Plugin.cs.frame" />
-    <Compile Include="ElloumiCTAPInstance.cs" />
     <Compile Include="ElloumiCTAPInstanceDescriptor.cs" />
     <Compile Include="ElloumiCTAPInstanceProvider.cs" />
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,6 @@
   [Plugin("HeuristicLab.Problems.Instances.ElloumiCTAP", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.ElloumiCTAP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   public class HeuristicLabProblemsInstancesElloumiCTAPPlugin : PluginBase {
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/HeuristicLab.Problems.Instances.QAPLIB-3.3.csproj
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/HeuristicLab.Problems.Instances.QAPLIB-3.3.csproj	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/HeuristicLab.Problems.Instances.QAPLIB-3.3.csproj	(revision 7538)
@@ -51,5 +51,4 @@
   <ItemGroup>
     <Compile Include="QAPLIBParser.cs" />
-    <Compile Include="QAPLIBInstance.cs" />
     <Compile Include="QAPLIBInstanceDescriptor.cs" />
     <Compile Include="QAPLIBSolutionParser.cs" />
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,6 @@
   [Plugin("HeuristicLab.Problems.Instances.QAPLIB", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.QAPLIB-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   public class HeuristicLabProblemsInstancesQAPLIBPlugin : PluginBase {
   }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,32 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances.QAPLIB {
-  internal class QAPLIBInstance : IQAPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Dimension { get; set; }
-    public double[,] Distances { get; set; }
-    public double[,] Weights { get; set; }
-    public int[] BestKnownAssignment { get; set; }
-    public double? BestKnownQuality { get; set; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 7538)
@@ -28,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.QAPLIB {
-  public class QAPLIBInstanceProvider : ProblemInstanceProvider<IQAPInstance> {
+  public class QAPLIBInstanceProvider : ProblemInstanceProvider<QAPInstance> {
     public override string Name {
       get { return "QAPLIB"; }
@@ -62,16 +62,11 @@
     }
 
-    public override IQAPInstance GetInstance(IInstanceDescriptor id) {
+    public override QAPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (QAPLIBInstanceDescriptor)id;
-      var instance = new QAPLIBInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
-        QAPLIBParser datParser = new QAPLIBParser();
-        datParser.Parse(stream);
-        if (datParser.Error != null) throw datParser.Error;
-        instance.Dimension = datParser.Size;
-        instance.Distances = datParser.Distances;
-        instance.Weights = datParser.Weights;
-
+        var parser = new QAPLIBParser();
+        parser.Parse(stream);
+        var instance = Load(parser);
         instance.Name = id.Name;
         instance.Description = id.Description;
@@ -80,5 +75,5 @@
           using (Stream solStream = Assembly.GetExecutingAssembly()
             .GetManifestResourceStream(descriptor.SolutionIdentifier)) {
-            QAPLIBSolutionParser slnParser = new QAPLIBSolutionParser();
+            var slnParser = new QAPLIBSolutionParser();
             slnParser.Parse(solStream, true);
             if (slnParser.Error != null) throw slnParser.Error;
@@ -88,5 +83,26 @@
           }
         }
+        return instance;
       }
+    }
+
+    public override QAPInstance LoadInstance(string path) {
+      var parser = new QAPLIBParser();
+      parser.Parse(path);
+      var instance = Load(parser);
+      instance.Name = Path.GetFileName(path);
+      instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now.ToString();
+      return instance;
+    }
+
+    public override void SaveInstance(QAPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private QAPInstance Load(QAPLIBParser parser) {
+      var instance = new QAPInstance();
+      instance.Dimension = parser.Size;
+      instance.Distances = parser.Distances;
+      instance.Weights = parser.Weights;
       return instance;
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBParser.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBParser.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBParser.cs	(revision 7538)
@@ -28,5 +28,4 @@
     public double[,] Distances { get; private set; }
     public double[,] Weights { get; private set; }
-    public Exception Error { get; private set; }
 
     public QAPLIBParser() {
@@ -38,10 +37,9 @@
       Distances = null;
       Weights = null;
-      Error = null;
     }
 
-    public bool Parse(string file) {
+    public void Parse(string file) {
       using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
-        return Parse(stream);
+        Parse(stream);
       }
     }
@@ -55,50 +53,32 @@
     /// <param name="stream">The stream to read data from.</param>
     /// <returns>True if the file was successfully read or false otherwise.</returns>
-    public bool Parse(Stream stream) {
-      Error = null;
-      try {
-        StreamReader reader = new StreamReader(stream);
-        Size = int.Parse(reader.ReadLine());
-        Distances = new double[Size, Size];
-        Weights = new double[Size, Size];
-        string valLine = null;
-        char[] delim = new char[] { ' ' };
-        int read = 0;
-        int k = 0;
-        while (k < Size) {
-          if (reader.EndOfStream) throw new InvalidDataException("Reached end of stream while reading first matrix.");
-          valLine = reader.ReadLine();
-          while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
-          string[] vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
-          foreach (string val in vals) {
-            Weights[k, read++] = double.Parse(val);
-            if (read == Size) {
-              read = 0;
-              k++;
-            }
+    public void Parse(Stream stream) {
+      var reader = new StreamReader(stream);
+      Size = int.Parse(reader.ReadLine());
+      Distances = new double[Size, Size];
+      Weights = new double[Size, Size];
+      char[] delim = new char[] { ' ' };
+
+      Distances = ParseMatrix(reader, delim);
+      Weights = ParseMatrix(reader, delim);
+    }
+
+    private double[,] ParseMatrix(StreamReader reader, char[] delim) {
+      int read = 0, k = 0;
+      double[,] result = new double[Size, Size];
+      while (k < Size) {
+        if (reader.EndOfStream) throw new InvalidDataException("Reached end of stream while reading second matrix.");
+        string valLine = reader.ReadLine();
+        while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
+        string[] vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
+        foreach (string val in vals) {
+          Distances[k, read++] = double.Parse(val);
+          if (read == Size) {
+            read = 0;
+            k++;
           }
         }
-
-        read = 0;
-        k = 0;
-
-        while (k < Size) {
-          if (reader.EndOfStream) throw new InvalidDataException("Reached end of stream while reading second matrix.");
-          valLine = reader.ReadLine();
-          while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
-          string[] vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
-          foreach (string val in vals) {
-            Distances[k, read++] = double.Parse(val);
-            if (read == Size) {
-              read = 0;
-              k++;
-            }
-          }
-        }
-        return true;
-      } catch (Exception e) {
-        Error = e;
-        return false;
       }
+      return result;
     }
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj	(revision 7538)
@@ -45,9 +45,6 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="TSPLIBATSPInstance.cs" />
     <Compile Include="TSPLIBATSPInstanceProvider.cs" />
-    <Compile Include="TSPLIBCVRPInstance.cs" />
     <Compile Include="TSPLIBCVRPInstanceProvider.cs" />
-    <Compile Include="TSPLIBTSPInstance.cs" />
     <Compile Include="TSPLIBInstanceDescriptor.cs" />
     <Compile Include="TSPLIBTSPInstanceProvider.cs" />
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,6 @@
   [Plugin("HeuristicLab.Problems.Instances.TSPLIB", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.TSPLIB-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   public class HeuristicLabProblemsInstancesTSPLIBPlugin : PluginBase {
   }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,32 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances.TSPLIB {
-  internal class TSPLIBATSPInstance : IATSPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Dimension { get; set; }
-    public double[,] Distances { get; set; }
-    public double[,] Coordinates { get; set; }
-    public int[] BestKnownTour { get; set; }
-    public double? BestKnownQuality { get; set; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs	(revision 7538)
@@ -28,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.TSPLIB {
-  public class TSPLIBATSPInstanceProvider : ProblemInstanceProvider<IATSPInstance> {
+  public class TSPLIBATSPInstanceProvider : ProblemInstanceProvider<ATSPInstance> {
 
     public override string Name {
@@ -65,19 +65,9 @@
     }
 
-    public override IATSPInstance GetInstance(IInstanceDescriptor id) {
+    public override ATSPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (TSPLIBInstanceDescriptor)id;
-      var instance = new TSPLIBATSPInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
-        var parser = new TSPLIBParser(stream);
-        parser.Parse();
-        instance.Dimension = parser.Dimension;
-        instance.Coordinates = parser.DisplayVertices != null ? parser.DisplayVertices : parser.Vertices;
-        instance.Distances = parser.Distances;
-
-        instance.Name = parser.Name;
-        instance.Description = parser.Comment
-          + Environment.NewLine + Environment.NewLine
-          + GetDescription();
+        var instance = Load(new TSPLIBParser(stream));
 
         if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
@@ -89,5 +79,29 @@
           }
         }
+        return instance;
       }
+    }
+
+    public override ATSPInstance LoadInstance(string path) {
+      return Load(new TSPLIBParser(path));
+    }
+
+    public override void SaveInstance(ATSPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private ATSPInstance Load(TSPLIBParser parser) {
+      var instance = new ATSPInstance();
+
+      parser.Parse();
+      instance.Dimension = parser.Dimension;
+      instance.Coordinates = parser.DisplayVertices != null ? parser.DisplayVertices : parser.Vertices;
+      instance.Distances = parser.Distances;
+
+      instance.Name = parser.Name;
+      instance.Description = parser.Comment
+        + Environment.NewLine + Environment.NewLine
+        + GetDescription();
+
       return instance;
     }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,36 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances.TSPLIB {
-  internal class TSPLIBCVRPInstance : ICVRPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Dimension { get; set; }
-    public CVRPDistanceMeasure DistanceMeasure { get; set; }
-    public double? MaximumVehicles { get; set; }
-    public double Capacity { get; set; }
-    public double[,] Distances { get; set; }
-    public double[,] Coordinates { get; set; }
-    public double[] Demands { get; set; }
-    public int[][] BestKnownTour { get; set; }
-    public double? BestKnownQuality { get; set; }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs	(revision 7538)
@@ -28,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.TSPLIB {
-  public class TSPLIBCVRPInstanceProvider : ProblemInstanceProvider<ICVRPInstance> {
+  public class TSPLIBCVRPInstanceProvider : ProblemInstanceProvider<CVRPInstance> {
 
     public override string Name {
@@ -64,42 +64,9 @@
     }
 
-    public override ICVRPInstance GetInstance(IInstanceDescriptor id) {
+    public override CVRPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (TSPLIBInstanceDescriptor)id;
-      var instance = new TSPLIBCVRPInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
-        var parser = new TSPLIBParser(stream);
-        parser.Parse();
-        instance.Dimension = parser.Dimension;
-        instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices;
-        instance.Distances = parser.Distances;
-        instance.Capacity = parser.Capacity.Value;
-        instance.Demands = parser.Demands;
-        switch (parser.EdgeWeightType) {
-          case TSPLIBEdgeWeightTypes.ATT:
-            instance.DistanceMeasure = CVRPDistanceMeasure.Att; break;
-          case TSPLIBEdgeWeightTypes.CEIL_2D:
-            instance.DistanceMeasure = CVRPDistanceMeasure.UpperEuclidean; break;
-          case TSPLIBEdgeWeightTypes.EUC_2D:
-          case TSPLIBEdgeWeightTypes.EUC_3D:
-            instance.DistanceMeasure = CVRPDistanceMeasure.RoundedEuclidean; break;
-          case TSPLIBEdgeWeightTypes.EXPLICIT:
-            instance.DistanceMeasure = CVRPDistanceMeasure.Direct; break;
-          case TSPLIBEdgeWeightTypes.GEO:
-            instance.DistanceMeasure = CVRPDistanceMeasure.Geo; break;
-          case TSPLIBEdgeWeightTypes.MAN_2D:
-          case TSPLIBEdgeWeightTypes.MAN_3D:
-            instance.DistanceMeasure = CVRPDistanceMeasure.Manhattan; break;
-          case TSPLIBEdgeWeightTypes.MAX_2D:
-          case TSPLIBEdgeWeightTypes.MAX_3D:
-            instance.DistanceMeasure = CVRPDistanceMeasure.Maximum; break;
-          default:
-            throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
-        }
-
-        instance.Name = parser.Name;
-        instance.Description = parser.Comment
-          + Environment.NewLine + Environment.NewLine
-          + GetDescription();
+        var instance = Load(new TSPLIBParser(stream));
 
         if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
@@ -111,5 +78,51 @@
           }
         }
+        return instance;
       }
+    }
+
+    public override CVRPInstance LoadInstance(string path) {
+      return Load(new TSPLIBParser(path));
+    }
+
+    public override void SaveInstance(CVRPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private CVRPInstance Load(TSPLIBParser parser) {
+      parser.Parse();
+      var instance = new CVRPInstance();
+      instance.Dimension = parser.Dimension;
+      instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices;
+      instance.Distances = parser.Distances;
+      instance.Capacity = parser.Capacity.Value;
+      instance.Demands = parser.Demands;
+      switch (parser.EdgeWeightType) {
+        case TSPLIBEdgeWeightTypes.ATT:
+          instance.DistanceMeasure = CVRPDistanceMeasure.Att; break;
+        case TSPLIBEdgeWeightTypes.CEIL_2D:
+          instance.DistanceMeasure = CVRPDistanceMeasure.UpperEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EUC_2D:
+        case TSPLIBEdgeWeightTypes.EUC_3D:
+          instance.DistanceMeasure = CVRPDistanceMeasure.RoundedEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EXPLICIT:
+          instance.DistanceMeasure = CVRPDistanceMeasure.Direct; break;
+        case TSPLIBEdgeWeightTypes.GEO:
+          instance.DistanceMeasure = CVRPDistanceMeasure.Geo; break;
+        case TSPLIBEdgeWeightTypes.MAN_2D:
+        case TSPLIBEdgeWeightTypes.MAN_3D:
+          instance.DistanceMeasure = CVRPDistanceMeasure.Manhattan; break;
+        case TSPLIBEdgeWeightTypes.MAX_2D:
+        case TSPLIBEdgeWeightTypes.MAX_3D:
+          instance.DistanceMeasure = CVRPDistanceMeasure.Maximum; break;
+        default:
+          throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
+      }
+
+      instance.Name = parser.Name;
+      instance.Description = parser.Comment
+        + Environment.NewLine + Environment.NewLine
+        + GetDescription();
+
       return instance;
     }
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,108 +1,0 @@
-﻿#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;
-namespace HeuristicLab.Problems.Instances.TSPLIB {
-  internal class TSPLIBTSPInstance : ITSPInstance {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Dimension { get; set; }
-    public TSPDistanceMeasure DistanceMeasure { get; set; }
-    public double[,] Distances { get; set; }
-    public double[,] Coordinates { get; set; }
-    public int[] BestKnownTour { get; set; }
-    public double? BestKnownQuality { get; set; }
-
-    public double[,] GetDistanceMatrix() {
-      if (Distances != null) return Distances;
-      Distances = new double[Dimension, Dimension];
-      for (int i = 0; i < Dimension - 1; i++)
-        for (int j = i + 1; j < Dimension; j++) {
-          Distances[i, j] = GetDistance(i, j);
-          Distances[j, i] = Distances[i, j];
-        }
-      return Distances;
-    }
-
-    private double GetDistance(int i, int j) {
-      switch (DistanceMeasure) {
-        case TSPDistanceMeasure.Att:
-          return AttDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
-        case TSPDistanceMeasure.Direct:
-          return Distances[i, j];
-        case TSPDistanceMeasure.Euclidean:
-          return EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
-        case TSPDistanceMeasure.Geo:
-          return GeoDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
-        case TSPDistanceMeasure.Manhattan:
-          return ManhattanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
-        case TSPDistanceMeasure.Maximum:
-          return MaximumDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
-        case TSPDistanceMeasure.RoundedEuclidean:
-          return Math.Round(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
-        case TSPDistanceMeasure.UpperEuclidean:
-          return Math.Ceiling(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
-        default:
-          throw new InvalidOperationException("Distance measure is not known.");
-      }
-    }
-
-    private double AttDistance(double x1, double y1, double x2, double y2) {
-      return Math.Ceiling(Math.Sqrt(((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / 10.0));
-    }
-
-    private double EuclideanDistance(double x1, double y1, double x2, double y2) {
-      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
-    }
-
-    private const double PI = 3.141592;
-    private const double RADIUS = 6378.388;
-    private double GeoDistance(double x1, double y1, double x2, double y2) {
-      double latitude1, longitude1, latitude2, longitude2;
-      double q1, q2, q3;
-      double length;
-
-      latitude1 = ConvertToRadian(x1);
-      longitude1 = ConvertToRadian(y1);
-      latitude2 = ConvertToRadian(x2);
-      longitude2 = ConvertToRadian(y2);
-
-      q1 = Math.Cos(longitude1 - longitude2);
-      q2 = Math.Cos(latitude1 - latitude2);
-      q3 = Math.Cos(latitude1 + latitude2);
-
-      length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
-      return (length);
-    }
-
-    private double ConvertToRadian(double x) {
-      return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
-    }
-
-    private double ManhattanDistance(double x1, double y1, double x2, double y2) {
-      return Math.Round(Math.Abs(x1 - x2) + Math.Abs(y1 - y2), MidpointRounding.AwayFromZero);
-    }
-
-    private double MaximumDistance(double x1, double y1, double x2, double y2) {
-      return Math.Max(Math.Round(Math.Abs(x1 - x2), MidpointRounding.AwayFromZero), Math.Round(Math.Abs(y1 - y2), MidpointRounding.AwayFromZero));
-    }
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs	(revision 7538)
@@ -28,5 +28,5 @@
 
 namespace HeuristicLab.Problems.Instances.TSPLIB {
-  public class TSPLIBTSPInstanceProvider : ProblemInstanceProvider<ITSPInstance> {
+  public class TSPLIBTSPInstanceProvider : ProblemInstanceProvider<TSPInstance> {
 
     public override string Name {
@@ -65,45 +65,10 @@
     }
 
-    public override ITSPInstance GetInstance(IInstanceDescriptor id) {
+    public override TSPInstance LoadInstance(IInstanceDescriptor id) {
       var descriptor = (TSPLIBInstanceDescriptor)id;
-      var instance = new TSPLIBTSPInstance();
       using (var stream = Assembly.GetExecutingAssembly()
         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
         var parser = new TSPLIBParser(stream);
-        parser.Parse();
-        if (parser.FixedEdges != null) throw new InvalidDataException("TSP instance " + parser.Name + " contains fixed edges which are not supported by HeuristicLab.");
-
-        instance.Dimension = parser.Dimension;
-        instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices;
-        instance.Distances = parser.Distances;
-        switch (parser.EdgeWeightType) {
-          case TSPLIBEdgeWeightTypes.ATT:
-            instance.DistanceMeasure = TSPDistanceMeasure.Att; break;
-          case TSPLIBEdgeWeightTypes.CEIL_2D:
-            instance.DistanceMeasure = TSPDistanceMeasure.UpperEuclidean; break;
-          case TSPLIBEdgeWeightTypes.EUC_2D:
-            instance.DistanceMeasure = TSPDistanceMeasure.RoundedEuclidean; break;
-          case TSPLIBEdgeWeightTypes.EUC_3D:
-            throw new InvalidDataException("3D coordinates are not supported.");
-          case TSPLIBEdgeWeightTypes.EXPLICIT:
-            instance.DistanceMeasure = TSPDistanceMeasure.Direct; break;
-          case TSPLIBEdgeWeightTypes.GEO:
-            instance.DistanceMeasure = TSPDistanceMeasure.Geo; break;
-          case TSPLIBEdgeWeightTypes.MAN_2D:
-            instance.DistanceMeasure = TSPDistanceMeasure.Manhattan; break;
-          case TSPLIBEdgeWeightTypes.MAN_3D:
-            throw new InvalidDataException("3D coordinates are not supported.");
-          case TSPLIBEdgeWeightTypes.MAX_2D:
-            instance.DistanceMeasure = TSPDistanceMeasure.Maximum; break;
-          case TSPLIBEdgeWeightTypes.MAX_3D:
-            throw new InvalidDataException("3D coordinates are not supported.");
-          default:
-            throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
-        }
-
-        instance.Name = parser.Name;
-        instance.Description = parser.Comment
-          + Environment.NewLine + Environment.NewLine
-          + GetDescription();
+        var instance = Load(parser);
 
         if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
@@ -115,5 +80,52 @@
           }
         }
+        return instance;
       }
+    }
+
+    public override TSPInstance LoadInstance(string path) {
+      return Load(new TSPLIBParser(path));
+    }
+
+    public override void SaveInstance(TSPInstance instance, string path) {
+      throw new NotSupportedException();
+    }
+
+    private TSPInstance Load(TSPLIBParser parser) {
+      parser.Parse();
+      if (parser.FixedEdges != null) throw new InvalidDataException("TSP instance " + parser.Name + " contains fixed edges which are not supported by HeuristicLab.");
+      var instance = new TSPInstance();
+      instance.Dimension = parser.Dimension;
+      instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices;
+      instance.Distances = parser.Distances;
+      switch (parser.EdgeWeightType) {
+        case TSPLIBEdgeWeightTypes.ATT:
+          instance.DistanceMeasure = TSPDistanceMeasure.Att; break;
+        case TSPLIBEdgeWeightTypes.CEIL_2D:
+          instance.DistanceMeasure = TSPDistanceMeasure.UpperEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EUC_2D:
+          instance.DistanceMeasure = TSPDistanceMeasure.RoundedEuclidean; break;
+        case TSPLIBEdgeWeightTypes.EUC_3D:
+          throw new InvalidDataException("3D coordinates are not supported.");
+        case TSPLIBEdgeWeightTypes.EXPLICIT:
+          instance.DistanceMeasure = TSPDistanceMeasure.Direct; break;
+        case TSPLIBEdgeWeightTypes.GEO:
+          instance.DistanceMeasure = TSPDistanceMeasure.Geo; break;
+        case TSPLIBEdgeWeightTypes.MAN_2D:
+          instance.DistanceMeasure = TSPDistanceMeasure.Manhattan; break;
+        case TSPLIBEdgeWeightTypes.MAN_3D:
+          throw new InvalidDataException("3D coordinates are not supported.");
+        case TSPLIBEdgeWeightTypes.MAX_2D:
+          instance.DistanceMeasure = TSPDistanceMeasure.Maximum; break;
+        case TSPLIBEdgeWeightTypes.MAX_3D:
+          throw new InvalidDataException("3D coordinates are not supported.");
+        default:
+          throw new InvalidDataException("The given edge weight is not supported by HeuristicLab.");
+      }
+
+      instance.Name = parser.Name;
+      instance.Description = parser.Comment
+        + Environment.NewLine + Environment.NewLine
+        + GetDescription();
       return instance;
     }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ClassDiagram1.cd
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ClassDiagram1.cd	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ClassDiagram1.cd	(revision 7538)
@@ -0,0 +1,96 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.Instances.ProblemInstanceProvider&lt;TInstance&gt;" Collapsed="true" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="5.5" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAIAgAAAAAAAAAAQAAAAAAAAAgAACAAAAEUA=</HashCode>
+      <FileName>ProblemInstanceProvider.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.ATSPInstance" Collapsed="true">
+    <Position X="4" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAIgAAAAAAAAAAQAIAEAQABAAAAAAAAAAAA=</HashCode>
+      <FileName>Instances\ATSPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.CTAPInstance" Collapsed="true">
+    <Position X="4" Y="2.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAEAAAAABAgAAAAAAAAgAQAAAMAQAAAAAAIAAAAIAA=</HashCode>
+      <FileName>Instances\CTAPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.CVRPInstance" Collapsed="true">
+    <Position X="4" Y="3.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAIAAAAAAKgAAAAAAAAAAQCIAEAQABAAAAAAIAAAAA=</HashCode>
+      <FileName>Instances\CVRPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.GQAPInstance" Collapsed="true">
+    <Position X="4" Y="4" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAEAAAAAACgAAAAAAIAAAQAAAFAAABAAEAAAAgAAkA=</HashCode>
+      <FileName>Instances\GQAPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.QAPInstance" Collapsed="true">
+    <Position X="4" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAEAAAAAAAgAAAAAAAAAAQAAAEAQABAAEAAAAAAAAA=</HashCode>
+      <FileName>Instances\QAPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.Instances.TSPInstance" Collapsed="true">
+    <Position X="4" Y="5.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>ACAIAABAAAIgAAAAAAAAAAQAIAFIQABAACAAAACQACA=</HashCode>
+      <FileName>Instances\TSPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Interface Name="HeuristicLab.Problems.Instances.IInstanceDescriptor" Collapsed="true">
+    <Position X="3.5" Y="0.5" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IInstanceDescriptor.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.Instances.IConsumable&lt;TInstance&gt;">
+    <Position X="6.25" Y="0.5" Width="3.25" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA=</HashCode>
+      <FileName>IConsumable.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.Instances.IProblemInstanceProvider">
+    <Position X="0.75" Y="0.5" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAIAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAEA=</HashCode>
+      <FileName>IProblemInstanceProvider.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.Instances.IProblemInstanceProvider&lt;TInstance&gt;">
+    <Position X="0.5" Y="2.75" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAACAAAAEQA=</HashCode>
+      <FileName>IProblemInstanceProvider.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Enum Name="HeuristicLab.Problems.Instances.CVRPDistanceMeasure" Collapsed="true">
+    <Position X="6.25" Y="3.25" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>ggACAAAAAAAAAABBAAAAAAAAAACAQAAAAAAAQAAAAAA=</HashCode>
+      <FileName>Instances\CVRPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Enum Name="HeuristicLab.Problems.Instances.TSPDistanceMeasure" Collapsed="true">
+    <Position X="6.25" Y="5.5" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>ggACAAAAAAAAAABBAAAAAAAAAACAQAAAAAAAQAAAAAA=</HashCode>
+      <FileName>Instances\TSPInstance.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj	(revision 7538)
@@ -51,13 +51,15 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="ClassDiagram1.cd" />
     <None Include="Plugin.cs.frame" />
-    <Compile Include="Instances\IATSPInstance.cs" />
-    <Compile Include="Instances\ICTAPInstance.cs" />
+    <Compile Include="IExportable.cs" />
+    <Compile Include="Instances\ATSPInstance.cs" />
+    <Compile Include="Instances\CTAPInstance.cs" />
     <Compile Include="IInstanceDescriptor.cs" />
-    <Compile Include="Instances\ICVRPInstance.cs" />
-    <Compile Include="Instances\IGQAPInstance.cs" />
-    <Compile Include="Instances\IQAPInstance.cs" />
-    <Compile Include="Instances\ITSPInstance.cs" />
-    <Compile Include="IProblemInstanceConsumer.cs" />
+    <Compile Include="Instances\CVRPInstance.cs" />
+    <Compile Include="Instances\GQAPInstance.cs" />
+    <Compile Include="Instances\QAPInstance.cs" />
+    <Compile Include="Instances\TSPInstance.cs" />
+    <Compile Include="IConsumable.cs" />
     <Compile Include="IProblemInstanceProvider.cs" />
     <Compile Include="Plugin.cs" />
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IConsumable.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IConsumable.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IConsumable.cs	(revision 7538)
@@ -0,0 +1,26 @@
+﻿#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
+
+namespace HeuristicLab.Problems.Instances {
+  public interface IConsumable<TInstance> {
+    bool LoadFrom(TInstance instance);
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IExportable.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IExportable.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IExportable.cs	(revision 7538)
@@ -0,0 +1,26 @@
+﻿#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
+
+namespace HeuristicLab.Problems.Instances {
+  public interface IExportable<TInstance> {
+    void ExportTo(TInstance instance);
+  }
+}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IProblemInstanceConsumer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IProblemInstanceConsumer.cs	(revision 7537)
+++ 	(revision )
@@ -1,28 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances {
-  public interface IProblemInstanceConsumer { }
-
-  public interface IProblemInstanceConsumer<TInstance> : IProblemInstanceConsumer {
-    bool LoadFrom(TInstance instance);
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 7538)
@@ -30,15 +30,14 @@
     Uri WebLink { get; }
     string ReferencePublication { get; }
-
-    bool ConsumerCanBeFed { get; }
-
-    void SetConsumer(IProblemInstanceConsumer consumer);
-    bool FeedConsumer(IInstanceDescriptor descriptor);
-
-    IEnumerable<IInstanceDescriptor> GetInstanceDescriptors();
   }
 
   public interface IProblemInstanceProvider<TInstance> : IProblemInstanceProvider {
-    TInstance GetInstance(IInstanceDescriptor descriptor);
+    IConsumable<TInstance> Consumer { get; set; }
+
+    IEnumerable<IInstanceDescriptor> GetInstanceDescriptors();
+    TInstance LoadInstance(IInstanceDescriptor descriptor);
+    TInstance LoadInstance(string path);
+
+    void SaveInstance(TInstance instance, string path);
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ATSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ATSPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ATSPInstance.cs	(revision 7538)
@@ -0,0 +1,63 @@
+﻿#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
+
+
+namespace HeuristicLab.Problems.Instances {
+  /// <summary>
+  /// Describe instances of the Asymmetric Traveling Salesman Problem (ATSP).
+  /// </summary>
+  public class ATSPInstance {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of cities.
+    /// </summary>
+    public int Dimension { get; set; }
+    /// <summary>
+    /// The distances are given in form of a distance matrix.
+    /// </summary>
+    public double[,] Distances { get; set; }
+    /// <summary>
+    /// Optional! A a matrix of dimension [N, 2] where each row is one of the cities
+    /// and the colmns represent x and y coordinates respectively.
+    /// </summary>
+    /// <remarks>
+    /// The coordinates are for display purposes only.
+    /// </remarks>
+    public double[,] Coordinates { get; set; }
+
+    /// <summary>
+    /// Optional! The best-known tour in path-encoding.
+    /// </summary>
+    public int[] BestKnownTour { get; set; }
+    /// <summary>
+    /// Optional! The quality of the best-known tour.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CTAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CTAPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CTAPInstance.cs	(revision 7538)
@@ -0,0 +1,70 @@
+﻿#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
+
+namespace HeuristicLab.Problems.Instances {
+  /// <summary>
+  /// Describes instances of the Capacitated Task Assignment Problem (CTAP).
+  /// </summary>
+  public class CTAPInstance {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number M of processors
+    /// </summary>
+    public int Processors { get; set; }
+    /// <summary>
+    /// The number N of tasks
+    /// </summary>
+    public int Tasks { get; set; }
+    /// <summary>
+    /// An MxN Matrix with M = |Processors| and N = |Tasks|
+    /// </summary>
+    public double[,] ExecutionCosts { get; set; }
+    /// <summary>
+    /// An NxN Matrix with N = |Tasks|
+    /// </summary>
+    public double[,] CommunicationCosts { get; set; }
+    /// <summary>
+    /// An array of length N with N = |Tasks|
+    /// </summary>
+    public double[] MemoryRequirements { get; set; }
+    /// <summary>
+    /// An array of length M with M = |Processors|
+    /// </summary>
+    public double[] MemoryCapacities { get; set; }
+
+    /// <summary>
+    /// Optional! An array of length N with N = |Tasks|
+    /// </summary>
+    public int[] BestKnownAssignment { get; set; }
+    /// <summary>
+    /// Optional! The quality value of the <see cref="BestKnownAssignment"/>
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CVRPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CVRPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/CVRPInstance.cs	(revision 7538)
@@ -0,0 +1,93 @@
+﻿#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
+
+
+namespace HeuristicLab.Problems.Instances {
+  public enum CVRPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
+
+  /// <summary>
+  /// Describes instances of the Capacitated Vehicle Routing Problem (CVRP).
+  /// </summary>
+  public class CVRPInstance {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of customers and the depot
+    /// </summary>
+    public int Dimension { get; set; }
+    /// <summary>
+    /// The distance measure that is used to calculate the distance between
+    ///the coordinates if no <see cref="Distances"/> is given.
+    /// </summary>
+    public CVRPDistanceMeasure DistanceMeasure { get; set; }
+    /// <summary>
+    /// Optional! The maximum number of vehicles that can be used.
+    /// </summary>
+    /// <remarks>
+    /// If no number is given, but a maximum is required, it can be assumed that
+    /// the maximum number of vehicles is equal to the number of customers as
+    /// there cannot be more than one vehicle per customer.
+    /// </remarks>
+    public double? MaximumVehicles { get; set; }
+    /// <summary>
+    /// The capacity of the vehicles, which is the same for all (homogeneous fleet).
+    /// </summary>
+    public double Capacity { get; set; }
+    /// <summary>
+    /// Optional! The distances are given in form of a distance matrix.
+    /// </summary>
+    /// <remarks>
+    /// Either Distances or the <see cref="Coordinates"/> need to be specified along
+    /// with a distance measure.
+    /// </remarks>
+    public double[,] Distances { get; set; }
+    /// <summary>
+    /// Optional! A a matrix of dimension [N, 2] where each row is either the customer
+    /// or the depot and the columns represent x and y coordinates respectively.
+    /// </summary>
+    /// <remarks>
+    /// Either <see cref="Distances"/> or the Coordinates need to be specified along
+    /// with a distance measure.
+    /// </remarks>
+    public double[,] Coordinates { get; set; }
+    /// <summary>
+    /// The demand vector that specifies how many goods need to be delivered.
+    /// The vector has to include the depot, but with a demand of 0.
+    /// </summary>
+    public double[] Demands { get; set; }
+
+    /// <summary>
+    /// Optional! The best-known solution as a list of tours in path-encoding.
+    /// </summary>
+    public int[][] BestKnownTour { get; set; }
+    /// <summary>
+    /// Optional! The quality of the best-known solution.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/GQAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/GQAPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/GQAPInstance.cs	(revision 7538)
@@ -0,0 +1,78 @@
+﻿#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
+
+namespace HeuristicLab.Problems.Instances {
+  /// <summary>
+  /// Describes an instance of the Generalized Quadratic Assignment Problem (GQAP).
+  /// </summary>
+  public class GQAPInstance {
+    /// <summary>
+    /// The name of the instance.
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// A description of the instance.
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// |E| = The number of equipments are to be assigned in this instance.
+    /// </summary>
+    public int Equipments { get; set; }
+    /// <summary>
+    /// |L| = The number of locations that are available for the equipments.
+    /// </summary>
+    public int Locations { get; set; }
+    /// <summary>
+    /// Vector of length |E| that describes the space demand for the equipments.
+    /// </summary>
+    public double[] Demands { get; set; }
+    /// <summary>
+    /// Vector of length |L| that describes the space capacity for the locations.
+    /// </summary>
+    public double[] Capacities { get; set; }
+    /// <summary>
+    /// |E|x|E| matrix with the weights (flows) between the equipments. These describe the strength of the respective bonding.
+    /// </summary>
+    public double[,] Weights { get; set; }
+    /// <summary>
+    /// |L|x|L| matrix with the distances between the locations.
+    /// </summary>
+    public double[,] Distances { get; set; }
+    /// <summary>
+    /// |E|x|L| matrix that describes the costs of installing equipment x at location y.
+    /// </summary>
+    public double[,] InstallationCosts { get; set; }
+    /// <summary>
+    /// A factor that scales the weights.
+    /// </summary>
+    public double TransportationCosts { get; set; }
+
+    /// <summary>
+    /// Optional! The best-known assignment is a vector of length |E| with numbers ranging from 0 to |L| - 1
+    /// </summary>
+    public int[] BestKnownAssignment { get; set; }
+    /// <summary>
+    /// Optional! The quality of the best-known assignment.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IATSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IATSPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,63 +1,0 @@
-﻿#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
-
-
-namespace HeuristicLab.Problems.Instances {
-  /// <summary>
-  /// Describe instances of the Asymmetric Traveling Salesman Problem (ATSP).
-  /// </summary>
-  public interface IATSPInstance {
-    /// <summary>
-    /// The name of the instance
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// Optional! The description of the instance
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// The number of cities.
-    /// </summary>
-    int Dimension { get; }
-    /// <summary>
-    /// The distances are given in form of a distance matrix.
-    /// </summary>
-    double[,] Distances { get; }
-    /// <summary>
-    /// Optional! A a matrix of dimension [N, 2] where each row is one of the cities
-    /// and the colmns represent x and y coordinates respectively.
-    /// </summary>
-    /// <remarks>
-    /// The coordinates are for display purposes only.
-    /// </remarks>
-    double[,] Coordinates { get; }
-
-    /// <summary>
-    /// Optional! The best-known tour in path-encoding.
-    /// </summary>
-    int[] BestKnownTour { get; }
-    /// <summary>
-    /// Optional! The quality of the best-known tour.
-    /// </summary>
-    double? BestKnownQuality { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ICTAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ICTAPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,70 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances {
-  /// <summary>
-  /// Describes instances of the Capacitated Task Assignment Problem (CTAP).
-  /// </summary>
-  public interface ICTAPInstance {
-    /// <summary>
-    /// The name of the instance
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// Optional! The description of the instance
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// The number M of processors
-    /// </summary>
-    int Processors { get; }
-    /// <summary>
-    /// The number N of tasks
-    /// </summary>
-    int Tasks { get; }
-    /// <summary>
-    /// An MxN Matrix with M = |Processors| and N = |Tasks|
-    /// </summary>
-    double[,] ExecutionCosts { get; }
-    /// <summary>
-    /// An NxN Matrix with N = |Tasks|
-    /// </summary>
-    double[,] CommunicationCosts { get; }
-    /// <summary>
-    /// An array of length N with N = |Tasks|
-    /// </summary>
-    double[] MemoryRequirements { get; }
-    /// <summary>
-    /// An array of length M with M = |Processors|
-    /// </summary>
-    double[] MemoryCapacities { get; }
-
-    /// <summary>
-    /// Optional! An array of length N with N = |Tasks|
-    /// </summary>
-    int[] BestKnownAssignment { get; }
-    /// <summary>
-    /// Optional! The quality value of the <see cref="BestKnownAssignment"/>
-    /// </summary>
-    double? BestKnownQuality { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ICVRPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ICVRPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,93 +1,0 @@
-﻿#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
-
-
-namespace HeuristicLab.Problems.Instances {
-  public enum CVRPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
-
-  /// <summary>
-  /// Describes instances of the Capacitated Vehicle Routing Problem (CVRP).
-  /// </summary>
-  public interface ICVRPInstance {
-    /// <summary>
-    /// The name of the instance
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// Optional! The description of the instance
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// The number of customers and the depot
-    /// </summary>
-    int Dimension { get; }
-    /// <summary>
-    /// The distance measure that is used to calculate the distance between
-    ///the coordinates if no <see cref="Distances"/> is given.
-    /// </summary>
-    CVRPDistanceMeasure DistanceMeasure { get; }
-    /// <summary>
-    /// Optional! The maximum number of vehicles that can be used.
-    /// </summary>
-    /// <remarks>
-    /// If no number is given, but a maximum is required, it can be assumed that
-    /// the maximum number of vehicles is equal to the number of customers as
-    /// there cannot be more than one vehicle per customer.
-    /// </remarks>
-    double? MaximumVehicles { get; }
-    /// <summary>
-    /// The capacity of the vehicles, which is the same for all (homogeneous fleet).
-    /// </summary>
-    double Capacity { get; }
-    /// <summary>
-    /// Optional! The distances are given in form of a distance matrix.
-    /// </summary>
-    /// <remarks>
-    /// Either Distances or the <see cref="Coordinates"/> need to be specified along
-    /// with a distance measure.
-    /// </remarks>
-    double[,] Distances { get; }
-    /// <summary>
-    /// Optional! A a matrix of dimension [N, 2] where each row is either the customer
-    /// or the depot and the columns represent x and y coordinates respectively.
-    /// </summary>
-    /// <remarks>
-    /// Either <see cref="Distances"/> or the Coordinates need to be specified along
-    /// with a distance measure.
-    /// </remarks>
-    double[,] Coordinates { get; }
-    /// <summary>
-    /// The demand vector that specifies how many goods need to be delivered.
-    /// The vector has to include the depot, but with a demand of 0.
-    /// </summary>
-    double[] Demands { get; }
-
-    /// <summary>
-    /// Optional! The best-known solution as a list of tours in path-encoding.
-    /// </summary>
-    int[][] BestKnownTour { get; }
-    /// <summary>
-    /// Optional! The quality of the best-known solution.
-    /// </summary>
-    double? BestKnownQuality { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IGQAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IGQAPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,78 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances {
-  /// <summary>
-  /// Describes an instance of the Generalized Quadratic Assignment Problem (GQAP).
-  /// </summary>
-  public interface IGQAPInstance {
-    /// <summary>
-    /// The name of the instance.
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// A description of the instance.
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// |E| = The number of equipments are to be assigned in this instance.
-    /// </summary>
-    int Equipments { get; }
-    /// <summary>
-    /// |L| = The number of locations that are available for the equipments.
-    /// </summary>
-    int Locations { get; }
-    /// <summary>
-    /// Vector of length |E| that describes the space demand for the equipments.
-    /// </summary>
-    double[] Demands { get; }
-    /// <summary>
-    /// Vector of length |L| that describes the space capacity for the locations.
-    /// </summary>
-    double[] Capacities { get; }
-    /// <summary>
-    /// |E|x|E| matrix with the weights (flows) between the equipments. These describe the strength of the respective bonding.
-    /// </summary>
-    double[,] Weights { get; }
-    /// <summary>
-    /// |L|x|L| matrix with the distances between the locations.
-    /// </summary>
-    double[,] Distances { get; }
-    /// <summary>
-    /// |E|x|L| matrix that describes the costs of installing equipment x at location y.
-    /// </summary>
-    double[,] InstallationCosts { get; }
-    /// <summary>
-    /// A factor that scales the weights.
-    /// </summary>
-    double TransportationCosts { get; }
-
-    /// <summary>
-    /// Optional! The best-known assignment is a vector of length |E| with numbers ranging from 0 to |L| - 1
-    /// </summary>
-    int[] BestKnownAssignment { get; }
-    /// <summary>
-    /// Optional! The quality of the best-known assignment.
-    /// </summary>
-    double? BestKnownQuality { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IQAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/IQAPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,58 +1,0 @@
-﻿#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
-
-namespace HeuristicLab.Problems.Instances {
-  /// <summary>
-  /// Describes instances of the Quadratic Assignment Problem (QAP).
-  /// </summary>
-  public interface IQAPInstance {
-    /// <summary>
-    /// The name of the instance
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// Optional! The description of the instance
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// The number of facilities (and also the number of locations)
-    /// </summary>
-    int Dimension { get; }
-    /// <summary>
-    /// An NxN Matrix with N = |Faciliies|
-    /// </summary>
-    double[,] Distances { get; }
-    /// <summary>
-    /// An NxN Matrix with N = |Faciliies|
-    /// </summary>
-    double[,] Weights { get; }
-
-    /// <summary>
-    /// Optional! An array of length N with N = |Facilities|
-    /// </summary>
-    int[] BestKnownAssignment { get; }
-    /// <summary>
-    /// Optional! The quality value of the <see cref="BestKnownAssignment"/>
-    /// </summary>
-    double? BestKnownQuality { get; }
-  }
-}
Index: anches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ITSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/ITSPInstance.cs	(revision 7537)
+++ 	(revision )
@@ -1,83 +1,0 @@
-﻿#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
-
-
-namespace HeuristicLab.Problems.Instances {
-  public enum TSPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
-
-  /// <summary>
-  /// Describes instances of the Traveling Salesman Problem (TSP).
-  /// </summary>
-  public interface ITSPInstance {
-    /// <summary>
-    /// The name of the instance
-    /// </summary>
-    string Name { get; }
-    /// <summary>
-    /// Optional! The description of the instance
-    /// </summary>
-    string Description { get; }
-
-    /// <summary>
-    /// The number of cities.
-    /// </summary>
-    int Dimension { get; }
-    /// <summary>
-    /// Specifies the distance measure that is to be used.
-    /// </summary>
-    TSPDistanceMeasure DistanceMeasure { get; }
-    /// <summary>
-    /// Optional! The distances are given in form of a distance matrix.
-    /// </summary>
-    /// <remarks>
-    /// Either this property or <see cref="Coordinates"/> needs to be specified.
-    /// </remarks>
-    double[,] Distances { get; }
-    /// <summary>
-    /// Optional! A a matrix of dimension [N, 2] matrix where each row is one of the cities
-    /// and the colmns represent x and y coordinates respectively.
-    /// </summary>
-    /// <remarks>
-    /// Either this property or <see cref="Distances"/> needs to be specified.
-    /// 
-    /// If no distance matrix is given, the distances have to be calculated by the
-    /// specified distance measure. If a distance matrix is given in addtion to the
-    /// coordinates, the distance matrix takes precedence and the coordinates are
-    /// for display only.
-    /// </remarks>
-    double[,] Coordinates { get; }
-
-    /// <summary>
-    /// Optional! The best-known tour in path-encoding.
-    /// </summary>
-    int[] BestKnownTour { get; }
-    /// <summary>
-    /// Optional! The quality of the best-known tour.
-    /// </summary>
-    double? BestKnownQuality { get; }
-
-    /// <summary>
-    /// If only the coordinates are given, can calculate the distance matrix.
-    /// </summary>
-    /// <returns>A full distance matrix between all cities.</returns>
-    double[,] GetDistanceMatrix();
-  }
-}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/QAPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/QAPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/QAPInstance.cs	(revision 7538)
@@ -0,0 +1,58 @@
+﻿#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
+
+namespace HeuristicLab.Problems.Instances {
+  /// <summary>
+  /// Describes instances of the Quadratic Assignment Problem (QAP).
+  /// </summary>
+  public class QAPInstance {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of facilities (and also the number of locations)
+    /// </summary>
+    public int Dimension { get; set; }
+    /// <summary>
+    /// An NxN Matrix with N = |Faciliies|
+    /// </summary>
+    public double[,] Distances { get; set; }
+    /// <summary>
+    /// An NxN Matrix with N = |Faciliies|
+    /// </summary>
+    public double[,] Weights { get; set; }
+
+    /// <summary>
+    /// Optional! An array of length N with N = |Facilities|
+    /// </summary>
+    public int[] BestKnownAssignment { get; set; }
+    /// <summary>
+    /// Optional! The quality value of the <see cref="BestKnownAssignment"/>
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/TSPInstance.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/TSPInstance.cs	(revision 7538)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Instances/TSPInstance.cs	(revision 7538)
@@ -0,0 +1,158 @@
+﻿#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;
+
+namespace HeuristicLab.Problems.Instances {
+  public enum TSPDistanceMeasure { Direct, Euclidean, RoundedEuclidean, UpperEuclidean, Geo, Manhattan, Maximum, Att };
+
+  /// <summary>
+  /// Describes instances of the Traveling Salesman Problem (TSP).
+  /// </summary>
+  public class TSPInstance {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of cities.
+    /// </summary>
+    public int Dimension { get; set; }
+    /// <summary>
+    /// Specifies the distance measure that is to be used.
+    /// </summary>
+    public TSPDistanceMeasure DistanceMeasure { get; set; }
+    /// <summary>
+    /// Optional! The distances are given in form of a distance matrix.
+    /// </summary>
+    /// <remarks>
+    /// Either this property or <see cref="Coordinates"/> needs to be specified.
+    /// </remarks>
+    public double[,] Distances { get; set; }
+    /// <summary>
+    /// Optional! A a matrix of dimension [N, 2] matrix where each row is one of the cities
+    /// and the colmns represent x and y coordinates respectively.
+    /// </summary>
+    /// <remarks>
+    /// Either this property or <see cref="Distances"/> needs to be specified.
+    /// 
+    /// If no distance matrix is given, the distances have to be calculated by the
+    /// specified distance measure. If a distance matrix is given in addtion to the
+    /// coordinates, the distance matrix takes precedence and the coordinates are
+    /// for display only.
+    /// </remarks>
+    public double[,] Coordinates { get; set; }
+
+    /// <summary>
+    /// Optional! The best-known tour in path-encoding.
+    /// </summary>
+    public int[] BestKnownTour { get; set; }
+    /// <summary>
+    /// Optional! The quality of the best-known tour.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+
+    /// <summary>
+    /// If only the coordinates are given, can calculate the distance matrix.
+    /// </summary>
+    /// <returns>A full distance matrix between all cities.</returns>
+    public double[,] GetDistanceMatrix() {
+      if (Distances != null) return Distances;
+      Distances = new double[Dimension, Dimension];
+      for (int i = 0; i < Dimension - 1; i++)
+        for (int j = i + 1; j < Dimension; j++) {
+          Distances[i, j] = GetDistance(i, j);
+          Distances[j, i] = Distances[i, j];
+        }
+      return Distances;
+    }
+
+    #region Private Helpers
+    private double GetDistance(int i, int j) {
+      switch (DistanceMeasure) {
+        case TSPDistanceMeasure.Att:
+          return AttDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
+        case TSPDistanceMeasure.Direct:
+          return Distances[i, j];
+        case TSPDistanceMeasure.Euclidean:
+          return EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
+        case TSPDistanceMeasure.Geo:
+          return GeoDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
+        case TSPDistanceMeasure.Manhattan:
+          return ManhattanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
+        case TSPDistanceMeasure.Maximum:
+          return MaximumDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]);
+        case TSPDistanceMeasure.RoundedEuclidean:
+          return Math.Round(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
+        case TSPDistanceMeasure.UpperEuclidean:
+          return Math.Ceiling(EuclideanDistance(Coordinates[i, 0], Coordinates[i, 1], Coordinates[j, 0], Coordinates[j, 1]));
+        default:
+          throw new InvalidOperationException("Distance measure is not known.");
+      }
+    }
+
+    private double AttDistance(double x1, double y1, double x2, double y2) {
+      return Math.Ceiling(Math.Sqrt(((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / 10.0));
+    }
+
+    private double EuclideanDistance(double x1, double y1, double x2, double y2) {
+      return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+    }
+
+    private const double PI = 3.141592;
+    private const double RADIUS = 6378.388;
+    private double GeoDistance(double x1, double y1, double x2, double y2) {
+      double latitude1, longitude1, latitude2, longitude2;
+      double q1, q2, q3;
+      double length;
+
+      latitude1 = ConvertToRadian(x1);
+      longitude1 = ConvertToRadian(y1);
+      latitude2 = ConvertToRadian(x2);
+      longitude2 = ConvertToRadian(y2);
+
+      q1 = Math.Cos(longitude1 - longitude2);
+      q2 = Math.Cos(latitude1 - latitude2);
+      q3 = Math.Cos(latitude1 + latitude2);
+
+      length = (int)(RADIUS * Math.Acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) * q3)) + 1.0);
+      return (length);
+    }
+
+    private double ConvertToRadian(double x) {
+      return PI * (Math.Truncate(x) + 5.0 * (x - Math.Truncate(x)) / 3.0) / 180.0;
+    }
+
+    private double ManhattanDistance(double x1, double y1, double x2, double y2) {
+      return Math.Round(Math.Abs(x1 - x2) + Math.Abs(y1 - y2), MidpointRounding.AwayFromZero);
+    }
+
+    private double MaximumDistance(double x1, double y1, double x2, double y2) {
+      return Math.Max(Math.Round(Math.Abs(x1 - x2), MidpointRounding.AwayFromZero), Math.Round(Math.Abs(y1 - y2), MidpointRounding.AwayFromZero));
+    }
+    #endregion
+  }
+}
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Plugin.cs.frame
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Plugin.cs.frame	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/Plugin.cs.frame	(revision 7538)
@@ -25,4 +25,5 @@
   [Plugin("HeuristicLab.Problems.Instances", "3.3.6.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
   public class HeuristicLabProblemsInstancesPlugin : PluginBase {
   }
Index: /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 7537)
+++ /branches/GeneralizedQAP/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 7538)
@@ -24,6 +24,6 @@
 
 namespace HeuristicLab.Problems.Instances {
-  public abstract class ProblemInstanceProvider<T> : IProblemInstanceProvider<T> {
-    private IProblemInstanceConsumer<T> Consumer { get; set; }
+  public abstract class ProblemInstanceProvider<TInstance> : IProblemInstanceProvider<TInstance> {
+    public virtual IConsumable<TInstance> Consumer { get; set; }
 
     public abstract string Name { get; }
@@ -32,22 +32,10 @@
     public abstract string ReferencePublication { get; }
 
-    public bool ConsumerCanBeFed {
-      get { return Consumer != null; }
-    }
-
-    public void SetConsumer(IProblemInstanceConsumer consumer) {
-      if (consumer is IProblemInstanceConsumer<T>)
-        Consumer = (IProblemInstanceConsumer<T>)consumer;
-      else Consumer = null;
-    }
-
-    public bool FeedConsumer(IInstanceDescriptor descriptor) {
-      return Consumer.LoadFrom(GetInstance(descriptor));
-    }
-
     public abstract IEnumerable<IInstanceDescriptor> GetInstanceDescriptors();
 
-    public abstract T GetInstance(IInstanceDescriptor descriptor);
+    public abstract TInstance LoadInstance(IInstanceDescriptor descriptor);
+    public abstract TInstance LoadInstance(string path);
 
+    public abstract void SaveInstance(TInstance instance, string path);
   }
 }
Index: /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs	(revision 7537)
+++ /branches/GeneralizedQAP/UnitTests/CordeauCrossoverTest.cs	(revision 7538)
@@ -34,5 +34,5 @@
     public void CordeauCrossoverFunctionalityTest() {
       var provider = new CordeauGQAPInstanceProvider();
-      var instance = provider.GetInstance(provider.GetInstanceDescriptors().First());
+      var instance = provider.LoadInstance(provider.GetInstanceDescriptors().First());
       var gqap = new GeneralizedQuadraticAssignmentProblem();
       gqap.LoadFrom(instance);
Index: /branches/GeneralizedQAP/UnitTests/CordeauGQAPInstanceProviderTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/CordeauGQAPInstanceProviderTest.cs	(revision 7537)
+++ /branches/GeneralizedQAP/UnitTests/CordeauGQAPInstanceProviderTest.cs	(revision 7538)
@@ -36,5 +36,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
Index: /branches/GeneralizedQAP/UnitTests/ElloumiCTAPInstanceProviderTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/ElloumiCTAPInstanceProviderTest.cs	(revision 7537)
+++ /branches/GeneralizedQAP/UnitTests/ElloumiCTAPInstanceProviderTest.cs	(revision 7538)
@@ -36,5 +36,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
Index: /branches/GeneralizedQAP/UnitTests/QAPLIBInstanceProviderTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/QAPLIBInstanceProviderTest.cs	(revision 7537)
+++ /branches/GeneralizedQAP/UnitTests/QAPLIBInstanceProviderTest.cs	(revision 7538)
@@ -37,5 +37,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
@@ -55,5 +55,5 @@
       var target = new QAPLIBInstanceProvider();
       foreach (var id in target.GetInstanceDescriptors()) {
-        var instance = target.GetInstance(id);
+        var instance = target.LoadInstance(id);
         for (int i = 0; i < instance.Dimension; i++)
           if (instance.Distances[i, i] != 0 || instance.Weights[i, i] != 0) {
Index: /branches/GeneralizedQAP/UnitTests/TSPLIBInstanceProviderTest.cs
===================================================================
--- /branches/GeneralizedQAP/UnitTests/TSPLIBInstanceProviderTest.cs	(revision 7537)
+++ /branches/GeneralizedQAP/UnitTests/TSPLIBInstanceProviderTest.cs	(revision 7538)
@@ -36,5 +36,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
@@ -53,5 +53,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
@@ -70,5 +70,5 @@
       foreach (var id in target.GetInstanceDescriptors()) {
         try {
-          target.GetInstance(id);
+          target.LoadInstance(id);
         } catch (Exception ex) {
           erroneousInstances.AppendLine(id.Name + ": " + ex.Message);
