Index: trunk/sources/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs	(revision 15240)
+++ trunk/sources/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs	(revision 15241)
@@ -34,5 +34,4 @@
     public BinPacking2D(PackingShape binShape)
       : base(binShape) {
-      ExtremePoints = new SortedSet<PackingPosition>();
       ExtremePoints.Add(binShape.Origin);
       InitializeOccupationLayers();
@@ -41,8 +40,5 @@
     [StorableConstructor]
     protected BinPacking2D(bool deserializing) : base(deserializing) { }
-    protected BinPacking2D(BinPacking2D original, Cloner cloner)
-      : base(original, cloner) {
-      this.ExtremePoints = new SortedSet<PackingPosition>(original.ExtremePoints.Select(p => cloner.Clone(p)));
-    }
+    protected BinPacking2D(BinPacking2D original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new BinPacking2D(this, cloner);
Index: trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs	(revision 15240)
+++ trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs	(revision 15241)
@@ -33,7 +33,9 @@
   public class BinPacking3D : BinPacking<PackingPosition, PackingShape, PackingItem> {
 
+    [Storable]
+    public Dictionary<PackingPosition, Tuple<int, int, int>> ResidualSpace { get; protected set; }
+
     public BinPacking3D(PackingShape binShape)
       : base(binShape) {
-      ExtremePoints = new SortedSet<PackingPosition>();
       ResidualSpace = new Dictionary<PackingPosition, Tuple<int,int,int>>();
       AddExtremePoint(binShape.Origin);
@@ -44,5 +46,4 @@
     protected BinPacking3D(BinPacking3D original, Cloner cloner)
       : base(original, cloner) {
-      this.ExtremePoints = new SortedSet<PackingPosition>(original.ExtremePoints.Select(p => cloner.Clone(p)));
       this.ResidualSpace = new Dictionary<PackingPosition, Tuple<int, int, int>>();
       foreach (var o in original.ResidualSpace)
@@ -51,4 +52,19 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new BinPacking3D(this, cloner);
+    }
+
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (ResidualSpace == null)
+        ResidualSpace = new Dictionary<PackingPosition, Tuple<int, int, int>>();
+      #endregion
+    }
+
+    public override void PackItem(int itemID, PackingItem item, PackingPosition position) {
+      ResidualSpace.Remove(position);
+      base.PackItem(itemID, item, position);
     }
 
Index: trunk/sources/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs	(revision 15240)
+++ trunk/sources/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs	(revision 15241)
@@ -50,8 +50,5 @@
     [Storable]
     protected Dictionary<int, List<int>> OccupationLayers { get; set; }
-
-    [Storable]
-    public Dictionary<TPos, Tuple<int,int,int>> ResidualSpace { get; protected set; }
-
+    
     #endregion Properties
 
@@ -65,4 +62,5 @@
       Items = new ObservableDictionary<int, TItem>();
       BinShape = (TBin)binShape.Clone();
+      ExtremePoints = new SortedSet<TPos>();
       OccupationLayers = new Dictionary<int, List<int>>();
     }
@@ -81,17 +79,9 @@
       }
       this.BinShape = (TBin)original.BinShape.Clone(cloner);
+      this.ExtremePoints = new SortedSet<TPos>(original.ExtremePoints.Select(p => cloner.Clone(p)));
       this.OccupationLayers = new Dictionary<int, List<int>>();
       foreach (var kvp in original.OccupationLayers) {
         OccupationLayers.Add(kvp.Key, new List<int>(kvp.Value));
       }
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      // BackwardsCompatibility3.3
-      #region Backwards compatible code, remove with 3.4
-      if (ResidualSpace == null)
-        ResidualSpace = new Dictionary<TPos, Tuple<int, int, int>>();
-      #endregion
     }
 
@@ -110,5 +100,4 @@
       Positions[itemID] = position;
       ExtremePoints.Remove(position);
-      if (ResidualSpace != null) ResidualSpace.Remove(position);
       foreach (int id in Items.Select(x => x.Key))
         GenerateNewExtremePointsForNewItem(Items[id], Positions[id]);
