Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Parsers/QAPLIBParser.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Parsers/QAPLIBParser.cs	(revision 5562)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Parsers/QAPLIBParser.cs	(revision 5563)
@@ -21,7 +21,21 @@
 
     public bool Parse(string file) {
+      using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
+        return Parse(stream);
+      }
+    }
+
+    /// <summary>
+    /// Reads from the given stream data which is expected to be in the QAPLIB format.
+    /// </summary>
+    /// <remarks>
+    /// The stream is not closed or disposed. The caller has to take care of that.
+    /// </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;
       try {
-        StreamReader reader = new StreamReader(file);
+        StreamReader reader = new StreamReader(stream);
         Size = int.Parse(reader.ReadLine());
         Distances = new double[Size, Size];
@@ -65,5 +79,4 @@
         return false;
       }
-
     }
   }
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Plugin.cs.frame
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Plugin.cs.frame	(revision 5562)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/Plugin.cs.frame	(revision 5563)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Problems.QuadraticAssignment {
-  [Plugin("HeuristicLab.Problems.QuadraticAssignment", "3.3.0.$WCREV$")]
+  [Plugin("HeuristicLab.Problems.QuadraticAssignment", "3.3.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.QuadraticAssignment-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Collections", "3.3.3")]
Index: branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 5562)
+++ branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 5563)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Drawing;
 using System.IO;
@@ -39,4 +40,6 @@
   [StorableClass]
   public sealed class QuadraticAssignmentProblem : SingleObjectiveProblem<IQAPEvaluator, IPermutationCreator> {
+    private static string InstancePrefix = "HeuristicLab.Problems.QuadraticAssignment.Data.";
+
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
@@ -82,4 +85,15 @@
       get { return UseDistanceMatrixParameter.Value; }
       set { UseDistanceMatrixParameter.Value = value; }
+    }
+
+    public IEnumerable<string> EmbeddedInstances {
+      get {
+        return Assembly.GetExecutingAssembly()
+          .GetManifestResourceNames()
+          .Where(x => x.EndsWith(".dat"))
+          .OrderBy(x => x)
+          .Select(x => x.Replace(".dat", String.Empty))
+          .Select(x => x.Replace(InstancePrefix, String.Empty));
+      }
     }
     #endregion
@@ -93,11 +107,4 @@
     public QuadraticAssignmentProblem()
       : base() {
-      RandomPermutationCreator solutionCreator = new RandomPermutationCreator();
-      solutionCreator.LengthParameter.Value = new IntValue(5);
-      solutionCreator.PermutationParameter.ActualName = "Assignment";
-      QAPEvaluator evaluator = new QAPEvaluator();
-
-      Parameters.Add(new ValueParameter<IPermutationCreator>("SolutionCreator", "The operator which should be used to create new solutions.", solutionCreator));
-      Parameters.Add(new ValueParameter<IQAPEvaluator>("Evaluator", "The operator which should be used to evaluate solutions.", evaluator));
       Parameters.Add(new ValueParameter<Permutation>("BestKnownSolution", "The best known solution which is updated whenever a new better solution is found or may be the optimal solution if it is known beforehand.", null));
       Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The coordinates of the locations."));
@@ -105,4 +112,6 @@
       Parameters.Add(new ValueParameter<DoubleMatrix>("DistanceMatrix", "The distance matrix which can either be specified directly without the coordinates, or can be calculated automatically from the coordinates.", new DoubleMatrix(5, 5)));
       Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "Defaults to true, set to false only when the number of facilities is very high and a distance matrix would become too large (>1000 facilities).", new BoolValue(true)));
+
+      Maximization = new BoolValue(false);
 
       Coordinates = new DoubleMatrix(new double[,] {
@@ -130,6 +139,11 @@
       });
 
-      ParameterizeSolutionCreator();
-      ParameterizeEvaluator();
+      RandomPermutationCreator solutionCreator = new RandomPermutationCreator();
+      solutionCreator.LengthParameter.Value = new IntValue(5);
+      solutionCreator.PermutationParameter.ActualName = "Assignment";
+      QAPEvaluator evaluator = new QAPEvaluator();
+
+      SolutionCreatorParameter.Value = solutionCreator;
+      EvaluatorParameter.Value = evaluator;
 
       InitializeOperators();
@@ -186,15 +200,20 @@
     private void InitializeOperators() {
       Operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>());
+      ParameterizeOperators();
     }
     private void ParameterizeSolutionCreator() {
-      SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.Absolute);
-      SolutionCreator.LengthParameter.Value = new IntValue(Weights.Rows);
+      if (SolutionCreator != null) {
+        SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.Absolute);
+        SolutionCreator.LengthParameter.Value = new IntValue(Weights.Rows);
+      }
     }
     private void ParameterizeEvaluator() {
-      Evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
-      Evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
-      Evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
-      Evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-      Evaluator.WeightsParameter.ActualName = WeightsParameter.Name;
+      if (Evaluator != null) {
+        Evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+        Evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        Evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        Evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        Evaluator.WeightsParameter.ActualName = WeightsParameter.Name;
+      }
     }
     private void ParameterizeOperators() {
@@ -209,16 +228,19 @@
         op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
       }
-      string inversionMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>().First().InversionMoveParameter.ActualName;
-      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>())
-        op.InversionMoveParameter.ActualName = inversionMove;
-      string translocationMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>().First().TranslocationMoveParameter.ActualName;
-      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>())
-        op.TranslocationMoveParameter.ActualName = translocationMove;
-    }
-    #endregion
-
-    public void ImportFromQAPLib(string filename) {
+      if (Operators.OfType<IMoveGenerator>().Any()) {
+        string inversionMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>().First().InversionMoveParameter.ActualName;
+        foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>())
+          op.InversionMoveParameter.ActualName = inversionMove;
+        string translocationMove = Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>().First().TranslocationMoveParameter.ActualName;
+        foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>())
+          op.TranslocationMoveParameter.ActualName = translocationMove;
+      }
+    }
+    #endregion
+
+    public void ImportFileInstance(string filename) {
       QAPLIBParser parser = new QAPLIBParser();
       parser.Parse(filename);
+      Coordinates = new DoubleMatrix();
       DistanceMatrix = new DoubleMatrix(parser.Distances);
       Weights = new DoubleMatrix(parser.Weights);
@@ -228,4 +250,19 @@
       OnReset();
     }
+
+    public void LoadEmbeddedInstance(string instance) {
+      using (Stream stream = Assembly.GetExecutingAssembly()
+        .GetManifestResourceStream(InstancePrefix + instance + ".dat")) {
+        QAPLIBParser parser = new QAPLIBParser();
+        parser.Parse(stream);
+        Coordinates = new DoubleMatrix();
+        DistanceMatrix = new DoubleMatrix(parser.Distances);
+        Weights = new DoubleMatrix(parser.Weights);
+        UseDistanceMatrix.Value = true;
+        Name = "Quadratic Assignment Problem (loaded instance " + instance + ")";
+        Description = "Loaded embedded problem data of instance " + instance + ".";
+        OnReset();
+      }
+    }
   }
 }
