Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointGroupingVectorDecoder2D.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointGroupingVectorDecoder2D.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointGroupingVectorDecoder2D.cs	(revision 9495)
@@ -41,9 +41,8 @@
   [Item("Identical bin, two dimensional, extreme points based decoder for the GroupingVector encoding.", "<Description missing...>")]
   [StorableClass]
-  public class ExtremePointGroupingVectorDecoder2D : IdenticalBinPackingSolutionDecoder<
+  public class ExtremePointGroupingVectorDecoder2D : PackingSolutionDecoder<
       TwoDimensionalPacking,
       RectangularPackingBin,
-      RectangularPackingItem,
-      PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem>> {
+      RectangularPackingItem> {
 
     public ExtremePointGroupingVectorDecoder2D ()
@@ -68,5 +67,5 @@
     }
 
-    protected override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution) {
+    public override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures) {
                       
       var solution = encodedSolution as GroupingVectorEncoding;
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointMultiComponentVectorDecoder2D.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointMultiComponentVectorDecoder2D.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointMultiComponentVectorDecoder2D.cs	(revision 9495)
@@ -42,9 +42,8 @@
   [Item("Identical bin, two dimensional, extreme points based decoder for the MultiComponentVector encoding.", "<Description missing...>")]
   [StorableClass]
-  public class ExtremePointMultiComponentVectorDecoder2D : IdenticalBinPackingSolutionDecoder<
+  public class ExtremePointMultiComponentVectorDecoder2D : PackingSolutionDecoder<
       TwoDimensionalPacking,
       RectangularPackingBin,
-      RectangularPackingItem,
-      PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem>> {
+      RectangularPackingItem> {
 
     public ExtremePointMultiComponentVectorDecoder2D ()
@@ -69,10 +68,10 @@
     }
 
-    protected override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution) {
+    public override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures) {
 
       var solution = encodedSolution as MultiComponentVectorEncoding;
       if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector");
 
-      return Decode(solution, PackingBinMeasuresParameter.ActualValue, PackingItemMeasuresParameter.ActualValue);
+      return Decode(solution, binMeasures, itemMeasures);
     }
   }
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointPackingSequenceDecoder2D.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointPackingSequenceDecoder2D.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointPackingSequenceDecoder2D.cs	(revision 9495)
@@ -40,9 +40,8 @@
   [Item("Identical bin, two dimensional, extreme points based decoder for the PackingSequence encoding.", "<Description missing...>")]
   [StorableClass]
-  public class ExtremePointPackingSequenceDecoder2D : IdenticalBinPackingSolutionDecoder<
+  public class ExtremePointPackingSequenceDecoder2D : PackingSolutionDecoder<
       TwoDimensionalPacking,
       RectangularPackingBin,
-      RectangularPackingItem,
-      PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem>> {
+      RectangularPackingItem> {
 
     public ExtremePointPackingSequenceDecoder2D ()
@@ -59,5 +58,5 @@
 
 
-    protected override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution) {
+    public override PackingPlan<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures) {
 
       var solution = encodedSolution as PackingSequenceEncoding;
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointsFunctions2D.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointsFunctions2D.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/2D/EP/ExtremePointsFunctions2D.cs	(revision 9495)
@@ -24,5 +24,5 @@
 
       #region Preperations
-      int nrOfBins = solution.PackingInformations.Max(x => x.AssignedBin) + 1;
+          int nrOfBins = solution.NrOfBins;
 
       //Get all indexes of items for every bin according to grouping-vector                      
@@ -32,7 +32,5 @@
 
       for (int i = 0; i < nrOfBins; i++) {        
-        unpackedItemIndexesPerBin[i] = solution.PackingInformations
-          .Where(pi => pi.AssignedBin == i)
-          .ToList();
+        unpackedItemIndexesPerBin[i] = new List<PackingInformation> (solution.PackingInformations[i]);
 
         extremePointsForBin[i] = new HashSet<TwoDimensionalPacking>();
@@ -52,8 +50,8 @@
         var unpackedItems = unpackedItemIndexesPerBin[binNr];
         for (int i = 0; i < unpackedItems.Count; i++) {
-          var itemIndex = unpackedItems[i].ItemIndex;
+          var itemIndex = unpackedItems[i].ItemID;
           var item = itemMeasures[itemIndex];
 
-          extremePointsForBin[binNr] = new HashSet<TwoDimensionalPacking>(extremePointsForBin[binNr].OrderBy(ep => ep.AssignedBin).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+          extremePointsForBin[binNr] = OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures);
           var positionFound = FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated);
           if (positionFound != null) {
@@ -62,6 +60,8 @@
             occupiedPoints = OccupyPointsForNewItem(occupiedPoints, item, positionFound, itemIndex);
             extremePointsForBin[binNr] = GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, binMeasures);
-          } else
+          } else {
             remainingItems.Add(unpackedItems[i]);
+            solution.PackingInformations[binNr].Remove(unpackedItems[i]);
+          }
         }
       }
@@ -74,8 +74,8 @@
         //Iterate over all the remaining items
         for (int i = 0; i < unpackedItems.Count; i++) {
-          var itemIndex = unpackedItems[i].ItemIndex;
+          var itemIndex = unpackedItems[i].ItemID;
           var item = itemMeasures[itemIndex];
 
-          extremePointsForBin[binNr] = new HashSet<TwoDimensionalPacking>(extremePointsForBin[binNr].OrderBy(ep => ep.AssignedBin).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+          extremePointsForBin[binNr] = OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures);
           var positionFound = FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated);
           if (positionFound != null) {
@@ -85,4 +85,5 @@
             extremePointsForBin[binNr] = GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, binMeasures);
             remainingItems.Remove(unpackedItems[i]);
+            solution.PackingInformations[binNr].Add(unpackedItems[i]);
           }
         }
@@ -91,4 +92,5 @@
           extremePointsForBin[nrOfBins].Add(new TwoDimensionalPacking(nrOfBins, 0, 0, false));
           occupiedPoints = IncreaseBinCountForOccupiedPoints(occupiedPoints, binMeasures);
+          solution.PackingInformations[nrOfBins] = new ItemList<PackingInformation>();
           nrOfBins++;
         }
@@ -136,5 +138,5 @@
           var item = itemMeasures[itemIndex];
 
-          extremePointsForBin[binNr] = new HashSet<TwoDimensionalPacking>(extremePointsForBin[binNr].OrderBy(ep => ep.AssignedBin).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+          extremePointsForBin[binNr] = OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures);
           var positionFound = FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions);
           if (positionFound != null) {
@@ -159,5 +161,5 @@
           var item = itemMeasures[itemIndex];
 
-          extremePointsForBin[binNr] = new HashSet<TwoDimensionalPacking>(extremePointsForBin[binNr].OrderBy(ep => ep.AssignedBin).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+          extremePointsForBin[binNr] = OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures);
           var positionFound = FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions);
           if (positionFound != null) {
@@ -197,5 +199,5 @@
       foreach (int itemIndex in solution.PackingSequence) {
         var item = itemMeasures[itemIndex];
-        extremePoints = new HashSet<TwoDimensionalPacking>(extremePoints.OrderBy(ep => ep.AssignedBin).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+        extremePoints = OrderExtremePoints(extremePoints, occupiedPoints, binMeasures);
         var positionFound = FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePoints, occupiedPoints, itemPositions);
         if (positionFound != null) {
@@ -296,4 +298,8 @@
       return extremePoints;
     }
+
+    public static HashSet<TwoDimensionalPacking> OrderExtremePoints(HashSet<TwoDimensionalPacking> hashSet, List<int[,]> occupiedPoints, RectangularPackingBin binMeasures) {
+      return new HashSet<TwoDimensionalPacking>(hashSet.OrderBy(ep => ep.AssignedBin).ThenBy(ep => ep.X).ThenBy(ep => ep.Y).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
+    }
     private static int ShortestPossibleSideFromEP(TwoDimensionalPacking ep, List<int[,]> occupiedPoints, RectangularPackingBin binMeasures) {
       int shortestSide = int.MaxValue;
