Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/atsp.qual
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/atsp.qual	(revision 14697)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/atsp.qual	(revision 14697)
@@ -0,0 +1,19 @@
+br17;39
+ft53;6905
+ft70;38673
+ftv33;1286
+ftv35;1473
+ftv38;1530
+ftv44;1613
+ftv47;1776
+ftv55;1608
+ftv64;1839
+ftv70;1950
+ftv170;2755
+kro124p;36230
+p43;5620
+rbg323;1326
+rbg358;1163
+rbg403;2465
+rbg443;2720
+ry48p;14422
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/tsp.qual
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/tsp.qual	(revision 14697)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/Data/tsp.qual	(revision 14697)
@@ -0,0 +1,110 @@
+a280;2579
+ali535;202339
+att48;10628
+att532;27686
+bayg29;1610
+bays29;2020
+berlin52;7542
+bier127;118282
+brazil58;25395
+brd14051;469385
+brg180;1950
+burma14;3323
+ch130;6110
+ch150;6528
+d1291;50801
+d15112;1573084
+d1655;62128
+d18512;645238
+d198;15780
+d2103;80450
+d493;35002
+d657;48912
+dantzig42;699
+dsj1000;18660188
+eil101;629
+eil51;426
+eil76;538
+fl1400;20127
+fl1577;22249
+fl3795;28772
+fl417;11861
+fnl4461;182566
+fri26;937
+gil262;2378
+gr120;6942
+gr137;69853
+gr17;2085
+gr202;40160
+gr21;2707
+gr229;134602
+gr24;1272
+gr431;171414
+gr48;5046
+gr666;294358
+gr96;55209
+hk48;11461
+kroA100;21282
+kroA150;26524
+kroA200;29368
+kroB100;22141
+kroB150;26130
+kroB200;29437
+kroC100;20749
+kroD100;21294
+kroE100;22068
+lin105;14379
+lin318;42029
+nrw1379;56638
+p654;34643
+pa561;2763
+pcb1173;56892
+pcb3038;137694
+pcb442;50778
+pla33810;66048945
+pla7397;23260728
+pla85900;142382641
+pr1002;259045
+pr107;44303
+pr124;59030
+pr136;96772
+pr144;58537
+pr152;73682
+pr226;80369
+pr2392;378032
+pr264;49135
+pr299;48191
+pr439;107217
+pr76;108159
+rat195;2323
+rat575;6773
+rat783;8806
+rat99;1211
+rd100;7910
+rd400;15281
+rl11849;923288
+rl1304;252948
+rl1323;270199
+rl1889;316536
+rl5915;565530
+rl5934;556045
+si1032;92650
+si175;21407
+si535;48450
+st70;675
+swiss42;1273
+ts225;126643
+tsp225;3916
+u1060;224094
+u1432;152970
+u159;42080
+u1817;57201
+u2152;64253
+u2319;234256
+u574;36905
+u724;41910
+ulysses16;6859
+ulysses22;7013
+usa13509;19982859
+vm1084;239297
+vm1748;336556
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj	(revision 14697)
@@ -130,4 +130,6 @@
     <EmbeddedResource Include="Data\tsp.opt.tour.zip" />
     <EmbeddedResource Include="Data\vrp.zip" />
+    <EmbeddedResource Include="Data\tsp.qual" />
+    <EmbeddedResource Include="Data\atsp.qual" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="Plugin.cs" />
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBATSPInstanceProvider.cs	(revision 14697)
@@ -56,4 +56,8 @@
       instance.BestKnownTour = parser.Tour.FirstOrDefault();
     }
+
+    protected override void LoadQuality(double? bestQuality, ATSPData instance) {
+      instance.BestKnownQuality = bestQuality;
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBCVRPInstanceProvider.cs	(revision 14697)
@@ -78,4 +78,8 @@
       instance.BestKnownTour = parser.Tour;
     }
+
+    protected override void LoadQuality(double? bestQuality, CVRPData instance) {
+      instance.BestKnownQuality = bestQuality;
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBDataDescriptor.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBDataDescriptor.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBDataDescriptor.cs	(revision 14697)
@@ -27,10 +27,12 @@
     internal string InstanceIdentifier { get; set; }
     internal string SolutionIdentifier { get; set; }
+    internal double? BestQuality { get; set; }
 
-    internal TSPLIBDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier) {
+    internal TSPLIBDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier, double? bestQuality) {
       this.Name = name;
       this.Description = description;
       this.InstanceIdentifier = instanceIdentifier;
       this.SolutionIdentifier = solutionIdentifier;
+      this.BestQuality = bestQuality;
     }
   }
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHeterogeneousPTSPDataDescriptor.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHeterogeneousPTSPDataDescriptor.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHeterogeneousPTSPDataDescriptor.cs	(revision 14697)
@@ -26,5 +26,5 @@
 
     internal TSPLIBHeterogeneousPTSPDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier, int seed)
-      : base(name, description, instanceIdentifier, solutionIdentifier) {
+      : base(name, description, instanceIdentifier, solutionIdentifier, null) {
       this.Name = name;
       this.Description = description;
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHomogeneousPTSPDataDescriptor.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHomogeneousPTSPDataDescriptor.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHomogeneousPTSPDataDescriptor.cs	(revision 14697)
@@ -25,5 +25,5 @@
 
     internal TSPLIBHomogeneousPTSPDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier, double probability)
-      : base(name, description, instanceIdentifier, solutionIdentifier) {
+      : base(name, description, instanceIdentifier, solutionIdentifier, null) {
       this.Name = name;
       this.Description = description;
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 14697)
@@ -47,4 +47,5 @@
     protected abstract T LoadInstance(TSPLIBParser parser, IDataDescriptor descriptor = null);
     protected abstract void LoadSolution(TSPLIBParser parser, T instance);
+    protected abstract void LoadQuality(double? bestQuality, T instance);
 
     public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
@@ -57,4 +58,16 @@
         }
       }
+
+      Dictionary<string, double> qualities = new Dictionary<string, double>();
+      var qualitiesArchiveName = GetResourceName(FileExtension + @"\.qual");
+      if (!String.IsNullOrEmpty(qualitiesArchiveName)) {
+        using (var qualitiesReader = new StreamReader(GetType().Assembly.GetManifestResourceStream(qualitiesArchiveName))) {
+          while (!qualitiesReader.EndOfStream) {
+            var line = qualitiesReader.ReadLine().Split(';');
+            qualities.Add(line[0] + "." + FileExtension, double.Parse(line[1]));
+          }
+        }
+      }
+
       var instanceArchiveName = GetResourceName(FileExtension + @"\.zip");
       if (String.IsNullOrEmpty(instanceArchiveName)) yield break;
@@ -62,5 +75,9 @@
       using (var instanceStream = new ZipArchive(GetType().Assembly.GetManifestResourceStream(instanceArchiveName), ZipArchiveMode.Read)) {
         foreach (var entry in instanceStream.Entries.Select(x => x.Name).OrderBy(x => x)) {
-          yield return new TSPLIBDataDescriptor(Path.GetFileNameWithoutExtension(entry), GetInstanceDescription(), entry, solutions.ContainsKey(entry) ? solutions[entry] : String.Empty);
+          yield return new TSPLIBDataDescriptor(Path.GetFileNameWithoutExtension(entry),
+                                                GetInstanceDescription(),
+                                                entry,
+                                                solutions.ContainsKey(entry) ? solutions[entry] : String.Empty,
+                                                qualities.ContainsKey(entry) ? (double?)qualities[entry] : null);
         }
       }
@@ -75,4 +92,5 @@
         var parser = new TSPLIBParser(stream);
         var instance = LoadInstance(parser, id);
+        LoadQuality(descriptor.BestQuality, instance);
 
         if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBPTSPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBPTSPInstanceProvider.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBPTSPInstanceProvider.cs	(revision 14697)
@@ -81,4 +81,8 @@
     }
 
+    protected override void LoadQuality(double? bestQuality, PTSPData instance) {
+      instance.BestKnownQuality = bestQuality;
+    }
+
     public PTSPData LoadData(string tspFile, string tourFile, double? bestQuality) {
       var data = LoadInstance(new TSPLIBParser(tspFile));
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBTSPInstanceProvider.cs	(revision 14697)
@@ -81,4 +81,8 @@
     }
 
+    protected override void LoadQuality(double? bestQuality, TSPData instance) {
+      instance.BestKnownQuality = bestQuality;
+    }
+
     public TSPData LoadData(string tspFile, string tourFile, double? bestQuality) {
       var data = LoadInstance(new TSPLIBParser(tspFile));
