Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs	(revision 14053)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs	(revision 14055)
@@ -23,7 +23,5 @@
 
 namespace HeuristicLab.Problems.BinPacking3D {
-  /// <summary>
-  /// Describes instances of the regular three dimensional bin packing problem (3DBPP).
-  /// </summary>
+
   public class BPPData {
     /// <summary>
@@ -39,14 +37,7 @@
     /// The number of items.
     /// </summary>
-    public int Items { get; set; }
-    /// <summary>
-    /// The measures of the bin.
-    /// </summary>
-    public int[] BinMeasures { get; set; }
-    /// <summary>
-    /// The measures of the items.
-    /// </summary>
-    public int[][] ItemMeasures { get; set; }
-
+    public int NumItems { get { return Items == null ? 0 : Items.Length; } }
+    public PackingShape BinShape { get; set; }
+    public PackingItem[] Items { get; set; }
     /// <summary>
     /// Optional! The quality of the best-known solution.
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPInstanceProvider.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPInstanceProvider.cs	(revision 14053)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPInstanceProvider.cs	(revision 14055)
@@ -30,5 +30,5 @@
 using HeuristicLab.Problems.Instances;
 
-namespace HeuristicLab.Problems.BinPacking3D { 
+namespace HeuristicLab.Problems.BinPacking3D {
   public class BPPORLIBInstanceProvider : ProblemInstanceProvider<BPPData>, IProblemInstanceProvider<BPPData> {
 
@@ -42,5 +42,5 @@
 
     public override Uri WebLink {
-      get { return new Uri("http://people.brunel.ac.uk/~mastjjb/jeb/orlib/binpacktwoinfo.html , http://www.diku.dk/~pisinger/new3dbpp/readme.3dbpp"); }
+      get { return new Uri("http://www.diku.dk/~pisinger/new3dbpp/readme.3dbpp"); }
     }
 
@@ -59,7 +59,7 @@
           if (string.IsNullOrWhiteSpace(entry.Name)) continue;
           yield return new BPPORLIBDataDescriptor(
-            name: Path.GetFileNameWithoutExtension(entry.Name), 
-            description: GetDescription(), 
-            instanceIdentifier: entry.FullName, 
+            name: Path.GetFileNameWithoutExtension(entry.Name),
+            description: GetDescription(),
+            instanceIdentifier: entry.FullName,
             solutionIdentifier: null);
         }
@@ -74,7 +74,5 @@
 
         using (var stream = entry.Open()) {
-          var parser = new BPPORLIBParser();
-          parser.Parse(stream);
-          var instance = Load(parser);
+          var instance = BPPORLIBParser.Parse(stream);
           instance.Name = id.Name;
           instance.Description = id.Description;
@@ -89,18 +87,7 @@
     }
     public override BPPData ImportData(string path) {
-      var parser = new BPPORLIBParser();
-      parser.Parse(path);
-      var instance = Load(parser);
+      var instance = BPPORLIBParser.Parse(path);
       instance.Name = Path.GetFileName(path);
       instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now;
-      return instance;
-    }
-
-    private BPPData Load(BPPORLIBParser parser) {
-      var instance = new BPPData {
-        Items = parser.Items,
-        BinMeasures = parser.BinMeasures,
-        ItemMeasures = parser.ItemMeasures
-      };
       return instance;
     }
@@ -111,12 +98,5 @@
 
     public override void ExportData(BPPData instance, string path) {
-      var parser = new BPPORLIBParser {
-        Name = instance.Name,
-        Description = instance.Description,
-        Items = instance.Items,
-        BinMeasures = instance.BinMeasures,
-        ItemMeasures = instance.ItemMeasures
-      };
-      parser.Export(path);
+      BPPORLIBParser.Export(instance, path);
     }
 
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPORLIBParser.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPORLIBParser.cs	(revision 14053)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPORLIBParser.cs	(revision 14055)
@@ -25,31 +25,14 @@
 
 namespace HeuristicLab.Problems.BinPacking3D {
-  public class BPPORLIBParser {
-    public string Name { get; set; }
-    public string Description { get; set; }
-    public int Items { get; set; }
-    public int[] BinMeasures { get; set; }
-    public int[][] ItemMeasures { get; set; }
-
-    public BPPORLIBParser() {
-      Reset();
-    }
-
-    public void Reset() {
-      Name = Description = String.Empty;
-      Items = 0;
-      BinMeasures = null;
-      ItemMeasures = null;
-    }
-
-    public void Parse(string file) {
+  public static class BPPORLIBParser {
+    public static BPPData Parse(string file) {
       using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
-        Parse(stream);
+        return Parse(stream);
       }
     }
 
-    public void Export(string file) {
+    public static void Export(BPPData instance, string file) {
       using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
-        Export(stream);
+        Export(instance, stream);
       }
     }
@@ -62,80 +45,59 @@
     /// </remarks>
     /// <param name="stream">The stream to read data from.</param>
-    /// <returns>True if the file was successfully read or false otherwise.</returns>
-    public void Parse(Stream stream) {
-      var reader = new StreamReader(stream);
-      var delim = new char[] { ' ', '\t' };
-      var problemClass = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+    /// <returns>The parsed problem instance</returns>
+    public static BPPData Parse(Stream stream) {
+      using (var reader = new StreamReader(stream)) {
+        var instance = new BPPData();
+        var delim = new char[] { ' ', '\t' };
+        var problemClass = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
 
-      var nrOfItems = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
-      Items = int.Parse(nrOfItems[0]);
-      //Numbering of instances..
-      reader.ReadLine();
-      var binMeasures = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
-      int depth;
-      bool isThreeDimensional = false;
-      if (int.TryParse(binMeasures[2], out depth)) {
-        isThreeDimensional = true;
-        BinMeasures = new int[3];
-        BinMeasures[0] = int.Parse(binMeasures[0]);
-        BinMeasures[1] = int.Parse(binMeasures[1]);
-        BinMeasures[2] = depth;
-      } else {
-        BinMeasures = new int[2];
-        BinMeasures[0] = int.Parse(binMeasures[0]);
-        BinMeasures[1] = int.Parse(binMeasures[1]);
+        var tok = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+        var numItems = int.Parse(tok[0]);
+        //Numbering of instances..
+        reader.ReadLine();
+        tok = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+        instance.BinShape = new PackingShape(int.Parse(tok[0]), int.Parse(tok[1]), int.Parse(tok[2]));
+        instance.Items = new PackingItem[numItems];
+
+        for (int k = 0; k < numItems; k++) {
+          if (reader.EndOfStream) throw new InvalidDataException("Unexpected End of Stream (at line " + k + ").");
+          var valLine = reader.ReadLine();
+          while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
+          tok = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
+          instance.Items[k] = new PackingItem(int.Parse(tok[0]), int.Parse(tok[1]), int.Parse(tok[2]), instance.BinShape) { Material = 1, Weight = 1.0 }; // these problem instances do not specify weights and materials
+        }
+
+        int problemClassNr = -1;
+        if (int.TryParse(problemClass[0], out problemClassNr)) {
+          instance.Name = "dbpp_class_0" + problemClassNr;
+          if (problemClassNr >= 1 && problemClassNr <= 5)
+            instance.Description = "Proposed by Martello and Vigo.";
+          else if (problemClassNr >= 6 && problemClassNr <= 9)
+            instance.Description = "Proposed by Berkey and Wang.";
+        } else {
+          instance.Name = "Unknown";
+          instance.Description = "<Missing>";
+        }
+
+        return instance;
       }
-      ItemMeasures = new int[Items][];
-
-      for (int k = 0; k < Items; k++) {
-        if (reader.EndOfStream) throw new InvalidDataException("Unexpected End of Stream (at line " + k + ").");
-        var valLine = reader.ReadLine();
-        while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
-        var vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
-        ItemMeasures[k] = new int[isThreeDimensional ? 3 : 2];
-        ItemMeasures[k][0] = int.Parse(vals[0]);
-        ItemMeasures[k][1] = int.Parse(vals[1]);
-        if (isThreeDimensional)
-          ItemMeasures[k][2] = int.Parse(vals[2]);
-      }
-
-      Int32 problemClassNr = -1;
-      if (int.TryParse(problemClass[0], out problemClassNr)) {
-        Name = (isThreeDimensional ? "3" : "2") + "dbpp_class_0" + problemClassNr;
-        if (!isThreeDimensional) {
-          if (problemClassNr >= 1 && problemClassNr <= 5)
-            Description = "Proposed by Berkey and Wang.";
-          else if (problemClassNr >= 6 && problemClassNr <= 10)
-            Description = "Proposed by Martello and Vigo.";
-        } else {
-          if (problemClassNr >= 1 && problemClassNr <= 5)
-            Description = "Proposed by Martello and Vigo.";
-          else if (problemClassNr >= 6 && problemClassNr <= 9)
-            Description = "Proposed by Berkey and Wang.";
-        }
-      } else {
-        Name = "Unknown";
-        Description = "<Missing>";
-      }
-
-
     }
 
-    public void Export(Stream stream) {
-      bool isThreeDimensional = BinMeasures.Length == 3;
-      var nameParts = Name.Split('_');
+    public static void Export(BPPData instance, Stream stream) {
+      var nameParts = instance.Name.Split('_');
       int problemClassNr = int.Parse(nameParts[2]);
 
-      var writer = new StreamWriter(stream);
-      writer.WriteLine(String.Format("{0,-5}               PROBLEM CLASS ({1})", problemClassNr, Description));
-      writer.WriteLine(String.Format("{0,-5} {1,-5} {2,-5}   WBIN,HBIN,DBIN", BinMeasures[0], BinMeasures[1], BinMeasures[2]));
-      for (int i = 0; i < Items; i++) {
-        if (i == 0)
-          writer.WriteLine("{0,-5} {1,-5} {2,-5}   W(I),H(I),D(I),I=1,...,N", ItemMeasures[i][0], ItemMeasures[i][1], ItemMeasures[i][2]);
-        else
-          writer.WriteLine("{0,-5} {1,-5} {2,-5}", ItemMeasures[i][0], ItemMeasures[i][1], ItemMeasures[i][2]);
+      using (var writer = new StreamWriter(stream)) {
+        writer.WriteLine(String.Format("{0,-5}               PROBLEM CLASS ({1})", problemClassNr, instance.Description));
+        writer.WriteLine(String.Format("{0,-5} {1,-5} {2,-5}   WBIN,HBIN", instance.BinShape.Width, instance.BinShape.Height, instance.BinShape.Depth));
+        for (int i = 0; i < instance.NumItems; i++) {
+          if (i == 0)
+            writer.WriteLine("{0,-5} {1,-5} {2,-5}   W(I),H(I)D(I),I=1,...,N", instance.Items[i].Width, instance.Items[i].Height, instance.Items[i].Depth);
+          else
+            writer.WriteLine("{0,-5} {1,-5} {2,-5}", instance.Items[i].Width, instance.Items[i].Height, instance.Items[i].Depth);
 
+        }
+        writer.Flush();
       }
-      writer.Flush();
     }
 
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RealBPPData.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RealBPPData.cs	(revision 14053)
+++ 	(revision )
@@ -1,39 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 Joseph Helm and 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.BinPacking3D {
-  /// <summary>
-  /// Describes instances of the regular three dimensional bin packing problem (3DBPP).
-  /// </summary>
-  public class RealBPPData : BPPData {
-    /// <summary>
-    /// The weight of the items.
-    /// </summary>
-    public double[] ItemWeights { get; set; }
-    /// <summary>
-    /// The category of packing material for each item.
-    /// </summary>
-    public int[] ItemMaterials { get; set; }
-
-  }
-}
