Index: /stable/HeuristicLab 3.3.sln
===================================================================
--- /stable/HeuristicLab 3.3.sln	(revision 14169)
+++ /stable/HeuristicLab 3.3.sln	(revision 14170)
@@ -55,4 +55,5 @@
 		{1256B945-EEA9-4BE4-9880-76B5B113F089} = {1256B945-EEA9-4BE4-9880-76B5B113F089}
 		{9319C447-8183-4DBC-8145-0E3CF98084CC} = {9319C447-8183-4DBC-8145-0E3CF98084CC}
+		{D53E8E48-CFAA-4F57-AC35-63BEF4476159} = {D53E8E48-CFAA-4F57-AC35-63BEF4476159}
 		{0C39A349-1979-419A-89BD-E4E2F26BD287} = {0C39A349-1979-419A-89BD-E4E2F26BD287}
 		{C49CB749-8B24-4628-8003-E86475749410} = {C49CB749-8B24-4628-8003-E86475749410}
@@ -75,4 +76,5 @@
 		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0} = {7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}
 		{E10F395F-C8A6-48AD-B470-9AA7A1F43809} = {E10F395F-C8A6-48AD-B470-9AA7A1F43809}
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E} = {8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}
 		{0C378762-D5DB-488A-8931-2BA42B1B7CBF} = {0C378762-D5DB-488A-8931-2BA42B1B7CBF}
 		{97198965-AFEA-496B-B3B1-316905C43FD6} = {97198965-AFEA-496B-B3B1-316905C43FD6}
@@ -101,4 +103,5 @@
 		{B1BA398F-953F-4C3A-B07B-1E5E17A27DD9} = {B1BA398F-953F-4C3A-B07B-1E5E17A27DD9}
 		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F} = {6F023B90-2091-40A9-8AC0-B0338DFF8E5F}
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4} = {F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}
 		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2} = {FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}
 		{9A04599C-D608-4240-8DA6-D41F51C515A3} = {9A04599C-D608-4240-8DA6-D41F51C515A3}
@@ -457,4 +460,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.TestFunctions.MultiObjective-3.3", "HeuristicLab.Problems.TestFunctions.MultiObjective\3.3\HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj", "{D53E8E48-CFAA-4F57-AC35-63BEF4476159}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BinPacking.Views-3.3", "HeuristicLab.Problems.BinPacking.Views\3.3\HeuristicLab.Problems.BinPacking.Views-3.3.csproj", "{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BinPacking-3.3", "HeuristicLab.Problems.BinPacking\3.3\HeuristicLab.Problems.BinPacking-3.3.csproj", "{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}"
 EndProject
 Global
@@ -2226,6 +2233,32 @@
 		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|Any CPU.Build.0 = Release|Any CPU
-		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x64.ActiveCfg = Release|Any CPU
-		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x86.ActiveCfg = Release|Any CPU
+		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x64.ActiveCfg = Release|x64
+		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x64.Build.0 = Release|x64
+		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x86.ActiveCfg = Release|x86
+		{D53E8E48-CFAA-4F57-AC35-63BEF4476159}.Release|x86.Build.0 = Release|x86
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|x64.ActiveCfg = Debug|x64
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|x64.Build.0 = Debug|x64
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|x86.ActiveCfg = Debug|x86
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Debug|x86.Build.0 = Debug|x86
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|x64.ActiveCfg = Release|x64
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|x64.Build.0 = Release|x64
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|x86.ActiveCfg = Release|x86
+		{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}.Release|x86.Build.0 = Release|x86
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|x64.ActiveCfg = Debug|x64
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|x64.Build.0 = Debug|x64
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|x86.ActiveCfg = Debug|x86
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|x86.Build.0 = Debug|x86
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|x64.ActiveCfg = Release|x64
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|x64.Build.0 = Release|x64
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|x86.ActiveCfg = Release|x86
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
@@ -2233,5 +2266,4 @@
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{0C67A033-F6D9-4237-B3CA-C033A44706BE} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 		{3083C7AA-5AF4-4C75-BA19-B69B86E2F66A} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 		{9A04599C-D608-4240-8DA6-D41F51C515A3} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
Index: /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 14169)
+++ /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 14170)
@@ -149,4 +149,5 @@
     <EmbeddedResource Include="Documents\ALPSGP_SymReg.hl" />
     <EmbeddedResource Include="Documents\ALPSGA_TSP.hl" />
+    <EmbeddedResource Include="Documents\TS_BPP.hl" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="OptimizerSingleDocumentMainForm.cs">
Index: /stable/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 14169)
+++ /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 14170)
@@ -135,5 +135,5 @@
       var standardProblems = new List<string> { "ALPSGA_TSP", "ES_Griewank", "GA_Grouping", "GA_TSP", "GA_VRP", "GE_ArtificialAnt",
                 "IslandGA_TSP", "LS_Knapsack", "PSO_Schwefel", "RAPGA_JSSP",
-                "SA_Rastrigin", "SGP_SantaFe","GP_Multiplexer", "SS_VRP", "TS_TSP", "TS_VRP", "VNS_OP", "VNS_TSP"
+                "SA_Rastrigin", "SGP_SantaFe","GP_Multiplexer", "SS_VRP", "TS_TSP", "TS_VRP", "VNS_OP", "VNS_TSP", "TS_BPP"
         };
       groupLookup[standardProblemsGroup] = standardProblems;
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml	(revision 14170)
@@ -0,0 +1,30 @@
+﻿<!--
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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/> .
+ */
+-->
+
+<UserControl x:Class="HeuristicLab.Problems.BinPacking.Views.Container2DView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="300"
+             >
+</UserControl>
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs	(revision 14170)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Windows;
+using System.Windows.Media;
+using HeuristicLab.Problems.BinPacking2D;
+using Point = System.Windows.Point;
+using Size = System.Windows.Size;
+using UserControl = System.Windows.Controls.UserControl;
+
+namespace HeuristicLab.Problems.BinPacking.Views {
+  public partial class Container2DView : UserControl {
+    private int selectedItemKey;
+    private Size renderSize;
+    private BinPacking<BinPacking2D.PackingPosition, PackingShape, PackingItem> packing;
+    public BinPacking<BinPacking2D.PackingPosition, PackingShape, PackingItem> Packing {
+      get { return packing; }
+      set {
+        if (packing != value) {
+          this.packing = value;
+          ClearSelection(); // also updates visualization
+        }
+      }
+    }
+
+    public Container2DView() {
+      InitializeComponent();
+    }
+
+
+    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) {
+      base.OnRenderSizeChanged(sizeInfo);
+      var s = Math.Min(sizeInfo.NewSize.Height, sizeInfo.NewSize.Width);
+      renderSize = new Size(s, s);
+      InvalidateVisual();
+    }
+
+    // similar implementation to Container3DView (even though item selection is not supported for 2d packings TODO)
+    public void SelectItem(int itemKey) {
+      // selection of an item should make all other items semi-transparent
+      selectedItemKey = itemKey;
+      InvalidateVisual();
+    }
+    public void ClearSelection() {
+      // remove all transparency
+      selectedItemKey = -1;
+      InvalidateVisual();
+    }
+
+    protected override void OnRender(DrawingContext drawingContext) {
+      base.OnRender(drawingContext);
+      if (packing == null) return;
+      // the container should fill the whole size
+      var scalingX = renderSize.Width / Packing.BinShape.Width;
+      var scalingY = renderSize.Height / Packing.BinShape.Width;
+      // draw container
+      drawingContext.DrawRectangle(Brushes.LightGray, new Pen(Brushes.Black, 1), new Rect(new Point(0, 0), renderSize));
+
+      var selectedBrush = Brushes.MediumSeaGreen;
+      var unselectedBrush = selectedItemKey < 0 ? selectedBrush : Brushes.DarkGray;
+
+      foreach (var t in Packing.Items) {
+        var key = t.Key;
+        var item = t.Value;
+        var pos = Packing.Positions[key];
+
+        var scaledPos = new Point(pos.X * scalingX, pos.Y * scalingY);
+
+        var scaledSize = pos.Rotated ?
+          new Size(item.Height * scalingX, item.Width * scalingY) :
+          new Size(item.Width * scalingX, item.Height * scalingY);
+
+        var brush = key == selectedItemKey ? selectedBrush : unselectedBrush;
+        drawingContext.DrawRectangle(brush, new Pen(Brushes.Black, 1), new Rect(scaledPos, scaledSize));
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml	(revision 14170)
@@ -0,0 +1,136 @@
+﻿<!--
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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/> .
+ */
+-->
+
+<UserControl x:Class="HeuristicLab.Problems.BinPacking.Views.Container3DView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="300"
+             MouseMove="Container3DView_MouseMove" MouseDown="Container3DView_MouseDown" MouseUp="Container3DView_MouseUp"
+             MouseWheel="Container3DView_OnMouseWheel" 
+             MouseEnter="Container3DView_OnMouseEnter"
+             Focusable="true"
+             >
+    <Grid>
+        <Viewport3D Name="viewport3D1" >
+            <Viewport3D.Camera>
+                <PerspectiveCamera x:Name="camMain" Position="0.5 8 8" LookDirection="0 -1 -1"> <!-- camera position for design time-->
+                </PerspectiveCamera>
+            </Viewport3D.Camera>
+            <ModelVisual3D>
+                <ModelVisual3D.Content>
+                    <DirectionalLight x:Name="dirLightMain" Direction="0,-1,-1"/>
+                </ModelVisual3D.Content>
+            </ModelVisual3D>
+            <ModelVisual3D>
+            </ModelVisual3D>
+            <ModelVisual3D x:Name="MyModel">
+                <ModelVisual3D.Content>
+                    <Model3DGroup>
+                        <GeometryModel3D>
+                            <GeometryModel3D.Geometry>
+                                <!-- two opaque cubes, one in front one in back-->
+                                <MeshGeometry3D x:Name="meshMain" 
+                                Positions="0 0 -2.5 1 0 -2.5  0 1 -2.5  1 1 -2.5  0 0 -1.5  1 0 -1.5  0 1 -1.5  1 1 -1.5
+                                           0 0 0 1 0 0  0 1 0  1 1 0  0 0 1  1 0 1  0 1 1  1 1 1" 
+                                TriangleIndices="10 11 9  10 9 8  15 9 11  15 13 9  14 13 15  14 12 13  14 10 12  10 8 12  10 15 11  10 14 15  0 9 13  8 13 12
+                                                 2 3 1  2 1 0  7 1 3  7 5 1  6 5 7  6 4 5  6 2 4  2 0 4  2 7 3  2 6 7  0 1 5  0 5 4 ">
+                                </MeshGeometry3D>
+                            </GeometryModel3D.Geometry>
+                            <GeometryModel3D.Material>
+                                <DiffuseMaterial>
+                                    <DiffuseMaterial.Brush>
+                                        <SolidColorBrush Color="LightGreen"/>
+                                    </DiffuseMaterial.Brush>
+                                </DiffuseMaterial>
+                            </GeometryModel3D.Material>
+                        </GeometryModel3D>
+                        <GeometryModel3D>
+                            <GeometryModel3D.Geometry>
+                                <!-- two transparent cubes, one in front one in back-->
+                                <!-- draw transparent cubes from back to front and always draw outer and inner triangles and draw from front to back-->
+                                <MeshGeometry3D x:Name="meshInsides" 
+                                Positions="-1 -1 -1  2 -1 -1  -1 2 -1  2 2 -1  -1 -1 2  2 -1 2  -1 2 2  2 2 2
+                                           -1 -1 -3  2 -1 -3  -1 2 -3  2 2 -3  -1 -1 -1  2 -1 -1  -1 2 -1  2 2 -1" 
+                                TriangleIndices="9 11 10  8 9 10  11 9 15  9 13 15  15 13 14  13 12 14  12 10 14  12 8 10  11 15 10  15 14 10  13 9 8  12 13 8
+                                                 1 3 2  0 1 2  3 1 7  1 5 7  7 5 6  5 4 6  4 2 6  4 0 2  3 7 2  7 6 2  5 1 0  4 5 0 
+                                                 ">
+                                </MeshGeometry3D>
+                            </GeometryModel3D.Geometry>
+                            <GeometryModel3D.Material>
+                                <MaterialGroup>
+                                    <DiffuseMaterial>
+                                        <DiffuseMaterial.Brush>
+                                            <SolidColorBrush Opacity="0.1"  Color="DarkGray"/>
+                                        </DiffuseMaterial.Brush>
+                                    </DiffuseMaterial>
+                                </MaterialGroup>
+                            </GeometryModel3D.Material>
+                        </GeometryModel3D>
+                        <GeometryModel3D>
+                            <GeometryModel3D.Geometry>
+                                <!-- two transparent cubes, one in front one in back-->
+                                <!-- draw transparent cubes from back to front and always draw outer and inner triangles and draw from front to back-->
+                                <MeshGeometry3D x:Name="meshTransparent" 
+                                Positions="-1 -1 -1  2 -1 -1  -1 2 -1  2 2 -1  -1 -1 2  2 -1 2  -1 2 2  2 2 2
+                                           -1 -1 -3  2 -1 -3  -1 2 -3  2 2 -3  -1 -1 -1  2 -1 -1  -1 2 -1  2 2 -1" 
+                                TriangleIndices="2 3 1  2 1 0  7 1 3  7 5 1  6 5 7  6 4 5  6 2 4  2 0 4  2 7 3  2 6 7  0 1 5  0 5 4                                                 
+                                                 10 11 9  10 9 8  15 9 11  15 13 9  14 13 15  14 12 13  14 10 12  10 8 12  10 15 11  10 14 15  0 9 13  8 13 12
+                                                 ">
+                                </MeshGeometry3D>
+                            </GeometryModel3D.Geometry>
+                            <GeometryModel3D.Material>
+                                <MaterialGroup>
+                                    <DiffuseMaterial>
+                                        <DiffuseMaterial.Brush>
+                                            <SolidColorBrush Opacity="0.1"  Color="DarkGray"/>
+                                        </DiffuseMaterial.Brush>
+                                    </DiffuseMaterial>
+                                </MaterialGroup>
+                            </GeometryModel3D.Material>
+                        </GeometryModel3D>
+
+                    </Model3DGroup>
+                </ModelVisual3D.Content>
+                <ModelVisual3D.Transform>
+                    <Transform3DGroup>
+                        <ScaleTransform3D x:Name="scale" ScaleX="1" ScaleY="1" ScaleZ="1"/>
+                        <TranslateTransform3D OffsetX="-0.5" OffsetY="-0.5" OffsetZ="-0.5" />
+                        <RotateTransform3D>
+                            <RotateTransform3D.Rotation>
+                                <AxisAngleRotation3D x:Name="rotateX" Axis="0 1 0"/>
+                            </RotateTransform3D.Rotation>
+                        </RotateTransform3D>
+                        <RotateTransform3D>
+                            <RotateTransform3D.Rotation>
+                                <AxisAngleRotation3D x:Name="rotateY" Axis="1 0 0"/>
+                            </RotateTransform3D.Rotation>
+                        </RotateTransform3D>
+                        <TranslateTransform3D OffsetX="0.5" OffsetY="0.5" OffsetZ="0.5" />
+                        <ScaleTransform3D x:Name="scaleZoom" CenterX="0.5" CenterY="0.5" CenterZ="0.5" ScaleX="1" ScaleY="1" ScaleZ="1"/>
+                    </Transform3DGroup>
+                </ModelVisual3D.Transform>
+            </ModelVisual3D>
+        </Viewport3D>
+    </Grid>
+</UserControl>
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs	(revision 14170)
@@ -0,0 +1,301 @@
+﻿/* HeuristicLab
+ * Copyright (C) 2002-2016 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/> .
+ */
+
+using System;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media.Media3D;
+using HeuristicLab.Problems.BinPacking3D;
+
+namespace HeuristicLab.Problems.BinPacking.Views {
+  public partial class Container3DView : UserControl {
+    private Point startPos;
+    private bool mouseDown = false;
+    private double startAngleX;
+    private double startAngleY;
+    private int selectedItemKey;
+
+    private BinPacking<BinPacking3D.PackingPosition, PackingShape, PackingItem> packing;
+    public BinPacking<BinPacking3D.PackingPosition, PackingShape, PackingItem> Packing {
+      get { return packing; }
+      set {
+        if (packing != value) {
+          this.packing = value;
+          ClearSelection(); // also updates visualization
+        }
+      }
+    }
+
+    public Container3DView() {
+      InitializeComponent();
+      camMain.Position = new Point3D(0.5, 3, 3); // for design time we use a different camera position 
+      Clear();
+    }
+
+
+    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) {
+      base.OnRenderSizeChanged(sizeInfo);
+      var s = Math.Min(sizeInfo.NewSize.Height, sizeInfo.NewSize.Width);
+      var mySize = new Size(s, s);
+      viewport3D1.RenderSize = mySize;
+    }
+
+    public void SelectItem(int itemKey) {
+      // selection of an item should make all other items semi-transparent
+      selectedItemKey = itemKey;
+      UpdateVisualization();
+    }
+    public void ClearSelection() {
+      // remove all transparency
+      selectedItemKey = -1;
+      UpdateVisualization();
+    }
+
+    private void UpdateVisualization() {
+      Clear();
+      if (packing == null) return; // nothing to display
+
+      // draw all items
+      // order by Z position to reduce artifacts (because of transparent objects) 
+      // TODO: improve code to reduce artifacts 
+      //  - from triangle definitions and lighting
+      //  - from rotation and Z-ordering
+
+      foreach (var item in packing.Items.OrderBy(i => packing.Positions[i.Key].Z)) {
+        var position = packing.Positions[item.Key];
+
+        var w = position.Rotated ? item.Value.Depth : item.Value.Width;
+        var h = item.Value.Height;
+        var d = position.Rotated ? item.Value.Width : item.Value.Depth;
+
+        // ignore the item.Material
+
+        // if nothing is selected then draw all cubes opaque 
+        // otherwise draw only the selected cube opaque and all others transparent
+        if (selectedItemKey < 0 || selectedItemKey == item.Key) {
+          AddCube(meshMain, position.X, position.Y, position.Z, w, h, d);
+        } else {
+          AddCube(meshTransparent, position.X, position.Y, position.Z, w, h, d, addInsideTriangles: true);
+        }
+      }
+
+      var container = packing.BinShape;
+      // draw a transparent container
+      AddCube(meshTransparent, container.Origin.X, container.Origin.Y, container.Origin.Z, container.Width, container.Height, container.Depth, addInsideTriangles: true);
+
+      // TODO: support cuboids with different side lengths
+      // apply scaling so that the container fits into the unit cube (necessary for the transformations)
+      scale.ScaleX = 1.0 / (container.Width);
+      scale.ScaleY = 1.0 / (container.Height);
+      scale.ScaleZ = 1.0 / (container.Depth);
+    }
+
+
+    private void Clear() {
+      meshInsides.Positions.Clear();
+      meshInsides.TriangleIndices.Clear();
+
+      meshMain.Positions.Clear();
+      meshMain.TriangleIndices.Clear();
+
+      meshTransparent.Positions.Clear();
+      meshTransparent.TriangleIndices.Clear();
+
+      mouseDown = false;
+      startAngleX = 0;
+      startAngleY = 0;
+    }
+
+    private void Container3DView_MouseMove(object sender, MouseEventArgs e) {
+      if (!mouseDown) return;
+      var pos = e.GetPosition((IInputElement)this);
+      rotateX.Angle = startAngleX + (pos.X - startPos.X) / 4;
+      rotateY.Angle = startAngleY + (pos.Y - startPos.Y) / 4;
+    }
+
+    private void Container3DView_MouseDown(object sender, MouseButtonEventArgs e) {
+      startAngleX = rotateX.Angle;
+      startAngleY = rotateY.Angle;
+      this.startPos = e.GetPosition((IInputElement)this);
+      this.mouseDown = true;
+    }
+
+    private void Container3DView_MouseUp(object sender, MouseButtonEventArgs e) {
+      mouseDown = false;
+    }
+
+    private void Container3DView_OnMouseWheel(object sender, MouseWheelEventArgs e) {
+      if (e.Delta > 0) {
+        scaleZoom.ScaleX *= 1.1;
+        scaleZoom.ScaleY *= 1.1;
+        scaleZoom.ScaleZ *= 1.1;
+      } else if (e.Delta < 0) {
+        scaleZoom.ScaleX /= 1.1;
+        scaleZoom.ScaleY /= 1.1;
+        scaleZoom.ScaleZ /= 1.1;
+      }
+    }
+
+
+    #region helper for cubes
+
+    private void AddCube(MeshGeometry3D mesh, int x, int y, int z, int width, int height, int depth, bool addInsideTriangles = false) {
+      AddOutsideTriangles(mesh, AddPoints(mesh, x, y, z, width, height, depth));
+      if (addInsideTriangles) AddInsideTriangles(meshInsides, AddPoints(meshInsides, x, y, z, width, height, depth));
+    }
+
+    private void AddOutsideTriangles(MeshGeometry3D mesh, int[] pointIdx) {
+      // point indices counter-clockwise
+      // back side
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[1]);
+
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+
+      // bottom side
+      mesh.TriangleIndices.Add(pointIdx[5]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+
+      mesh.TriangleIndices.Add(pointIdx[5]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[1]);
+
+      // right side
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[5]);
+
+      mesh.TriangleIndices.Add(pointIdx[1]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[5]);
+
+      // left side
+      mesh.TriangleIndices.Add(pointIdx[7]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+
+      // top side
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[7]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+
+      // front side
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[7]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[5]);
+    }
+
+    private void AddInsideTriangles(MeshGeometry3D mesh, int[] pointIdx) {
+      // for each cube we also draw the triangles facing inside because they are visible when a cube is transparent
+      // point indices clockwise
+
+      // back side
+      mesh.TriangleIndices.Add(pointIdx[1]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+
+      // bottom side
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[5]);
+
+      mesh.TriangleIndices.Add(pointIdx[1]);
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[5]);
+
+      // right side
+      mesh.TriangleIndices.Add(pointIdx[5]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+
+      mesh.TriangleIndices.Add(pointIdx[5]);
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[1]);
+
+      // left side
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[7]);
+
+      mesh.TriangleIndices.Add(pointIdx[0]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+
+      // top side
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[7]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+
+      mesh.TriangleIndices.Add(pointIdx[2]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+      mesh.TriangleIndices.Add(pointIdx[3]);
+
+      // front side
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[7]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+
+      mesh.TriangleIndices.Add(pointIdx[5]);
+      mesh.TriangleIndices.Add(pointIdx[4]);
+      mesh.TriangleIndices.Add(pointIdx[6]);
+    }
+
+    private int[] AddPoints(MeshGeometry3D mesh, int x, int y, int z, int w, int h, int d) {
+      // ground
+      mesh.Positions.Add(new Point3D(x, y, z));
+      mesh.Positions.Add(new Point3D(x + w, y, z));
+      mesh.Positions.Add(new Point3D(x + w, y + h, z));
+      mesh.Positions.Add(new Point3D(x, y + h, z));
+      // top
+      mesh.Positions.Add(new Point3D(x, y, z + d));
+      mesh.Positions.Add(new Point3D(x + w, y, z + d));
+      mesh.Positions.Add(new Point3D(x + w, y + h, z + d));
+      mesh.Positions.Add(new Point3D(x, y + h, z + d));
+
+      return Enumerable.Range(mesh.Positions.Count - 8, 8).ToArray();
+    }
+    #endregion
+
+    private void Container3DView_OnMouseEnter(object sender, MouseEventArgs e) {
+      Focus(); // for mouse wheel events
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj	(revision 14170)
@@ -0,0 +1,238 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8CFC7A61-E214-44DC-96B3-4CEA9B8E958E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BinPacking.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BinPacking.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Scheduling.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Scheduling.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Scheduling.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Scheduling.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xaml" />
+    <Reference Include="UIAutomationProvider" />
+    <Reference Include="WindowsBase" />
+    <Reference Include="WindowsFormsIntegration" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Container3DView.xaml.cs">
+      <DependentUpon>Container3DView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Container2DView.xaml.cs">
+      <DependentUpon>Container2DView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="PackingPlan2DView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PackingPlan2DView.Designer.cs">
+      <DependentUpon>PackingPlan2DView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PackingPlan3DView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PackingPlan3DView.Designer.cs">
+      <DependentUpon>PackingPlan3DView.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLab.snk" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="PackingPlan2DView.resx">
+      <DependentUpon>PackingPlan2DView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PackingPlan3DView.resx">
+      <DependentUpon>PackingPlan3DView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Page Include="Container3DView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Container2DView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.BinPacking\3.3\HeuristicLab.Problems.BinPacking-3.3.csproj">
+      <Project>{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}</Project>
+      <Name>HeuristicLab.Problems.BinPacking-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs	(revision 14170)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.BinPacking.Views {
+  partial class PackingPlan2DView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.binSelection = new System.Windows.Forms.ListBox();
+      this.elementHost = new System.Windows.Forms.Integration.ElementHost();
+      this.container2DView = new HeuristicLab.Problems.BinPacking.Views.Container2DView();
+      this.SuspendLayout();
+      // 
+      // binSelection
+      // 
+      this.binSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.binSelection.FormattingEnabled = true;
+      this.binSelection.Location = new System.Drawing.Point(6, 3);
+      this.binSelection.Name = "binSelection";
+      this.binSelection.Size = new System.Drawing.Size(55, 329);
+      this.binSelection.TabIndex = 4;
+      this.binSelection.SelectedIndexChanged += new System.EventHandler(this.binSelection_SelectedIndexChanged);
+      // 
+      // elementHost
+      // 
+      this.elementHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.elementHost.Location = new System.Drawing.Point(67, 3);
+      this.elementHost.Name = "elementHost";
+      this.elementHost.Size = new System.Drawing.Size(383, 329);
+      this.elementHost.TabIndex = 5;
+      this.elementHost.Text = "elementHost";
+      this.elementHost.Child = this.container2DView;
+      // 
+      // PackingPlan2DView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.elementHost);
+      this.Controls.Add(this.binSelection);
+      this.Name = "PackingPlan2DView";
+      this.Size = new System.Drawing.Size(453, 346);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+    
+    private System.Windows.Forms.ListBox binSelection;
+    private System.Windows.Forms.Integration.ElementHost elementHost;
+    private Container2DView container2DView;
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs	(revision 14170)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.BinPacking2D;
+
+namespace HeuristicLab.Problems.BinPacking.Views {
+  [View("2-dimensional packing plan view")]
+  [Content(typeof(PackingPlan<BinPacking2D.PackingPosition, PackingShape, PackingItem>), true)]
+  public partial class PackingPlan2DView : ItemView {
+
+    public PackingPlan2DView() {
+      InitializeComponent();
+    }
+
+    public new PackingPlan<BinPacking2D.PackingPosition, PackingShape, PackingItem> Content {
+      get { return (PackingPlan<BinPacking2D.PackingPosition, PackingShape, PackingItem>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      binSelection.Items.Clear();
+      if (Content == null) {
+        ClearState();
+      } else {
+        for (int i = 0; i < Content.NrOfBins; i++)
+          binSelection.Items.Add(i);
+        UpdateState(Content);
+      }
+    }
+
+    private void ClearState() {
+      container2DView.Packing = null;
+    }
+
+    private void UpdateState(PackingPlan<BinPacking2D.PackingPosition, PackingShape, PackingItem> plan) {
+      int currentBin = (binSelection != null && binSelection.SelectedItem != null) ? (int)(binSelection.SelectedItem) : 0;
+      container2DView.Packing = plan.Bins[currentBin];
+    }
+
+    private void binSelection_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateState(Content);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx	(revision 14170)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs	(revision 14170)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.BinPacking.Views {
+  partial class PackingPlan3DView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.binSelection = new System.Windows.Forms.ListBox();
+      this.itemSelection = new System.Windows.Forms.ListBox();
+      this.elementHost = new System.Windows.Forms.Integration.ElementHost();
+      this.packingPlan3D = new HeuristicLab.Problems.BinPacking.Views.Container3DView();
+      this.SuspendLayout();
+      // 
+      // binSelection
+      // 
+      this.binSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.binSelection.FormattingEnabled = true;
+      this.binSelection.Location = new System.Drawing.Point(3, 3);
+      this.binSelection.Name = "binSelection";
+      this.binSelection.Size = new System.Drawing.Size(54, 290);
+      this.binSelection.TabIndex = 4;
+      this.binSelection.SelectedIndexChanged += new System.EventHandler(this.binSelection_SelectedIndexChanged);
+      // 
+      // itemSelection
+      // 
+      this.itemSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.itemSelection.FormattingEnabled = true;
+      this.itemSelection.Location = new System.Drawing.Point(58, 3);
+      this.itemSelection.Name = "itemSelection";
+      this.itemSelection.Size = new System.Drawing.Size(55, 290);
+      this.itemSelection.TabIndex = 5;
+      this.itemSelection.SelectedIndexChanged += new System.EventHandler(this.itemSelection_SelectedIndexChanged);
+      // 
+      // elementHost
+      // 
+      this.elementHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.elementHost.Location = new System.Drawing.Point(119, 3);
+      this.elementHost.Name = "elementHost";
+      this.elementHost.Size = new System.Drawing.Size(229, 290);
+      this.elementHost.TabIndex = 6;
+      this.elementHost.Text = "elementHost";
+      this.elementHost.Child = this.packingPlan3D;
+      // 
+      // PackingPlan3DView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.elementHost);
+      this.Controls.Add(this.itemSelection);
+      this.Controls.Add(this.binSelection);
+      this.Name = "PackingPlan3DView";
+      this.Size = new System.Drawing.Size(351, 299);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListBox binSelection;
+    private System.Windows.Forms.ListBox itemSelection;
+    private System.Windows.Forms.Integration.ElementHost elementHost;
+    private Container3DView packingPlan3D;
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs	(revision 14170)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.BinPacking3D;
+
+namespace HeuristicLab.Problems.BinPacking.Views {
+  [View("3-dimensional packing plan View")]
+  [Content(typeof(PackingPlan<BinPacking3D.PackingPosition, PackingShape, PackingItem>), true)]
+  public partial class PackingPlan3DView : ItemView {
+
+    public PackingPlan3DView() {
+      InitializeComponent();
+    }
+
+    public new PackingPlan<BinPacking3D.PackingPosition, PackingShape, PackingItem> Content {
+      get { return (PackingPlan<BinPacking3D.PackingPosition, PackingShape, PackingItem>)base.Content; }
+      set { base.Content = value; }
+    }
+
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      binSelection.Items.Clear();
+      if (Content == null) {
+        packingPlan3D.Packing = null;
+      } else {
+        int i = 0;
+        foreach (var bp in Content.Bins)
+          binSelection.Items.Add(i++ + " (" + Math.Round(bp.PackingDensity * 100, 2) + "%)");
+
+        binSelection.SelectedIndex = 0;
+        ShowSelectedPacking();
+      }
+    }
+
+    private void ShowSelectedPacking() {
+      int currentBin = (binSelection != null) ? (int)(binSelection.SelectedIndex) : 0;
+      packingPlan3D.Packing = Content.Bins[currentBin];
+    }
+
+    private void binSelection_SelectedIndexChanged(object sender, EventArgs e) {
+      itemSelection.SelectedIndex = -1;
+      itemSelection.Items.Clear();
+
+      // add items of this container
+      int currentBin = (binSelection != null) ? (int)(binSelection.SelectedIndex) : 0;
+      var packing = Content.Bins[currentBin];
+      foreach (var item in packing.Items) {
+        itemSelection.Items.Add(item.Key);
+      }
+
+      ShowSelectedPacking();
+    }
+
+    private void itemSelection_SelectedIndexChanged(object sender, EventArgs e) {
+      int selectedItem = -1;
+      if ((itemSelection != null && itemSelection.SelectedItem != null) && Int32.TryParse(itemSelection.SelectedItem.ToString(), out selectedItem)) {
+        packingPlan3D.SelectItem(selectedItem);
+      } else
+        packingPlan3D.ClearSelection();
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx	(revision 14170)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame	(revision 14170)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BinPacking.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.BinPacking.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.BinPacking.Views", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.BinPacking.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.BinPacking", "3.3")]
+  public class HeuristicLabProblemsBinPackingViewsPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 14170)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.BinPacking.Views")]
+[assembly: AssemblyDescription("HeuristicLab bin packing views")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 HEAL and Joseph Helm")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5D63ECBE-F92C-40DC-A081-C073323D72FF")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs	(revision 14170)
@@ -0,0 +1,213 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("BinPacking2D", "Represents a single-bin packing for a 2D bin-packing problem.")]
+  [StorableClass]
+  public class BinPacking2D : BinPacking.BinPacking<PackingPosition, PackingShape, PackingItem> {
+
+    public BinPacking2D(PackingShape binShape)
+      : base(binShape) {
+      ExtremePoints = new SortedSet<PackingPosition>();
+      ExtremePoints.Add(binShape.Origin);
+      InitializeOccupationLayers();
+    }
+
+    [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)));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinPacking2D(this, cloner);
+    }
+
+    protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position) {
+
+      int newWidth = position.Rotated ? newItem.Height : newItem.Width;
+      int newHeight = position.Rotated ? newItem.Width : newItem.Height;
+
+      //Find ExtremePoints beginning from sourcepointX
+      var sourcePointX = new PackingPosition(0, position.X + newWidth, position.Y);
+      if (sourcePointX.X < BinShape.Width && sourcePointX.Y < BinShape.Height) {
+        //Traversing down the y-axis        
+        var newPoint = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1);
+        while (sourcePointX.Y > 0 && !IsPointOccupied(newPoint)) {
+          sourcePointX = newPoint;
+          newPoint = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1);
+        }
+        ExtremePoints.Add(new PackingPosition(0, sourcePointX.X, sourcePointX.Y));
+      }
+
+      //Find ExtremePoints beginning from sourcepointY
+      var sourcePointY = new PackingPosition(0, position.X, position.Y + newHeight);
+      if (sourcePointY.X < BinShape.Width && sourcePointY.Y < BinShape.Height) {
+        //Traversing down the x-axis  
+        var newPoint = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y);
+        while (sourcePointY.X > 0 && !IsPointOccupied(newPoint)) {
+          sourcePointY = newPoint;
+          newPoint = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y);
+        }
+        ExtremePoints.Add(new PackingPosition(0, sourcePointY.X, sourcePointY.Y));
+      }
+    }
+
+    public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {
+      PackingItem rotatedItem = new PackingItem(
+        rotated ? item.Height : item.Width,
+        rotated ? item.Width : item.Height,
+        item.TargetBin);
+
+      int epIndex = 0;
+      while (epIndex < ExtremePoints.Count && (!IsPositionFeasible(rotatedItem, ExtremePoints.ElementAt(epIndex)))) { epIndex++; }
+
+      if (epIndex < ExtremePoints.Count) {
+        var currentPoint = ExtremePoints.ElementAt(epIndex);
+
+        var result = new PackingPosition(currentPoint.AssignedBin, currentPoint.X, currentPoint.Y, rotated);
+        return result;
+      }
+      return null;
+    }
+    public override PackingPosition FindPositionBySliding(PackingItem item, bool rotated) {
+      PackingPosition currentPosition = new PackingPosition(0,
+        BinShape.Width - (rotated ? item.Height : item.Width),
+        BinShape.Height - (rotated ? item.Width : item.Height), rotated);
+      //Slide the item as far as possible to the left
+      while (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition))
+        || IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition))) {
+        //Slide the item as far as possible to the bottom
+        while (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition))) {
+          currentPosition = PackingPosition.MoveDown(currentPosition);
+        }
+        if (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition)))
+          currentPosition = PackingPosition.MoveLeft(currentPosition);
+      }
+
+      return IsPositionFeasible(item, currentPosition) ? currentPosition : null;
+    }
+
+    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items) {
+      var temp = new List<int>(sequence);
+      for (int i = 0; i < temp.Count; i++) {
+        var item = items[temp[i]];
+        var position = FindPositionBySliding(item, false);
+        if (position != null) {
+          PackItem(temp[i], item, position);
+          sequence.Remove(temp[i]);
+        }
+      }
+    }
+    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray) {
+      var temp = new List<int>(sequence);
+      for (int i = 0; i < temp.Count; i++) {
+        var item = items[temp[i]];
+        var position = FindPositionBySliding(item, rotationArray[temp[i]]);
+        if (position != null) {
+          PackItem(temp[i], item, position);
+          sequence.Remove(temp[i]);
+        }
+      }
+    }
+    public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
+      var temp = new List<int>(sequence);
+      foreach (int itemID in temp) {
+        var item = items[itemID];
+        var positionFound = FindExtremePointForItem(item, false, false);
+        if (positionFound != null) {
+          PackItem(itemID, item, positionFound);
+          sequence.Remove(itemID);
+        }
+      }
+    }
+    public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints, Dictionary<int, bool> rotationArray) {
+      var temp = new List<int>(sequence);
+      foreach (int itemID in temp) {
+        var item = items[itemID];
+        var positionFound = FindExtremePointForItem(item, rotationArray[itemID], false);
+        if (positionFound != null) {
+          PackItem(itemID, item, positionFound);
+          sequence.Remove(itemID);
+        }
+      }
+    }
+
+    public override int ShortestPossibleSideFromPoint(PackingPosition position) {
+      int shortestSide = int.MaxValue;
+      int width = BinShape.Width;
+      int height = BinShape.Height;
+
+      if (position.X >= width || position.Y >= height)
+        return shortestSide;
+
+      PackingPosition current = new PackingPosition(0, position.X, position.Y);
+      while (current.X < width && IsPointOccupied(current)) { current = PackingPosition.MoveRight(current); }
+      if (current.X - position.X < shortestSide)
+        shortestSide = current.X - position.X;
+
+
+      current = new PackingPosition(0, position.X, position.Y);
+      while (current.Y < height && IsPointOccupied(current)) { current = PackingPosition.MoveUp(current); }
+      if (current.Y - position.Y < shortestSide)
+        shortestSide = current.Y - position.Y;
+
+      return shortestSide;
+    }
+    public override bool IsStaticStable(PackingItem item, PackingPosition position) {
+      throw new NotSupportedException();
+    }
+
+    protected override void InitializeOccupationLayers() {
+      for (int i = 0; i * 10 <= BinShape.Width; i += 1) {
+        OccupationLayers[i] = new List<int>();
+      }
+    }
+
+    protected override void AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) {
+      int x1 = position.X / 10;
+      int x2 = (position.X + (position.Rotated ? item.Height : item.Width)) / 10;
+
+      for (int i = x1; i <= x2; i++)
+        OccupationLayers[i].Add(itemID);
+    }
+    protected override List<int> GetLayerItemIDs(PackingPosition position) {
+      return OccupationLayers[position.X / 10];
+    }
+    protected override List<int> GetLayerItemIDs(PackingItem item, PackingPosition position) {
+      List<int> result = new List<int>();
+      int x1 = position.X / 10;
+      int x2 = (position.X + (position.Rotated ? item.Height : item.Width)) / 10;
+
+      for (int i = x1; i <= x2; i++)
+        result.AddRange(OccupationLayers[i]);
+
+      return result;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/BinUtilizationEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/BinUtilizationEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/BinUtilizationEvaluator.cs	(revision 14170)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bin-Utilization Evaluator (2d)", "Calculates the overall utilization of bin space.")]
+  [StorableClass]
+  public class BinUtilizationEvaluator : Item, IEvaluator {
+
+    [StorableConstructor]
+    protected BinUtilizationEvaluator(bool deserializing) : base(deserializing) { }
+    protected BinUtilizationEvaluator(BinUtilizationEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BinUtilizationEvaluator() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinUtilizationEvaluator(this, cloner);
+    }
+
+    #region IEvaluator Members
+    public double Evaluate(Solution solution) {
+      return CalculateBinUtilization(solution);
+    }
+
+
+    public static double CalculateBinUtilization(Solution solution) {
+      int nrOfBins = solution.NrOfBins;
+      double totalUsedSpace = 0;
+      double totalUsableSpace = 0;
+
+      for (int i = 0; i < nrOfBins; i++) {
+        totalUsableSpace += solution.Bins[i].BinShape.Volume;
+        totalUsedSpace += solution.Bins[i].Items.Sum(kvp => kvp.Value.Volume);
+      }
+
+      return totalUsedSpace / totalUsableSpace;
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/PackingRatioEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/PackingRatioEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Evaluators/PackingRatioEvaluator.cs	(revision 14170)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Packing-Ratio Evaluator (2d)", "Calculates the ratio between packed and unpacked space.")]
+  [StorableClass]
+  public class PackingRatioEvaluator : Item, IEvaluator {
+
+    [StorableConstructor]
+    protected PackingRatioEvaluator(bool deserializing) : base(deserializing) { }
+    protected PackingRatioEvaluator(PackingRatioEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PackingRatioEvaluator() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingRatioEvaluator(this, cloner);
+    }
+
+    #region IEvaluator Members
+    public double Evaluate(Solution solution) {
+      return CalculatePackingRatio(solution);
+    }
+
+    /* 
+        Falkenauer:1996 - A Hybrid Grouping Genetic Algorithm for Bin Packing
+        
+        fBPP = (SUM[i=1..N](Fi / C)^k)/N
+        N.......the number of bins used in the solution,
+        Fi......the sum of sizes of the items in the bin i (the fill of the bin),
+        C.......the bin capacity and
+        k.......a constant, k>1.
+     */
+    public static double CalculatePackingRatio(Solution solution) {
+      int nrOfBins = solution.NrOfBins;
+      double result = 0;
+      const double k = 2;
+      for (int i = 0; i < nrOfBins; i++) {
+        double f = solution.Bins[i].Items.Sum(kvp => kvp.Value.Volume);
+        double c = solution.Bins[i].BinShape.Volume;
+        result += Math.Pow(f / c, k);
+      }
+
+      result = result / nrOfBins;
+      return result;
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/BPPData.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/BPPData.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/BPPData.cs	(revision 14170)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.BinPacking2D {
+
+  public class BPPData {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of items.
+    /// </summary>
+    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.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomDataDescriptor.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomDataDescriptor.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomDataDescriptor.cs	(revision 14170)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  internal class RandomDataDescriptor : IDataDescriptor {
+    public string Name { get; private set; }
+    public string Description { get; private set; }
+
+    public int NumItems { get; set; }
+    public int Seed { get; set; }
+
+    internal RandomDataDescriptor(string name, string description, int numItems, int seed) {
+      this.Name = name;
+      this.Description = description;
+      this.NumItems = numItems;
+      this.Seed = seed;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomInstanceProvider.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomInstanceProvider.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Instances/RandomInstanceProvider.cs	(revision 14170)
@@ -0,0 +1,240 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002 - 2016 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
+
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  // make sure that for each class we have a separate entry in the problem instance providers
+  public class RandomInstanceClass1Provider : RandomInstanceProvider {
+    public RandomInstanceClass1Provider() : base() {
+      @class = 1;
+      binWidth = binHeight = 10;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 11);
+      h = rand.Next(1, 11);
+    }
+  }
+  public class RandomInstanceClass2Provider : RandomInstanceProvider {
+    public RandomInstanceClass2Provider() : base() {
+      @class = 2;
+      binWidth = binHeight = 30;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 11);
+      h = rand.Next(1, 11);
+    }
+  }
+  public class RandomInstanceClass3Provider : RandomInstanceProvider {
+    public RandomInstanceClass3Provider() : base() {
+      @class = 3;
+      binWidth = binHeight = 40;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 36);
+      h = rand.Next(1, 36);
+    }
+  }
+
+  public class RandomInstanceClass4Provider : RandomInstanceProvider {
+    public RandomInstanceClass4Provider() : base() {
+      @class = 4;
+      binWidth = binHeight = 100;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 36);
+      h = rand.Next(1, 36);
+    }
+  }
+  public class RandomInstanceClass5Provider : RandomInstanceProvider {
+    public RandomInstanceClass5Provider() : base() {
+      @class = 5;
+      binWidth = binHeight = 100;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 101);
+      h = rand.Next(1, 101);
+    }
+  }
+  public class RandomInstanceClass6Provider : RandomInstanceProvider {
+    public RandomInstanceClass6Provider() : base() {
+      @class = 6;
+      binWidth = binHeight = 300;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h) {
+      w = rand.Next(1, 101);
+      h = rand.Next(1, 101);
+    }
+  }
+  public class RandomInstanceClass7Provider : RandomInstanceProvider {
+    public RandomInstanceClass7Provider() : base() { @class = 7; binWidth = binHeight = 100; }
+  }
+  public class RandomInstanceClass8Provider : RandomInstanceProvider {
+    public RandomInstanceClass8Provider() : base() { @class = 8; binWidth = binHeight = 100; }
+  }
+  public class RandomInstanceClass9Provider : RandomInstanceProvider {
+    public RandomInstanceClass9Provider() : base() { @class = 9; binWidth = binHeight = 100; }
+  }
+  public class RandomInstanceClass10Provider : RandomInstanceProvider {
+    public RandomInstanceClass10Provider() : base() { @class = 10; binWidth = binHeight = 100; }
+  }
+  public abstract class RandomInstanceProvider : ProblemInstanceProvider<BPPData>, IProblemInstanceProvider<BPPData> {
+
+    protected int @class;
+    protected int binWidth, binHeight;
+
+    public override string Name {
+      get { return string.Format("Lodi, Martelli, Vigo (class={0})", @class); }
+    }
+
+    public override string Description {
+      get { return "Randomly generated 2d bin packing problems as described in Lodi, Martello, and Vigo. 'Heuristic and metaheuristic approaches for a class of two-dimensional bin packing problems.' INFORMS Journal on Computing 11.4 (1999): 345-357."; }
+    }
+
+    public override Uri WebLink {
+      get { return null; }
+    }
+
+    public override string ReferencePublication {
+      get { return "Lodi, Martello, and Vigo. 'Heuristic and metaheuristic approaches for a class of two-dimensional bin packing problems.' INFORMS Journal on Computing 11.4 (1999): 345-357."; }
+    }
+
+    public RandomInstanceProvider() : base() { }
+
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      // 10 classes
+      var rand = new MersenneTwister(1234); // fixed seed to makes sure that instances are always the same
+      foreach (int numItems in new int[] { 20, 40, 60, 80, 100 }) {
+        // get class parameters
+        // generate 30 different instances for each class
+        foreach (int instance in Enumerable.Range(1, 30)) {
+          string name = string.Format("n={0}-id={1:00} (class={2})", numItems, instance, @class);
+          var dd = new RandomDataDescriptor(name, name, numItems, seed: rand.Next());
+          yield return dd;
+        }
+      }
+    }
+
+    public override BPPData LoadData(IDataDescriptor dd) {
+      var randDd = dd as RandomDataDescriptor;
+      if (randDd == null) throw new NotSupportedException("Cannot load data descriptor " + dd);
+
+      var data = new BPPData() {
+        BinShape = new PackingShape(binWidth, binHeight),
+        Items = new PackingItem[randDd.NumItems]
+      };
+      var instanceRand = new MersenneTwister((uint)randDd.Seed);
+      for (int i = 0; i < randDd.NumItems; i++) {
+        int w, h;
+        SampleItemParameters(instanceRand, out w, out h);
+        data.Items[i] = new PackingItem(w, h, data.BinShape);
+      }
+      return data;
+    }
+
+    // default implementation for class 7 .. 10
+    protected virtual void SampleItemParameters(IRandom rand, out int w, out int h) {
+      // for classes 1 - 5
+      Contract.Assert(@class >= 7 && @class <= 10);
+      var weights = new double[] { 0.1, 0.1, 0.1, 0.1 };
+      weights[@class - 7] = 0.7;
+      var type = Enumerable.Range(1, 4).SampleProportional(rand, 1, weights).First();
+
+      int minW, maxW;
+      int minH, maxH;
+      GetItemParameters(type, rand, binWidth, binHeight,
+        out minW, out maxW, out minH, out maxH);
+
+      w = rand.Next(minW, maxW + 1);
+      h = rand.Next(minH, maxH + 1);
+    }
+
+    private void GetItemParameters(int type, IRandom rand,
+      int w, int h,
+      out int minW, out int maxW, out int minH, out int maxH) {
+      switch (type) {
+        case 1: {
+            minW = w * 2 / 3; maxW = w; // integer division on purpose (see paper)
+            minH = 1; maxH = h / 2;
+            break;
+          }
+        case 2: {
+            minW = 1; maxW = w / 2;
+            minH = h * 2 / 3; maxH = h;
+            break;
+          }
+        case 3: {
+            minW = w / 2; maxW = w;
+            minH = h / 2; maxH = h;
+            break;
+          }
+        case 4: {
+            minW = 1; maxW = w / 2;
+            minH = 1; maxH = h / 2;
+            break;
+          }
+        default: {
+            throw new InvalidProgramException();
+          }
+      }
+    }
+
+    public override bool CanImportData {
+      get { return false; }
+    }
+    public override BPPData ImportData(string path) {
+      throw new NotSupportedException();
+    }
+
+    public override bool CanExportData {
+      get { return true; }
+    }
+
+    public override void ExportData(BPPData instance, string file) {
+      using (Stream stream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write)) {
+        Export(instance, stream);
+      }
+    }
+    public static void Export(BPPData instance, Stream stream) {
+
+      using (var writer = new StreamWriter(stream)) {
+        writer.WriteLine(String.Format("{0,-5} {1,-5}   WBIN,HBIN", instance.BinShape.Width, instance.BinShape.Height));
+        for (int i = 0; i < instance.NumItems; i++) {
+          if (i == 0)
+            writer.WriteLine("{0,-5} {1,-5}   W(I),H(I),I=1,...,N", instance.Items[i].Width, instance.Items[i].Height);
+          else
+            writer.WriteLine("{0,-5} {1,-5}", instance.Items[i].Width, instance.Items[i].Height);
+
+        }
+        writer.Flush();
+      }
+    }
+
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 14170)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bottom-left IntegerVector Decoder (2d)", "Decodes the integer vector and creates a packing solution candidate")]
+  [StorableClass]
+  public class BottomLeftIntegerVectorDecoder : IntegerVectorDecoderBase {
+
+    [StorableConstructor]
+    protected BottomLeftIntegerVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftIntegerVectorDecoder(BottomLeftIntegerVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BottomLeftIntegerVectorDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftIntegerVectorDecoder(this, cloner);
+    }
+
+    protected override Solution CreateSolution(PackingShape binShape) {
+      return new Solution(binShape, useExtremePoints: false, stackingConstraints: false);
+    }
+
+    protected override PackingPosition FindPositionForItem(BinPacking2D bp, PackingItem item) {
+      return bp.FindPositionBySliding(item, rotated: false);
+    }
+
+    protected override BinPacking2D CreatePacking(
+      Solution partialSolution,
+      ref IList<int> remainingIDs, IList<PackingItem> items) {
+      var bp = new BinPacking2D(partialSolution.BinShape);
+      bp.SlidingBasedPacking(ref remainingIDs, items);
+      return bp;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 14170)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Extreme-point IntegerVector Decoder (2d)", "Decodes the integer vector and creates a packing solution candidate")]
+  [StorableClass]
+  public class ExtremePointIntegerVectorDecoder : IntegerVectorDecoderBase {
+
+    [StorableConstructor]
+    protected ExtremePointIntegerVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected ExtremePointIntegerVectorDecoder(ExtremePointIntegerVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ExtremePointIntegerVectorDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointIntegerVectorDecoder(this, cloner);
+    }
+
+    protected override Solution CreateSolution(PackingShape binShape) {
+      return new Solution(binShape, useExtremePoints: true, stackingConstraints: false);
+    }
+
+    protected override PackingPosition FindPositionForItem(BinPacking2D bp, PackingItem item) {
+      return bp.FindExtremePointForItem(item, false, stackingConstraints: false);
+    }
+
+    protected override BinPacking2D CreatePacking(
+      Solution partialSolution,
+      ref IList<int> remainingIDs, IList<PackingItem> items) {
+      var bp = new BinPacking2D(partialSolution.BinShape);
+      bp.ExtremePointBasedPacking(ref remainingIDs, items, stackingConstraints: false);
+      return bp;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 14170)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [StorableClass]
+  public abstract class IntegerVectorDecoderBase : Item, IDecoder<IntegerVector> {
+
+    [StorableConstructor]
+    protected IntegerVectorDecoderBase(bool deserializing) : base(deserializing) { }
+    protected IntegerVectorDecoderBase(IntegerVectorDecoderBase original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    protected IntegerVectorDecoderBase() : base() { }
+
+
+    public virtual Solution Decode(IntegerVector intVec, PackingShape binShape, IList<PackingItem> items) {
+      var sequenceMatrix = IntegerVectorProblem.GenerateSequenceMatrix(intVec);
+      Solution result = CreateSolution(binShape);
+
+      //Fill bins according to grouping vector
+      IList<int> remainingIDs = new List<int>();
+      foreach (var sequence in sequenceMatrix) {
+        remainingIDs = remainingIDs.Concat(sequence).ToList();
+        result.Bins.Add(CreatePacking(result, ref remainingIDs, items));
+      }
+      result.UpdateBinPackings();
+
+      //Try to put remaining items in existing bins
+      var temp = new List<int>(remainingIDs);
+      foreach (int id in temp) {
+        foreach (BinPacking2D bp in result.Bins) {
+          var position = FindPositionForItem(bp, items[id]);
+          if (position != null) {
+            bp.PackItem(id, items[id], position);
+            remainingIDs.Remove(id);
+            break;
+          }
+        }
+      }
+
+      //Put still remaining items in new bins
+      while (remainingIDs.Count > 0) {
+        result.Bins.Add(CreatePacking(result, ref remainingIDs, items));
+      }
+      result.UpdateBinPackings();
+
+      // gkronber: original implementation by Helm also updates the encoded solution (TODO)
+      // var newSolution = new int[intVec.Length];
+      // int binIndex = 0;
+      // foreach (var bp in result.BinPackings) {
+      //   foreach (var entry in bp.ItemPositions)
+      //     newSolution[entry.Key] = binIndex;
+      //   binIndex++;
+      // }
+      // solution.GroupingVector = new IntegerVector(newSolution);
+
+      return result;
+    }
+
+    protected abstract Solution CreateSolution(PackingShape binShape);
+    protected abstract PackingPosition FindPositionForItem(BinPacking2D bp, PackingItem item);
+    protected abstract BinPacking2D CreatePacking(Solution partialSolution, ref IList<int> remainingIDs, IList<PackingItem> items);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 14170)
@@ -0,0 +1,100 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bin Packing Problem (2D, integer vector encoding) (BPP)", "Represents a two-dimensional bin-packing problem using only bins with identical measures and bins/items with rectangular shapes.")]
+  [StorableClass]
+  [Creatable(Category = CreatableAttribute.Categories.CombinatorialProblems, Priority = 310)]
+  public sealed class IntegerVectorProblem : ProblemBase<IntegerVectorEncoding, IntegerVector> {
+    // persistence
+    [StorableConstructor]
+    private IntegerVectorProblem(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    private IntegerVectorProblem(IntegerVectorProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public IntegerVectorProblem()
+      : base() {
+      Decoder = new ExtremePointIntegerVectorDecoder(); // default decoder
+
+      // the int vector contains the target bin number for each item
+      Encoding = new IntegerVectorEncoding(EncodedSolutionName, Items.Count, min: 0, max: LowerBound + 1); // NOTE: assumes that all items can be packed into LowerBound+1 bins
+      AddOperators();
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+
+    private void AddOperators() {
+
+      // move operators are not yet supported (TODO)
+      Operators.RemoveAll(x => x is SingleObjectiveMoveGenerator);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveMaker);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveEvaluator);
+
+      Encoding.ConfigureOperators(Operators.OfType<IOperator>()); // gkronber: not strictly necessary (only when customer ops are added)
+    }
+
+    private void RegisterEventHandlers() {
+      // update encoding length when number of items is changed
+      ItemsParameter.ValueChanged += (sender, args) => Encoding.Length = Items.Count;
+      LowerBoundParameter.Value.ValueChanged += (sender, args) => {
+        for (int i = 0; i < Encoding.Bounds.Rows; i++) {
+          Encoding.Bounds[i, 1] = LowerBound + 1;
+        }
+      };
+    }
+
+    #region helpers
+
+    public static List<List<int>> GenerateSequenceMatrix(IntegerVector intVec) {
+      List<List<int>> result = new List<List<int>>();
+      int nrOfBins = intVec.Max() + 1;
+      for (int i = 0; i < nrOfBins; i++)
+        result.Add(new List<int>());
+      for (int i = 0; i < intVec.Length; i++) {
+        result[intVec[i]].Add(i);
+      }
+      return result;
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IDecoder.cs	(revision 14170)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  public interface IDecoder<in T> : IItem {
+    Solution Decode(T encodedSolution, PackingShape binShape, IList<PackingItem> items);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IEvaluator.cs	(revision 14170)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  public interface IEvaluator : IItem {
+    double Evaluate(Solution solution);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IOperator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IOperator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Interfaces/IOperator.cs	(revision 14170)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  public interface IOperator<TSol> : IItem {
+    ILookupParameter<ReadOnlyItemList<PackingItem>> ItemsParameter { get; }
+    ILookupParameter<PackingShape> BinShapeParameter { get; }
+    ILookupParameter<IDecoder<TSol>> DecoderParameter { get; }
+    ILookupParameter<IEvaluator> SolutionEvaluatorParameter { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/MoveEvaluatorBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/MoveEvaluatorBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/MoveEvaluatorBase.cs	(revision 14170)
@@ -0,0 +1,95 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [StorableClass]
+  public abstract class MoveEvaluatorBase<TSol, TMove> : SingleSuccessorOperator,
+    ISingleObjectiveMoveEvaluator, ISingleObjectiveMoveOperator, IOperator<TSol>
+    where TSol : class, IItem
+    where TMove : class, IItem {
+    public ILookupParameter<TSol> EncodedSolutionParameter {
+      get { return (ILookupParameter<TSol>)Parameters["EncodedSolution"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<ReadOnlyItemList<PackingItem>> ItemsParameter {
+      get { return (LookupParameter<ReadOnlyItemList<PackingItem>>)Parameters["Items"]; }
+    }
+    public ILookupParameter<PackingShape> BinShapeParameter {
+      get { return (LookupParameter<PackingShape>)Parameters["BinShape"]; }
+    }
+    public ILookupParameter<IDecoder<TSol>> DecoderParameter {
+      get { return (ILookupParameter<IDecoder<TSol>>)Parameters["Decoder"]; }
+    }
+    public ILookupParameter<IEvaluator> SolutionEvaluatorParameter {
+      get { return (ILookupParameter<IEvaluator>)Parameters["SolutionEvaluator"]; }
+    }
+    public ILookupParameter<TMove> MoveParameter {
+      get { return (ILookupParameter<TMove>)Parameters["Move"]; }
+    }
+
+
+    [StorableConstructor]
+    protected MoveEvaluatorBase(bool deserializing) : base(deserializing) { }
+    protected MoveEvaluatorBase(MoveEvaluatorBase<TSol, TMove> original, Cloner cloner) : base(original, cloner) { }
+    protected MoveEvaluatorBase()
+      : base() {
+      Parameters.Add(new LookupParameter<TSol>("EncodedSolution", "The encoded solution candidate to evaluate"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of a packing solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The evaluated quality of a move on a packing solution."));
+      Parameters.Add(new LookupParameter<ReadOnlyItemList<PackingItem>>("Items", "Packing-item data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<PackingShape>("BinShape", "Packing-bin data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<IDecoder<TSol>>("Decoder", "The decoding operator that is used to calculate a packing plan from the used representation."));
+      Parameters.Add(new LookupParameter<IEvaluator>("SolutionEvaluator", "The actual packing plan evaluation operator."));
+      Parameters.Add(new LookupParameter<TMove>("Move", "The move to evaluate."));
+    }
+
+    public override IOperation Apply() {
+      var move = MoveParameter.ActualValue;
+      var encSolCandidate = EncodedSolutionParameter.ActualValue;
+      var binShape = BinShapeParameter.ActualValue;
+      var items = ItemsParameter.ActualValue;
+
+
+      double moveQuality = EvaluateMove(encSolCandidate, move, binShape, items);
+
+      if (MoveQualityParameter.ActualValue == null)
+        MoveQualityParameter.ActualValue = new DoubleValue(moveQuality);
+      else
+        MoveQualityParameter.ActualValue.Value = moveQuality;
+      return base.Apply();
+    }
+
+    public abstract double EvaluateMove(TSol encodedSolutionCandidate, TMove move, PackingShape binShape, ReadOnlyItemList<PackingItem> items);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingItem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingItem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingItem.cs	(revision 14170)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("PackingItem (2d)", "Represents a rectangular packing-item for bin-packing problems.")]
+  [StorableClass]
+  public class PackingItem : PackingShape, IPackingItem {
+
+    public PackingShape TargetBin {
+      get { return ((IValueParameter<PackingShape>)Parameters["TargetBin"]).Value; }
+      set { ((IValueParameter<PackingShape>)Parameters["TargetBin"]).Value = value; }
+    }
+
+    public double Weight {
+      get { return ((IFixedValueParameter<DoubleValue>)Parameters["Weight"]).Value.Value; }
+      set { ((IFixedValueParameter<DoubleValue>)Parameters["Weight"]).Value.Value = value; }
+    }
+
+    public int Material {
+      get { return ((IFixedValueParameter<IntValue>)Parameters["Material"]).Value.Value; }
+      set { ((IFixedValueParameter<IntValue>)Parameters["Material"]).Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PackingItem(bool deserializing) : base(deserializing) { }
+    protected PackingItem(PackingItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingItem(this, cloner);
+    }
+
+    public PackingItem()
+      : base() {
+      Parameters.Add(new ValueParameter<PackingShape>("TargetBin"));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Weight"));
+      Parameters.Add(new FixedValueParameter<IntValue>("Material"));
+    }
+
+    public PackingItem(int width, int height, PackingShape targetBin)
+      : this() {
+      this.Width = width;
+      this.Height = height;
+      this.TargetBin = (PackingShape)targetBin.Clone();
+    }
+
+    public bool SupportsStacking(IPackingItem other) {
+      return ((other.Material < this.Material) || (other.Material.Equals(this.Material) && other.Weight <= this.Weight));
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingPosition.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingPosition.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingPosition.cs	(revision 14170)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Packing Position (2d)", "Represents a packing-position associated with a two dimensional packing-problem.")]
+  [StorableClass]
+  // PackingPosition is an immutable class (and handled as value type concerning Equals and GetHashCode())
+  public class PackingPosition : BinPacking.PackingPosition, IComparable<PackingPosition> {
+    [Storable]
+    private readonly int x;
+    public int X { get { return x; } }
+
+    [Storable]
+    private readonly int y;
+    public int Y { get { return y; } }
+
+    [StorableConstructor]
+    protected PackingPosition(bool deserializing) : base(deserializing) { }
+    protected PackingPosition(PackingPosition original, Cloner cloner)
+      : base(original, cloner) {
+      x = original.X;
+      y = original.Y;
+    }
+
+    public PackingPosition(int assignedBin, int x, int y, bool rotated = false)
+      : base(assignedBin, rotated) {
+      this.x = x;
+      this.y = y;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingPosition(this, cloner);
+    }
+
+    public override string ToString() {
+      return string.Format("[AssignedBin: {0}; ({1},{2})]", AssignedBin, x, y);
+    }
+
+    public override bool Equals(object obj) {
+      var other = obj as PackingPosition;
+      if (other != null)
+        return (other.X == this.X && other.Y == this.Y && base.Equals(other));
+      else return false;
+    }
+
+    public override int GetHashCode() {
+      return base.GetHashCode() + 13 * X + 17 * Y;
+    }
+
+    public static PackingPosition MoveLeft(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X - 1, original.Y, original.Rotated);
+    }
+    public static PackingPosition MoveDown(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y - 1, original.Rotated);
+    }
+
+    public static PackingPosition MoveRight(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X + 1, original.Y, original.Rotated);
+    }
+    public static PackingPosition MoveUp(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y + 1, original.Rotated);
+    }
+
+
+    #region IComparable<PackingPosition> Members
+
+    public int CompareTo(PackingPosition other) {
+      int result = X.CompareTo(other.X);
+      if (result == 0)
+        result = Y.CompareTo(other.Y);
+
+      return result;
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingShape.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingShape.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PackingShape.cs	(revision 14170)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("PackingShape (2d)", "Represents the rectangular measures (width, height) of a two-dimensional bin-packing object.")]
+  [StorableClass]
+  public class PackingShape : PackingShape<PackingPosition>, IComparable<PackingShape> {
+    public int Height {
+      get { return ((IFixedValueParameter<IntValue>)Parameters["Height"]).Value.Value; }
+      set { ((IFixedValueParameter<IntValue>)Parameters["Height"]).Value.Value = value; }
+    }
+
+    public int Width {
+      get { return ((IFixedValueParameter<IntValue>)Parameters["Width"]).Value.Value; }
+      set { ((IFixedValueParameter<IntValue>)Parameters["Width"]).Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PackingShape(bool deserializing) : base(deserializing) { }
+    protected PackingShape(PackingShape original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PackingShape()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>("Width"));
+      Parameters.Add(new FixedValueParameter<IntValue>("Height"));
+    }
+    public PackingShape(int width, int height)
+      : this() {
+      this.Height = height;
+      this.Width = width;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingShape(this, cloner);
+    }
+
+    public override string ToString() {
+      return String.Format("RectangularPackingShape ({0}, {1})", this.Width, this.Height);
+    }
+
+    #region IComparable<RectangularPackingShape> Members
+
+    public int CompareTo(PackingShape other) {
+      int result = this.Width.CompareTo(other.Width);
+      if (result == 0)
+        result = this.Height.CompareTo(other.Height);
+      return result;
+    }
+
+    public override int CompareTo(object obj) {
+      var other = obj as PackingShape;
+      if (other != null) return CompareTo(other);
+      else throw new ArgumentException(string.Format("Cannot compare to object {0}", obj), "obj");
+    }
+
+    #endregion
+
+
+    #region Helpers
+    public override PackingPosition Origin { get { return new PackingPosition(0, 0, 0); } }
+    public override int Volume { get { return Height * Width; } }
+
+    public override bool EnclosesPoint(PackingPosition myPosition, PackingPosition checkedPoint) {
+      return (myPosition.X <= checkedPoint.X &&
+                (myPosition.X + (myPosition.Rotated ? Height : Width) - 1) >= checkedPoint.X &&
+                myPosition.Y <= checkedPoint.Y &&
+                (myPosition.Y + (myPosition.Rotated ? Width : Height) - 1) >= checkedPoint.Y);
+    }
+    public override bool Encloses(PackingPosition checkedPosition, PackingShape<PackingPosition> checkedShape) {
+      return Encloses(checkedPosition, (PackingShape)checkedShape);
+    }
+    private bool Encloses(PackingPosition checkedPosition, PackingShape checkedShape) {
+      return Encloses(new RectangleDiagonal(this), new RectangleDiagonal(checkedPosition, checkedShape));
+    }
+    private bool Encloses(RectangleDiagonal r1, RectangleDiagonal r2) {
+      return (r1.x1 <= r2.x1 &&
+                r1.x2 >= r2.x2 &&
+                r1.y1 <= r2.y1 &&
+                r1.y2 >= r2.y2);
+    }
+
+    public override bool Overlaps(PackingPosition myPosition, PackingPosition checkedPosition, PackingShape<PackingPosition> checkedShape) {
+      return Overlaps(myPosition, checkedPosition, (PackingShape)checkedShape);
+    }
+    private bool Overlaps(PackingPosition myPosition, PackingPosition checkedPosition, PackingShape checkedShape) {
+      return Overlaps(new RectangleDiagonal(myPosition, this), new RectangleDiagonal(checkedPosition, checkedShape));
+    }
+    private bool Overlaps(RectangleDiagonal r1, RectangleDiagonal r2) {
+      return !(r1.x1 > r2.x2 ||
+               r1.y1 > r2.y2 ||
+               r1.x2 < r2.x1 ||
+               r1.y2 < r2.y1);
+    }
+
+    public override void ApplyHorizontalOrientation() {
+      if (Width < Height) {
+        var aux = Width;
+        Width = Height;
+        Height = aux;
+      }
+    }
+    #endregion
+
+
+    private struct RectangleDiagonal {
+      public int x1;
+      public int y1;
+      public int x2;
+      public int y2;
+      public RectangleDiagonal(PackingShape myShape) : this(new PackingPosition(0, 0, 0), myShape) { }
+      public RectangleDiagonal(PackingPosition myPosition, PackingShape myShape) {
+        x1 = myPosition.X;
+        y1 = myPosition.Y;
+        x2 = myPosition.X + (myPosition.Rotated ? myShape.Height : myShape.Width) - 1;
+        y2 = myPosition.Y + (myPosition.Rotated ? myShape.Width : myShape.Height) - 1;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/BottomLeftPermutationDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 14170)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bottom-left Permutation Decoder (2d)", "Decodes the permutation and creates a packing solution candidate")]
+  [StorableClass]
+  public class BottomLeftPermutationDecoder : Item, IDecoder<Permutation> {
+
+    [StorableConstructor]
+    protected BottomLeftPermutationDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftPermutationDecoder(BottomLeftPermutationDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BottomLeftPermutationDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftPermutationDecoder(this, cloner);
+    }
+
+    public Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items) {
+      Solution result = new Solution(binShape, useExtremePoints: false, stackingConstraints: false);
+      IList<int> remainingIDs = new List<int>(permutation);
+      while (remainingIDs.Count > 0) {
+        var bp = new BinPacking2D(binShape);
+        bp.SlidingBasedPacking(ref remainingIDs, items);
+        result.Bins.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/ExtremePointPermutationDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 14170)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Extreme-point Permutation Decoder (2d)", "Decodes the permutation and creates a packing solution candidate")]
+  [StorableClass]
+  public class ExtremePointPermutationDecoder : Item, IDecoder<Permutation> {
+
+    [StorableConstructor]
+    protected ExtremePointPermutationDecoder(bool deserializing) : base(deserializing) { }
+    protected ExtremePointPermutationDecoder(ExtremePointPermutationDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ExtremePointPermutationDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointPermutationDecoder(this, cloner);
+    }
+
+    public Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items) {
+      Solution result = new Solution(binShape, useExtremePoints: true, stackingConstraints: false);
+      IList<int> remainingIDs = new List<int>(permutation);
+      while (remainingIDs.Count > 0) {
+        var bp = new BinPacking2D(binShape);
+        bp.ExtremePointBasedPacking(ref remainingIDs, items, stackingConstraints: false);
+        result.Bins.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/PermutationProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/PermutationProblem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/PermutationProblem.cs	(revision 14170)
@@ -0,0 +1,88 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bin Packing Problem (2D, permutation encoding) (BPP)", "Represents a two-dimensional bin-packing problem using only bins with identical measures and bins/items with rectangular shapes.")]
+  [StorableClass]
+  [Creatable(Category = CreatableAttribute.Categories.CombinatorialProblems, Priority = 300)]
+  public sealed class PermutationProblem : ProblemBase<PermutationEncoding, Permutation> {
+    // persistence
+    [StorableConstructor]
+    private PermutationProblem(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    private PermutationProblem(PermutationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public PermutationProblem()
+      : base() {
+      Decoder = new ExtremePointPermutationDecoder(); // default decoder
+
+      Encoding = new PermutationEncoding(EncodedSolutionName, Items.Count, PermutationTypes.Absolute);
+      AddOperators();
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+
+    private void AddOperators() {
+      Operators.Add(new TranslocationMoveEvaluator());
+      Operators.Add(new Swap2MoveEvaluator());
+
+      Operators.RemoveAll(x => x is SingleObjectiveMoveGenerator);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveMaker);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveEvaluator);
+
+      Encoding.ConfigureOperators(Operators.OfType<IOperator>());
+
+      foreach (var op in Operators.OfType<IOperator<Permutation>>()) {
+        op.BinShapeParameter.ActualName = BinShapeParameter.Name;
+        op.ItemsParameter.ActualName = ItemsParameter.Name;
+        op.SolutionEvaluatorParameter.ActualName = SolutionEvaluatorParameter.Name;
+        op.DecoderParameter.ActualName = DecoderParameter.Name;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      // update encoding length when number of items is changed
+      ItemsParameter.ValueChanged += (sender, args) => Encoding.Length = Items.Count;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/Swap2MoveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 14170)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Swap2MoveEvaluator", "Move evaluator for 2-opt moves.")]
+  [StorableClass]
+  public sealed class Swap2MoveEvaluator : MoveEvaluatorBase<Permutation, Swap2Move>, IPermutationSwap2MoveOperator {
+    public ILookupParameter<Swap2Move> Swap2MoveParameter {
+      get { return MoveParameter; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return EncodedSolutionParameter; }
+    }
+
+    [StorableConstructor]
+    private Swap2MoveEvaluator(bool deserializing) : base(deserializing) { }
+    private Swap2MoveEvaluator(Swap2MoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public Swap2MoveEvaluator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap2MoveEvaluator(this, cloner);
+    }
+
+    public override double EvaluateMove(Permutation permutation, Swap2Move move, PackingShape binShape, ReadOnlyItemList<PackingItem> items) {
+      // uses full evaluation
+      Swap2Manipulator.Apply(permutation, move.Index1, move.Index2);
+      var solution = DecoderParameter.ActualValue.Decode(permutation, binShape, items);
+
+      return SolutionEvaluatorParameter.ActualValue.Evaluate(solution);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/TranslocationMoveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 14170)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("TranslocationMoveEvaluator", "Move evaluator for insertion or translocation moves.")]
+  [StorableClass]
+  public sealed class TranslocationMoveEvaluator : MoveEvaluatorBase<Permutation, TranslocationMove>, IPermutationTranslocationMoveOperator {
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return MoveParameter; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return EncodedSolutionParameter; }
+    }
+    [StorableConstructor]
+    private TranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
+    private TranslocationMoveEvaluator(TranslocationMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public TranslocationMoveEvaluator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveEvaluator(this, cloner);
+    }
+
+    public override double EvaluateMove(Permutation permutation, TranslocationMove move, PackingShape binShape,
+      ReadOnlyItemList<PackingItem> items) {
+
+      // uses full evaluation
+      TranslocationManipulator.Apply(permutation, move.Index1, move.Index2, move.Index3);
+      var solution = DecoderParameter.ActualValue.Decode(permutation, binShape, items);
+
+      return SolutionEvaluatorParameter.ActualValue.Evaluate(solution);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/ProblemBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/ProblemBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/ProblemBase.cs	(revision 14170)
@@ -0,0 +1,259 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [StorableClass]
+  public abstract class ProblemBase<TEnc, TSol> :
+    SingleObjectiveBasicProblem<TEnc>, IProblemInstanceConsumer<BPPData>, IProblemInstanceExporter<BPPData>
+    where TEnc : class, IEncoding
+    where TSol : class, IItem {
+    protected readonly string SolutionEvaluatorParameterName = "SolutionEvaluator";
+    public readonly string EncodedSolutionName = "EncodedSolution";
+    #region Default Instance
+    private readonly BPPData defaultInstance = new BPPData() {
+      Name = "2D BPP Default Instance",
+      Description = "The default instance for 2D Bin Packing.",
+      BinShape = new PackingShape(20, 16),
+      Items = new PackingItem[] {
+        new PackingItem(3,  8, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(5,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(9,  3, new PackingShape(20, 16)) { Material = 1, Weight = 1.0},
+        new PackingItem(2,  7, new PackingShape(20, 16)) { Material = 1, Weight = 1.0}
+      },
+    };
+    #endregion
+
+    #region parameter properties
+    public IValueParameter<IDecoder<TSol>> DecoderParameter {
+      get { return (IValueParameter<IDecoder<TSol>>)Parameters["Decoder"]; }
+    }
+    public IValueParameter<IEvaluator> SolutionEvaluatorParameter {
+      get { return (IValueParameter<IEvaluator>)Parameters[SolutionEvaluatorParameterName]; }
+    }
+    public IValueParameter<ReadOnlyItemList<PackingItem>> ItemsParameter {
+      get { return (IValueParameter<ReadOnlyItemList<PackingItem>>)Parameters["Items"]; }
+    }
+    public IValueParameter<PackingShape> BinShapeParameter {
+      get { return (IValueParameter<PackingShape>)Parameters["BinShape"]; }
+    }
+    public IValueParameter<Solution> BestKnownSolutionParameter {
+      get { return (IValueParameter<Solution>)Parameters["BestKnownSolution"]; }
+    }
+    public IFixedValueParameter<IntValue> LowerBoundParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["LowerBound"]; }
+    }
+    #endregion
+
+    #region properties
+    public IDecoder<TSol> Decoder {
+      get { return DecoderParameter.Value; }
+      set { DecoderParameter.Value = value; }
+    }
+    public IEvaluator SolutionEvaluator {
+      get { return SolutionEvaluatorParameter.Value; }
+      set { SolutionEvaluatorParameter.Value = value; }
+    }
+    public ReadOnlyItemList<PackingItem> Items {
+      get { return ItemsParameter.Value; }
+      set { ItemsParameter.Value = value; }
+    }
+    public PackingShape BinShape {
+      get { return BinShapeParameter.Value; }
+      set { BinShapeParameter.Value = value; }
+    }
+    public Solution BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+    public int LowerBound {
+      get { return LowerBoundParameter.Value.Value; }
+    }
+    public int NumberOfItems {
+      get { return Items == null ? 0 : Items.Count; }
+    }
+    #endregion
+
+    // persistence
+    [StorableConstructor]
+    protected ProblemBase(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    protected ProblemBase(ProblemBase<TEnc, TSol> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected ProblemBase()
+      : base() {
+      var defaultEvaluator = new PackingRatioEvaluator();
+      Parameters.Add(new ValueParameter<IDecoder<TSol>>("Decoder", "The decoder translates a permutation to a packing solution candidiates"));
+      Parameters.Add(new ValueParameter<IEvaluator>(SolutionEvaluatorParameterName, "The evaluator calculates qualities of solution candidates", defaultEvaluator));
+      Parameters.Add(new ValueParameter<ReadOnlyItemList<PackingItem>>("Items", "The items which must be packed into bins"));
+      Parameters.Add(new ValueParameter<PackingShape>("BinShape", "The size of bins into which items must be packed"));
+      Parameters.Add(new OptionalValueParameter<Solution>("BestKnownSolution", "The best solution found so far"));
+      Parameters.Add(new FixedValueParameter<IntValue>("LowerBound", "A lower bound for the number of bins that is necessary to pack all items"));
+
+      Load(defaultInstance);
+    }
+
+    public override bool Maximization { get { return true; } }
+
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var encodedSolutionCand = (TSol)individual[EncodedSolutionName];
+      var decoder = Decoder;
+      var solution = decoder.Decode(encodedSolutionCand, BinShape, Items);
+      return SolutionEvaluator.Evaluate(solution);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      Analyze(individuals.Select(i => (TSol)i[EncodedSolutionName]).ToArray(), qualities, results, random);
+    }
+
+    public virtual void Analyze(TSol[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      var bestSolutionResultName = "Best Packing Solution";
+      var numContainersResultName = "Nr of Containers";
+      var binUtilResultName = "Overall Bin Utilization";
+
+      if (!results.ContainsKey(bestSolutionResultName)) results.Add(new Result(bestSolutionResultName, typeof(Solution)));
+      if (!results.ContainsKey(numContainersResultName)) results.Add(new Result(numContainersResultName, typeof(IntValue)));
+      if (!results.ContainsKey(binUtilResultName)) results.Add(new Result(binUtilResultName, typeof(DoubleValue)));
+
+
+      // find index of item with max quality
+      int bestIdx = 0;
+      for (int j = 1; j < qualities.Length; j++)
+        if (qualities[j] > qualities[bestIdx]) bestIdx = j;
+
+
+      // update best solution so far
+      var bestSolution = results[bestSolutionResultName].Value as Solution;
+      if (bestSolution == null ||
+        bestSolution.Quality.Value < qualities[bestIdx]) {
+
+        var newBestSolution = Decoder.Decode(individuals[bestIdx], BinShape, Items);
+        newBestSolution.Quality = new DoubleValue(qualities[bestIdx]);
+        results[bestSolutionResultName].Value = newBestSolution;
+        results[numContainersResultName].Value = new IntValue(newBestSolution.NrOfBins);
+        results[binUtilResultName].Value = new DoubleValue(BinUtilizationEvaluator.CalculateBinUtilization(newBestSolution));
+
+        // update best known solution
+        var bestKnownQuality = BestKnownQualityParameter.Value;
+        if (bestKnownQuality == null ||
+            bestKnownQuality.Value < qualities[bestIdx]) {
+          BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[bestIdx]);
+          BestKnownSolutionParameter.ActualValue = newBestSolution;
+        }
+      }
+    }
+
+
+    #region Problem instance handling
+    public void Load(BPPData data) {
+      BestKnownSolutionParameter.Value = null;
+      BestKnownQualityParameter.Value = null;
+
+      if (data.BestKnownQuality.HasValue)
+        BestKnownQuality = data.BestKnownQuality.Value;
+
+      BinShape = data.BinShape;
+      var items = new ItemList<PackingItem>(data.Items);
+      items.Sort((x, y) => y.CompareTo(x));
+      Items = items.AsReadOnly();
+
+      ApplyHorizontalOrientation();
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+
+
+    public BPPData Export() {
+      return new BPPData {
+        Name = Name,
+        Description = Description,
+        BinShape = BinShape,
+        Items = Items.ToArray()
+      };
+    }
+    #endregion
+
+
+    #region helpers
+    private void ApplyHorizontalOrientation() {
+      BinShape.ApplyHorizontalOrientation();
+      foreach (var shape in Items) {
+        shape.ApplyHorizontalOrientation();
+      }
+    }
+
+    private int CalculateLowerBound() {
+      //This is the obvious continuous lower bound calculation; Martello and Vigo proposed a better way but it has not been implemented yet;
+      int itemsVol = Items.Select(x => x.Volume).Sum();
+      int binVol = BinShape.Volume;
+      return (itemsVol + binVol - 1) / (binVol);
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Solution.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Solution.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/2D/Solution.cs	(revision 14170)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bin Packing Solution (2d)", "Represents a solution for a 2D bin packing problem.")]
+  [StorableClass]
+  public class Solution : PackingPlan<PackingPosition, PackingShape, PackingItem> {
+    public Solution(PackingShape binShape) : this(binShape, false, false) { }
+    public Solution(PackingShape binShape, bool useExtremePoints, bool stackingConstraints) : base(binShape, useExtremePoints, stackingConstraints) { }
+    [StorableConstructor]
+    protected Solution(bool deserializing) : base(deserializing) { }
+    protected Solution(Solution original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Solution(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs	(revision 14170)
@@ -0,0 +1,327 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("BinPacking3D", "Represents a single-bin packing for a 3D bin-packing problem.")]
+  [StorableClass]
+  public class BinPacking3D : BinPacking<PackingPosition, PackingShape, PackingItem> {
+
+    public BinPacking3D(PackingShape binShape)
+      : base(binShape) {
+      ExtremePoints = new SortedSet<PackingPosition>();
+      ExtremePoints.Add(binShape.Origin);
+      InitializeOccupationLayers();
+    }
+    [StorableConstructor]
+    protected BinPacking3D(bool deserializing) : base(deserializing) { }
+    protected BinPacking3D(BinPacking3D original, Cloner cloner)
+      : base(original, cloner) {
+      this.ExtremePoints = new SortedSet<PackingPosition>(original.ExtremePoints.Select(p => cloner.Clone(p)));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinPacking3D(this, cloner);
+    }
+
+    protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position) {
+      int newWidth = position.Rotated ? newItem.Depth : newItem.Width;
+      int newDepth = position.Rotated ? newItem.Width : newItem.Depth;
+
+      //Find ExtremePoints beginning from sourcepointX
+      var sourcePointX = new PackingPosition(0, position.X + newWidth, position.Y, position.Z);
+      if (sourcePointX.X < BinShape.Width && sourcePointX.Y < BinShape.Height && sourcePointX.Z < BinShape.Depth) {
+        //Traversing down the y-axis  
+        PackingPosition current = new PackingPosition(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
+          current = PackingPosition.MoveLeft(current);
+        }
+        ExtremePoints.Add(current);
+
+        //Traversing down the z-axis
+        current = new PackingPosition(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
+        while (current.Z > 0 && !IsPointOccupied(PackingPosition.MoveBack(current))) {
+          current = PackingPosition.MoveBack(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add(current);
+      }
+
+      //Find ExtremePoints beginning from sourcepointY
+      var sourcePointY = new PackingPosition(0, position.X, position.Y + newItem.Height, position.Z);
+      if (sourcePointY.X < BinShape.Width && sourcePointY.Y < BinShape.Height && sourcePointY.Z < BinShape.Depth) {
+        //Traversing down the x-axis          
+        PackingPosition current = new PackingPosition(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
+        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
+          current = PackingPosition.MoveLeft(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add(current);
+
+        //Traversing down the z-axis
+        current = new PackingPosition(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
+        while (current.Z > 0 && !IsPointOccupied(PackingPosition.MoveBack(current))) {
+          current = PackingPosition.MoveBack(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add(current);
+      }
+
+      //Find ExtremePoints beginning from sourcepointZ
+      var sourcePointZ = new PackingPosition(0, position.X, position.Y, position.Z + newDepth);
+      if (sourcePointZ.X < BinShape.Width && sourcePointZ.Y < BinShape.Height && sourcePointZ.Z < BinShape.Depth) {
+        //Traversing down the x-axis
+        PackingPosition current = new PackingPosition(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
+        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
+          current = PackingPosition.MoveLeft(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add(current);
+
+        //Traversing down the y-axis
+        current = new PackingPosition(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
+        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
+          current = PackingPosition.MoveDown(current);
+        }
+        ExtremePoints.Add((PackingPosition)current.Clone());
+        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
+          current = PackingPosition.MoveLeft(current);
+        }
+        ExtremePoints.Add(current);
+      }
+    }
+
+    public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {
+
+      PackingItem newItem = new PackingItem(
+        rotated ? item.Depth : item.Width,
+        item.Height,
+        rotated ? item.Width : item.Depth,
+        item.TargetBin);
+
+      int epIndex = 0;
+      while (epIndex < ExtremePoints.Count && (
+        !IsPositionFeasible(newItem, ExtremePoints.ElementAt(epIndex))
+        || !IsSupportedByAtLeastOnePoint(newItem, ExtremePoints.ElementAt(epIndex))
+        || (stackingConstraints && !IsStaticStable(newItem, ExtremePoints.ElementAt(epIndex)))
+        || (stackingConstraints && !IsWeightSupported(newItem, ExtremePoints.ElementAt(epIndex)))
+      )) { epIndex++; }
+
+      if (epIndex < ExtremePoints.Count) {
+        var origPoint = ExtremePoints.ElementAt(epIndex);
+        var result = new PackingPosition(origPoint.AssignedBin, origPoint.X, origPoint.Y, origPoint.Z, rotated);
+        return result;
+      }
+      return null;
+    }
+
+    public override PackingPosition FindPositionBySliding(PackingItem item, bool rotated) {
+      //TODO: does not support stacking constraints yet
+      //Starting-position at upper right corner (=left bottom point of item-rectangle is at position item.width,item.height)
+      PackingPosition currentPosition = new PackingPosition(0,
+        BinShape.Width - (rotated ? item.Depth : item.Width),
+        BinShape.Height - item.Height,
+        BinShape.Depth - (rotated ? item.Width : item.Depth), rotated);
+      //Slide the item as far as possible to the bottom
+      while (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition))
+        || IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition))
+        || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
+        //Slide the item as far as possible to the left
+        while (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition))
+      || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
+          //Slide the item as far as possible to the back
+          while (IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
+            currentPosition = PackingPosition.MoveBack(currentPosition);
+          }
+          if (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition)))
+            currentPosition = PackingPosition.MoveLeft(currentPosition);
+        }
+        if (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition)))
+          currentPosition = PackingPosition.MoveDown(currentPosition);
+      }
+
+      return IsPositionFeasible(item, currentPosition) ? currentPosition : null;
+    }
+
+    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items) {
+      var temp = new List<int>(sequence);
+      for (int i = 0; i < temp.Count; i++) {
+        var item = items[temp[i]];
+        var position = FindPositionBySliding(item, false);
+        if (position != null) {
+          PackItem(temp[i], item, position);
+          sequence.Remove(temp[i]);
+        }
+      }
+    }
+    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray) {
+      var temp = new List<int>(sequence);
+      for (int i = 0; i < temp.Count; i++) {
+        var item = items[temp[i]];
+        var position = FindPositionBySliding(item, rotationArray[i]);
+        if (position != null) {
+          PackItem(temp[i], item, position);
+          sequence.Remove(temp[i]);
+        }
+      }
+    }
+    public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
+      var temp = new List<int>(sequence);
+      foreach (int itemID in temp) {
+        var item = items[itemID];
+        var positionFound = FindExtremePointForItem(item, false, stackingConstraints);
+        if (positionFound != null) {
+          PackItem(itemID, item, positionFound);
+          sequence.Remove(itemID);
+        }
+      }
+    }
+    public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints, Dictionary<int, bool> rotationArray) {
+      var temp = new List<int>(sequence);
+      foreach (int itemID in temp) {
+        var item = items[itemID];
+        var positionFound = FindExtremePointForItem(item, rotationArray[itemID], stackingConstraints);
+        if (positionFound != null) {
+          PackItem(itemID, item, positionFound);
+          sequence.Remove(itemID);
+        }
+      }
+    }
+
+    public override int ShortestPossibleSideFromPoint(PackingPosition position) {
+
+      int shortestSide = int.MaxValue;
+      int width = BinShape.Width;
+      int height = BinShape.Height;
+      int depth = BinShape.Depth;
+
+      if (position.X >= width || position.Y >= height || position.Z >= depth)
+        return shortestSide;
+
+      PackingPosition current = new PackingPosition(0, position.X, position.Y, position.Z);
+      while (current.X < width && IsPointOccupied(current)) { current = PackingPosition.MoveRight(current); }
+      if (current.X - position.X < shortestSide)
+        shortestSide = current.X - position.X;
+
+
+      current = new PackingPosition(0, position.X, position.Y, position.Z);
+      while (current.Y < height && IsPointOccupied(current)) { current = PackingPosition.MoveUp(current); }
+      if (current.Y - position.Y < shortestSide)
+        shortestSide = current.Y - position.Y;
+
+
+      current = new PackingPosition(0, position.X, position.Y, position.Z);
+      while (current.Z < depth && IsPointOccupied(current)) { current = PackingPosition.MoveFront(current); }
+      if (current.Z - position.Z < shortestSide)
+        shortestSide = current.Z - position.Z;
+
+      return shortestSide;
+    }
+    public override bool IsStaticStable(PackingItem item, PackingPosition position) {
+      //Static stability is given, if item is placed on the ground
+      if (position.Y == 0)
+        return true;
+
+      if (IsPointOccupied(new PackingPosition(0, position.X, position.Y - 1, position.Z))
+        && IsPointOccupied(new PackingPosition(0, position.X + item.Width - 1, position.Y - 1, position.Z))
+        && IsPointOccupied(new PackingPosition(0, position.X, position.Y - 1, position.Z + item.Depth - 1))
+        && IsPointOccupied(new PackingPosition(0, position.X + item.Width - 1, position.Y - 1, position.Z + item.Depth - 1)))
+        return true;
+
+      return false;
+    }
+
+
+    public bool IsSupportedByAtLeastOnePoint(PackingItem item, PackingPosition position) {
+      if (position.Y == 0)
+        return true;
+
+      int y = position.Y - 1;
+      for (int x = position.X; x < position.X + item.Width; x++)
+        for (int z = position.Z; z < position.Z + item.Depth; z++)
+          if (IsPointOccupied(new PackingPosition(0, x, y, z)))
+            return true;
+
+      return false;
+    }
+    public bool IsWeightSupported(PackingItem item, PackingPosition ep) {
+      if (ep.Y == 0)
+        return true;
+
+      if (Items[PointOccupation(new PackingPosition(0, ep.X, ep.Y - 1, ep.Z))].SupportsStacking(item)
+        && Items[PointOccupation(new PackingPosition(0, ep.X + item.Width - 1, ep.Y - 1, ep.Z))].SupportsStacking(item)
+        && Items[PointOccupation(new PackingPosition(0, ep.X, ep.Y - 1, ep.Z + item.Depth - 1))].SupportsStacking(item)
+        && Items[PointOccupation(new PackingPosition(0, ep.X + item.Width - 1, ep.Y - 1, ep.Z + item.Depth - 1))].SupportsStacking(item))
+        return true;
+
+      return false;
+    }
+
+
+    protected override void InitializeOccupationLayers() {
+      for (int i = 0; i * 10 <= BinShape.Depth; i += 1) {
+        OccupationLayers[i] = new List<int>();
+      }
+    }
+    protected override void AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) {
+      int z1 = position.Z / 10;
+      int z2 = (position.Z + (position.Rotated ? item.Width : item.Depth)) / 10;
+
+      for (int i = z1; i <= z2; i++)
+        OccupationLayers[i].Add(itemID);
+    }
+    protected override List<int> GetLayerItemIDs(PackingPosition position) {
+      return OccupationLayers[position.Z / 10];
+    }
+    protected override List<int> GetLayerItemIDs(PackingItem item, PackingPosition position) {
+      List<int> result = new List<int>();
+      int z1 = position.Z / 10;
+      int z2 = (position.Z + (position.Rotated ? item.Width : item.Depth)) / 10;
+
+      for (int i = z1; i <= z2; i++)
+        result.AddRange(OccupationLayers[i]);
+
+      return result;
+    }
+  }
+
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/BinUtilizationEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/BinUtilizationEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/BinUtilizationEvaluator.cs	(revision 14170)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  // NOTE: same implementation as for 2d problem
+  [Item("Bin-Utilization Evaluator (3d)", "Calculates the overall utilization of bin space.")]
+  [StorableClass]
+  public class BinUtilizationEvaluator : Item, IEvaluator {
+
+    [StorableConstructor]
+    protected BinUtilizationEvaluator(bool deserializing) : base(deserializing) { }
+    protected BinUtilizationEvaluator(BinUtilizationEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BinUtilizationEvaluator() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinUtilizationEvaluator(this, cloner);
+    }
+
+    #region IEvaluator Members
+    public double Evaluate(Solution solution) {
+      return CalculateBinUtilization(solution);
+    }
+
+
+    public static double CalculateBinUtilization(Solution solution) {
+      int nrOfBins = solution.NrOfBins;
+      double totalUsedSpace = 0;
+      double totalUsableSpace = 0;
+
+      for (int i = 0; i < nrOfBins; i++) {
+        totalUsableSpace += solution.Bins[i].BinShape.Volume;
+        totalUsedSpace += solution.Bins[i].Items.Sum(kvp => kvp.Value.Volume);
+      }
+
+      return totalUsedSpace / totalUsableSpace;
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/PackingRatioEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/PackingRatioEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Evaluators/PackingRatioEvaluator.cs	(revision 14170)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  // NOTE: same implementation as for 2d problem
+  [Item("Packing-Ratio Evaluator (3d)", "Calculates the ratio between packed and unpacked space.")]
+  [StorableClass]
+  public class PackingRatioEvaluator : Item, IEvaluator {
+
+    [StorableConstructor]
+    protected PackingRatioEvaluator(bool deserializing) : base(deserializing) { }
+    protected PackingRatioEvaluator(PackingRatioEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PackingRatioEvaluator() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingRatioEvaluator(this, cloner);
+    }
+
+    #region IEvaluator Members
+    public double Evaluate(Solution solution) {
+      return CalculatePackingRatio(solution);
+    }
+
+    /* 
+        Falkenauer:1996 - A Hybrid Grouping Genetic Algorithm for Bin Packing
+        
+        fBPP = (SUM[i=1..N](Fi / C)^k)/N
+        N.......the number of bins used in the solution,
+        Fi......the sum of sizes of the items in the bin i (the fill of the bin),
+        C.......the bin capacity and
+        k.......a constant, k>1.
+     */
+    public static double CalculatePackingRatio(Solution solution) {
+      int nrOfBins = solution.NrOfBins;
+      double result = 0;
+      const double k = 2;
+      for (int i = 0; i < nrOfBins; i++) {
+        double f = solution.Bins[i].Items.Sum(kvp => kvp.Value.Volume);
+        double c = solution.Bins[i].BinShape.Volume;
+        result += Math.Pow(f / c, k);
+      }
+
+      result = result / nrOfBins;
+      return result;
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/BPPData.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/BPPData.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/BPPData.cs	(revision 14170)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 {
+
+  public class BPPData {
+    /// <summary>
+    /// The name of the instance
+    /// </summary>
+    public string Name { get; set; }
+    /// <summary>
+    /// Optional! The description of the instance
+    /// </summary>
+    public string Description { get; set; }
+
+    /// <summary>
+    /// The number of items.
+    /// </summary>
+    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.
+    /// </summary>
+    public double? BestKnownQuality { get; set; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomDataDescriptor.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomDataDescriptor.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomDataDescriptor.cs	(revision 14170)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  internal class RandomDataDescriptor : IDataDescriptor {
+    public string Name { get; private set; }
+    public string Description { get; private set; }
+
+    internal int NumItems { get; private set; }
+    internal int Seed { get; private set; }
+
+    internal RandomDataDescriptor(string name, string description, int numItems, int @class, int seed) {
+      this.Name = name;
+      this.Description = description;
+      this.NumItems = numItems;
+      this.Seed = seed;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomInstanceProvider.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomInstanceProvider.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Instances/RandomInstanceProvider.cs	(revision 14170)
@@ -0,0 +1,230 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002 - 2016 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
+
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  // make sure that for each class we have a separate entry in the problem instance providers
+  public class RandomInstanceClass1Provider : RandomInstanceProvider {
+    public RandomInstanceClass1Provider() : base() { @class = 1; binWidth = binHeight = binDepth = 100; }
+  }
+  public class RandomInstanceClass2Provider : RandomInstanceProvider {
+    public RandomInstanceClass2Provider() : base() { @class = 2; binWidth = binHeight = binDepth = 100; }
+  }
+  public class RandomInstanceClass3Provider : RandomInstanceProvider {
+    public RandomInstanceClass3Provider() : base() { @class = 3; binWidth = binHeight = binDepth = 100; }
+  }
+  public class RandomInstanceClass4Provider : RandomInstanceProvider {
+    public RandomInstanceClass4Provider() : base() { @class = 4; binWidth = binHeight = binDepth = 100; }
+  }
+  public class RandomInstanceClass5Provider : RandomInstanceProvider {
+    public RandomInstanceClass5Provider() : base() { @class = 5; binWidth = binHeight = binDepth = 100; }
+  }
+
+  public class RandomInstanceClass6Provider : RandomInstanceProvider {
+    public RandomInstanceClass6Provider() : base() {
+      @class = 6;
+      binWidth = binHeight = binDepth = 10;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h, out int d) {
+      w = rand.Next(1, 11);
+      h = rand.Next(1, 11);
+      d = rand.Next(1, 11);
+    }
+  }
+  public class RandomInstanceClass7Provider : RandomInstanceProvider {
+    public RandomInstanceClass7Provider() : base() {
+      @class = 7;
+      binWidth = binHeight = binDepth = 40;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h, out int d) {
+      w = rand.Next(1, 36);
+      h = rand.Next(1, 36);
+      d = rand.Next(1, 36);
+    }
+  }
+  public class RandomInstanceClass8Provider : RandomInstanceProvider {
+    public RandomInstanceClass8Provider() : base() {
+      @class = 8;
+      binWidth = binHeight = binDepth = 100;
+    }
+    protected override void SampleItemParameters(IRandom rand, out int w, out int h, out int d) {
+      w = rand.Next(1, 101);
+      h = rand.Next(1, 101);
+      d = rand.Next(1, 101);
+    }
+  }
+
+  // class 9 from the paper (all-fill) is not implemented 
+  public abstract class RandomInstanceProvider : ProblemInstanceProvider<BPPData>, IProblemInstanceProvider<BPPData> {
+
+    protected int @class;
+    protected int binWidth, binHeight, binDepth;
+
+    public override string Name {
+      get { return string.Format("Martello, Pisinger, Vigo (class={0})", @class); }
+    }
+
+    public override string Description {
+      get { return "Randomly generated 3d bin packing problems as described in Martello, Pisinger, Vigo: 'The Three-Dimensional Bin Packing Problem', Operations Research Vol 48, Issue 2, 2000, pp. 256-267."; }
+    }
+
+    public override Uri WebLink {
+      get { return null; }
+    }
+
+    public override string ReferencePublication {
+      get { return "Martello, Pisinger, Vigo: 'The Three-Dimensional Bin Packing Problem', Operations Research Vol 48, Issue 2, 2000, pp. 256-267."; }
+    }
+
+    public RandomInstanceProvider() : base() { }
+
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      // 10 classes
+      var rand = new MersenneTwister(1234); // fixed seed to makes sure that instances are always the same
+      foreach (int numItems in new int[] { 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90 }) {
+        // get class parameters
+        // generate 30 different instances for each class
+        foreach (int instance in Enumerable.Range(1, 30)) {
+          string name = string.Format("n={0}-id={1:00} (class={2})", numItems, instance, @class);
+          var dd = new RandomDataDescriptor(name, name, numItems, @class, seed: rand.Next());
+          yield return dd;
+        }
+      }
+    }
+
+    public override BPPData LoadData(IDataDescriptor dd) {
+      var randDd = dd as RandomDataDescriptor;
+      if (randDd == null) throw new NotSupportedException("Cannot load data descriptor " + dd);
+
+      var data = new BPPData() {
+        BinShape = new PackingShape(binWidth, binHeight, binDepth),
+        Items = new PackingItem[randDd.NumItems]
+      };
+      var instanceRand = new MersenneTwister((uint)randDd.Seed);
+      for (int i = 0; i < randDd.NumItems; i++) {
+        int w, h, d;
+        SampleItemParameters(instanceRand, out w, out h, out d);
+        data.Items[i] = new PackingItem(w, h, d, data.BinShape);
+      }
+      return data;
+    }
+
+    // default implementation for class 1 .. 5
+    protected virtual void SampleItemParameters(IRandom rand, out int w, out int h, out int d) {
+      // for classes 1 - 5
+      Contract.Assert(@class >= 1 && @class <= 5);
+      var weights = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1 };
+      weights[@class - 1] = 0.6;
+      var type = Enumerable.Range(1, 5).SampleProportional(rand, 1, weights).First();
+
+      int minW, maxW;
+      int minH, maxH;
+      int minD, maxD;
+      GetItemParameters(type, rand, binWidth, binHeight, binDepth,
+        out minW, out maxW, out minH, out maxH, out minD, out maxD);
+
+      w = rand.Next(minW, maxW + 1);
+      h = rand.Next(minH, maxH + 1);
+      d = rand.Next(minD, maxD + 1);
+    }
+
+    private void GetItemParameters(int type, IRandom rand,
+      int w, int h, int d,
+      out int minW, out int maxW, out int minH, out int maxH, out int minD, out int maxD) {
+      switch (type) {
+        case 1: {
+            minW = 1; maxW = w / 2; // integer division on purpose (see paper)
+            minH = h * 2 / 3; maxH = h;
+            minD = d * 2 / 3; maxD = d;
+            break;
+          }
+        case 2: {
+            minW = w * 2 / 3; maxW = w;
+            minH = 1; maxH = h / 2;
+            minD = d * 2 / 3; maxD = d;
+            break;
+          }
+        case 3: {
+            minW = w * 2 / 3; maxW = w;
+            minH = h * 2 / 3; maxH = h;
+            minD = 1; maxD = d / 2;
+            break;
+          }
+        case 4: {
+            minW = w / 2; maxW = w;
+            minH = h / 2; maxH = h;
+            minD = d / 2; maxD = d;
+            break;
+          }
+        case 5: {
+            minW = 1; maxW = w / 2;
+            minH = 1; maxH = h / 2;
+            minD = 1; maxD = d / 2;
+            break;
+          }
+        default: {
+            throw new InvalidProgramException();
+          }
+      }
+    }
+
+    public override bool CanImportData {
+      get { return false; }
+    }
+    public override BPPData ImportData(string path) {
+      throw new NotSupportedException();
+    }
+
+    public override bool CanExportData {
+      get { return true; }
+    }
+
+    public override void ExportData(BPPData instance, string file) {
+      using (Stream stream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write)) {
+        Export(instance, stream);
+      }
+    }
+    public static void Export(BPPData instance, Stream stream) {
+
+      using (var writer = new StreamWriter(stream)) {
+        writer.WriteLine(String.Format("{0,-5} {1,-5} {2,-5}   WBIN,HBIN,DBIN", 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();
+      }
+    }
+
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 14170)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bottom-left IntegerVector Decoder (3d)", "Decodes the integer vector and creates a packing solution candidate")]
+  [StorableClass]
+  public class BottomLeftIntegerVectorDecoder : IntegerVectorDecoderBase {
+
+    [StorableConstructor]
+    protected BottomLeftIntegerVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftIntegerVectorDecoder(BottomLeftIntegerVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BottomLeftIntegerVectorDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftIntegerVectorDecoder(this, cloner);
+    }
+
+    public override Solution Decode(IntegerVector intVec, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
+      // TODO
+      if (useStackingConstraints) throw new NotSupportedException("Stacking constraints are not supported by the Bottom-Left IntegerVector Decoder");
+      return base.Decode(intVec, binShape, items, useStackingConstraints: false);
+    }
+
+    protected override Solution CreateSolution(PackingShape binShape, bool useStackingConstraints) {
+      return new Solution(binShape, useExtremePoints: false, stackingConstraints: useStackingConstraints);
+    }
+
+    protected override PackingPosition FindPositionForItem(BinPacking3D bp, PackingItem item, bool useStackingConstraints) {
+      return bp.FindPositionBySliding(item, rotated: false);
+    }
+
+    protected override BinPacking3D CreatePacking(
+      Solution partialSolution,
+      ref IList<int> remainingIDs, IList<PackingItem> items, bool useStackingConstraints) {
+      var bp = new BinPacking3D(partialSolution.BinShape);
+      bp.SlidingBasedPacking(ref remainingIDs, items);
+      return bp;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 14170)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Extreme-point IntegerVector Decoder (3d)", "Decodes the integer vector and creates a packing solution candidate")]
+  [StorableClass]
+  public class ExtremePointIntegerVectorDecoder : IntegerVectorDecoderBase {
+
+    [StorableConstructor]
+    protected ExtremePointIntegerVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected ExtremePointIntegerVectorDecoder(ExtremePointIntegerVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ExtremePointIntegerVectorDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointIntegerVectorDecoder(this, cloner);
+    }
+
+    protected override Solution CreateSolution(PackingShape binShape, bool useStackingConstraints) {
+      return new Solution(binShape, useExtremePoints: true, stackingConstraints: useStackingConstraints);
+    }
+
+    protected override PackingPosition FindPositionForItem(BinPacking3D bp, PackingItem item, bool useStackingConstraints) {
+      return bp.FindExtremePointForItem(item, rotated: false, stackingConstraints: useStackingConstraints);
+    }
+
+    protected override BinPacking3D CreatePacking(
+      Solution partialSolution,
+      ref IList<int> remainingIDs, IList<PackingItem> items, bool useStackingConstraints) {
+      var bp = new BinPacking3D(partialSolution.BinShape);
+      bp.ExtremePointBasedPacking(ref remainingIDs, items, useStackingConstraints);
+      return bp;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 14170)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [StorableClass]
+  public abstract class IntegerVectorDecoderBase : Item, IDecoder<IntegerVector> {
+
+    [StorableConstructor]
+    protected IntegerVectorDecoderBase(bool deserializing) : base(deserializing) { }
+    protected IntegerVectorDecoderBase(IntegerVectorDecoderBase original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    protected IntegerVectorDecoderBase() : base() { }
+
+
+    public virtual Solution Decode(IntegerVector intVec, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
+      var sequenceMatrix = IntegerVectorProblem.GenerateSequenceMatrix(intVec);
+      Solution result = CreateSolution(binShape, useStackingConstraints);
+
+      //Fill bins according to grouping vector
+      IList<int> remainingIDs = new List<int>();
+      foreach (var sequence in sequenceMatrix) {
+        remainingIDs = remainingIDs.Concat(sequence).ToList();
+        result.Bins.Add(CreatePacking(result, ref remainingIDs, items, useStackingConstraints));
+      }
+      result.UpdateBinPackings();
+
+      //Try to put remaining items in existing bins
+      var temp = new List<int>(remainingIDs);
+      foreach (int id in temp) {
+        foreach (BinPacking3D bp in result.Bins) {
+          var position = FindPositionForItem(bp, items[id], useStackingConstraints);
+          if (position != null) {
+            bp.PackItem(id, items[id], position);
+            remainingIDs.Remove(id);
+            break;
+          }
+        }
+      }
+
+      //Put still remaining items in new bins
+      while (remainingIDs.Count > 0) {
+        result.Bins.Add(CreatePacking(result, ref remainingIDs, items, useStackingConstraints));
+      }
+      result.UpdateBinPackings();
+
+      // gkronber: original implementation by Helm also updates the encoded solution (TODO)
+      // var newSolution = new int[intVec.Length];
+      // int binIndex = 0;
+      // foreach (var bp in result.BinPackings) {
+      //   foreach (var entry in bp.ItemPositions)
+      //     newSolution[entry.Key] = binIndex;
+      //   binIndex++;
+      // }
+      // solution.GroupingVector = new IntegerVector(newSolution);
+
+      return result;
+    }
+
+    protected abstract Solution CreateSolution(PackingShape binShape, bool useStackingConstraints);
+    protected abstract PackingPosition FindPositionForItem(BinPacking3D bp, PackingItem item, bool useStackingConstraints);
+    protected abstract BinPacking3D CreatePacking(Solution partialSolution, ref IList<int> remainingIDs, IList<PackingItem> items, bool useStackingConstraints);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 14170)
@@ -0,0 +1,99 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bin Packing Problem (3D, integer vector encoding) (BPP)", "Represents a two-dimensional bin-packing problem using only bins with identical measures and bins/items with rectangular shapes.")]
+  [StorableClass]
+  [Creatable(Category = CreatableAttribute.Categories.CombinatorialProblems, Priority = 330)]
+  public sealed class IntegerVectorProblem : ProblemBase<IntegerVectorEncoding, IntegerVector> {
+    [StorableConstructor]
+    private IntegerVectorProblem(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    private IntegerVectorProblem(IntegerVectorProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public IntegerVectorProblem()
+      : base() {
+      Decoder = new ExtremePointIntegerVectorDecoder(); // default decoder
+
+      // the int vector contains the target bin number for each item
+      Encoding = new IntegerVectorEncoding(EncodedSolutionName, Items.Count, min: 0, max: LowerBound + 1); // NOTE: assumes that all items can be packed into LowerBound+1 bins
+      AddOperators();
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+
+    private void AddOperators() {
+
+      // move operators are not yet supported (TODO)
+      Operators.RemoveAll(x => x is SingleObjectiveMoveGenerator);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveMaker);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveEvaluator);
+
+      Encoding.ConfigureOperators(Operators.OfType<IOperator>()); // gkronber: not strictly necessary (only when customer ops are added)
+    }
+
+    private void RegisterEventHandlers() {
+      // update encoding length when number of items is changed
+      ItemsParameter.ValueChanged += (sender, args) => Encoding.Length = Items.Count;
+      LowerBoundParameter.Value.ValueChanged += (sender, args) => {
+        for (int i = 0; i < Encoding.Bounds.Rows; i++) {
+          Encoding.Bounds[i, 1] = LowerBound + 1;
+        }
+      };
+    }
+
+    #region helpers
+
+    public static List<List<int>> GenerateSequenceMatrix(IntegerVector intVec) {
+      List<List<int>> result = new List<List<int>>();
+      int nrOfBins = intVec.Max() + 1;
+      for (int i = 0; i < nrOfBins; i++)
+        result.Add(new List<int>());
+      for (int i = 0; i < intVec.Length; i++) {
+        result[intVec[i]].Add(i);
+      }
+      return result;
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IDecoder.cs	(revision 14170)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface IDecoder<in T> : IItem {
+    Solution Decode(T encodedSolution, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IEvaluator.cs	(revision 14170)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface IEvaluator : IItem {
+    double Evaluate(Solution solution);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IOperator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IOperator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Interfaces/IOperator.cs	(revision 14170)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface IOperator<TSol> : IItem {
+    ILookupParameter<ReadOnlyItemList<PackingItem>> ItemsParameter { get; }
+    ILookupParameter<PackingShape> BinShapeParameter { get; }
+    ILookupParameter<IDecoder<TSol>> DecoderParameter { get; }
+    ILookupParameter<IEvaluator> SolutionEvaluatorParameter { get; }
+    ILookupParameter<BoolValue> UseStackingConstraintsParameter { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/MoveEvaluatorBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/MoveEvaluatorBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/MoveEvaluatorBase.cs	(revision 14170)
@@ -0,0 +1,99 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [StorableClass]
+  public abstract class MoveEvaluatorBase<TSol, TMove> : SingleSuccessorOperator,
+    ISingleObjectiveMoveEvaluator, ISingleObjectiveMoveOperator, IOperator<TSol>
+    where TSol : class, IItem
+    where TMove : class, IItem {
+    public ILookupParameter<TSol> EncodedSolutionParameter {
+      get { return (ILookupParameter<TSol>)Parameters["EncodedSolution"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<ReadOnlyItemList<PackingItem>> ItemsParameter {
+      get { return (ILookupParameter<ReadOnlyItemList<PackingItem>>)Parameters["Items"]; }
+    }
+    public ILookupParameter<PackingShape> BinShapeParameter {
+      get { return (ILookupParameter<PackingShape>)Parameters["BinShape"]; }
+    }
+    public ILookupParameter<IDecoder<TSol>> DecoderParameter {
+      get { return (ILookupParameter<IDecoder<TSol>>)Parameters["Decoder"]; }
+    }
+    public ILookupParameter<IEvaluator> SolutionEvaluatorParameter {
+      get { return (ILookupParameter<IEvaluator>)Parameters["SolutionEvaluator"]; }
+    }
+    public ILookupParameter<TMove> MoveParameter {
+      get { return (ILookupParameter<TMove>)Parameters["Move"]; }
+    }
+    public ILookupParameter<BoolValue> UseStackingConstraintsParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["UseStackingConstraints"]; }
+    }
+
+
+    [StorableConstructor]
+    protected MoveEvaluatorBase(bool deserializing) : base(deserializing) { }
+    protected MoveEvaluatorBase(MoveEvaluatorBase<TSol, TMove> original, Cloner cloner) : base(original, cloner) { }
+    protected MoveEvaluatorBase()
+      : base() {
+      Parameters.Add(new LookupParameter<TSol>("EncodedSolution", "The encoded solution candidate to evaluate"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of a packing solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The evaluated quality of a move on a packing solution."));
+      Parameters.Add(new LookupParameter<ReadOnlyItemList<PackingItem>>("Items", "Packing-item data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<PackingShape>("BinShape", "Packing-bin data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<IDecoder<TSol>>("Decoder", "The decoding operator that is used to calculate a packing plan from the used representation."));
+      Parameters.Add(new LookupParameter<IEvaluator>("SolutionEvaluator", "The actual packing plan evaluation operator."));
+      Parameters.Add(new LookupParameter<TMove>("Move", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseStackingConstraints", "A flag that determines if stacking constriants should be checked when solving the problem"));
+    }
+
+    public override IOperation Apply() {
+      var move = MoveParameter.ActualValue;
+      var encSolCandidate = EncodedSolutionParameter.ActualValue;
+      var binShape = BinShapeParameter.ActualValue;
+      var items = ItemsParameter.ActualValue;
+
+
+      double moveQuality = EvaluateMove(encSolCandidate, move, binShape, items, UseStackingConstraintsParameter.ActualValue.Value);
+
+      if (MoveQualityParameter.ActualValue == null)
+        MoveQualityParameter.ActualValue = new DoubleValue(moveQuality);
+      else
+        MoveQualityParameter.ActualValue.Value = moveQuality;
+      return base.Apply();
+    }
+
+    public abstract double EvaluateMove(TSol encodedSolutionCandidate, TMove move, PackingShape binShape, ReadOnlyItemList<PackingItem> items, bool useStackingConstraints);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingItem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingItem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingItem.cs	(revision 14170)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("PackingItem (3d)", "Represents a cuboidic packing-item for bin-packing problems.")]
+  [StorableClass]
+  public class PackingItem : PackingShape, IPackingItem {
+    public IValueParameter<PackingShape> TargetBinParameter {
+      get { return (IValueParameter<PackingShape>)Parameters["TargetBin"]; }
+    }
+    public IFixedValueParameter<DoubleValue> WeightParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["Weight"]; }
+    }
+    public IFixedValueParameter<IntValue> MaterialParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Material"]; }
+    }
+
+    public PackingShape TargetBin {
+      get { return TargetBinParameter.Value; }
+      set { TargetBinParameter.Value = value; }
+    }
+
+    public double Weight {
+      get { return WeightParameter.Value.Value; }
+      set { WeightParameter.Value.Value = value; }
+    }
+
+    public int Material {
+      get { return MaterialParameter.Value.Value; }
+      set { MaterialParameter.Value.Value = value; }
+    }
+
+    public bool SupportsStacking(IPackingItem other) {
+      return ((other.Material < this.Material) || (other.Material.Equals(this.Material) && other.Weight <= this.Weight));
+    }
+
+    [StorableConstructor]
+    protected PackingItem(bool deserializing) : base(deserializing) { }
+    protected PackingItem(PackingItem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public PackingItem()
+      : base() {
+      Parameters.Add(new ValueParameter<PackingShape>("TargetBin"));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Weight"));
+      Parameters.Add(new FixedValueParameter<IntValue>("Material"));
+
+      RegisterEvents();
+    }
+
+    public PackingItem(int width, int height, int depth, PackingShape targetBin, double weight, int material)
+      : this() {
+      this.Width = width;
+      this.Height = height;
+      this.Depth = depth;
+      this.Weight = weight;
+      this.Material = material;
+      this.TargetBin = (PackingShape)targetBin.Clone();
+    }
+
+    public PackingItem(int width, int height, int depth, PackingShape targetBin)
+      : this() {
+      this.Width = width;
+      this.Height = height;
+      this.Depth = depth;
+      this.TargetBin = (PackingShape)targetBin.Clone();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingItem(this, cloner);
+    }
+
+    private void RegisterEvents() {
+      // NOTE: only because of ToString override
+      WeightParameter.Value.ValueChanged += (sender, args) => OnToStringChanged();
+      MaterialParameter.Value.ValueChanged += (sender, args) => OnToStringChanged();
+
+      // target bin does not occur in ToString()
+    }
+
+
+    public override string ToString() {
+      return string.Format("CuboidPackingItem ({0}, {1}, {2}; weight={3}, mat={4})", this.Width, this.Height, this.Depth, this.Weight, this.Material);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingPosition.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingPosition.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingPosition.cs	(revision 14170)
@@ -0,0 +1,113 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Packing Position (3d)", "Represents a packing-position associated with a three dimensional packing-problem.")]
+  [StorableClass]
+  // PackingPosition is immutable (and handled as value type concerning Equals and GetHashCode)
+  public class PackingPosition : BinPacking.PackingPosition, IComparable<PackingPosition> {
+    [Storable]
+    private readonly int x;
+    [Storable]
+    private readonly int y;
+    [Storable]
+    private readonly int z;
+
+    public int X { get { return x; } }
+    public int Y { get { return y; } }
+    public int Z { get { return z; } }
+
+    [StorableConstructor]
+    protected PackingPosition(bool deserializing) : base(deserializing) { }
+    protected PackingPosition(PackingPosition original, Cloner cloner)
+      : base(original, cloner) {
+      x = original.X;
+      y = original.Y;
+      z = original.Z;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingPosition(this, cloner);
+    }
+
+    public PackingPosition(int assignedBin, int x, int y, int z, bool rotated = false)
+      : base(assignedBin, rotated) {
+      this.x = x;
+      this.y = y;
+      this.z = z;
+    }
+
+    public override string ToString() {
+      return string.Format("[AssignedBin: {0}; ({1},{2},{3})]", AssignedBin, X, Y, Z);
+    }
+
+
+    public override bool Equals(object obj) {
+      var tdp = obj as PackingPosition;
+      if (tdp != null)
+        return (tdp.X == this.X && tdp.Y == this.Y && tdp.Z == this.Z);
+      else return false;
+    }
+
+    public override int GetHashCode() {
+      return base.GetHashCode() + 13 * X + 17 * Y + 23 * Z;
+    }
+
+    public static PackingPosition MoveLeft(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X - 1, original.Y, original.Z, original.Rotated);
+    }
+    public static PackingPosition MoveDown(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y - 1, original.Z, original.Rotated);
+    }
+    public static PackingPosition MoveBack(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y, original.Z - 1, original.Rotated);
+    }
+
+    public static PackingPosition MoveRight(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X + 1, original.Y, original.Z, original.Rotated);
+    }
+    public static PackingPosition MoveUp(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y + 1, original.Z, original.Rotated);
+    }
+    public static PackingPosition MoveFront(PackingPosition original) {
+      return new PackingPosition(original.AssignedBin, original.X, original.Y, original.Z + 1, original.Rotated);
+    }
+
+    #region IComparable<PackingPosition> Members
+
+    public int CompareTo(PackingPosition other) {
+      int result = Z.CompareTo(other.Z);
+      if (result == 0)
+        result = X.CompareTo(other.X);
+      if (result == 0)
+        result = Y.CompareTo(other.Y);
+
+      return result;
+
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingShape.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingShape.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PackingShape.cs	(revision 14170)
@@ -0,0 +1,194 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("PackingShape (3d)", "Represents the cuboid measures (width, height, depth) of a three-dimensional cuboidic bin-packing object.")]
+  [StorableClass]
+  public class PackingShape : PackingShape<PackingPosition>, IComparable<PackingShape> {
+    public IFixedValueParameter<IntValue> HeightParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Height"]; }
+    }
+    public IFixedValueParameter<IntValue> WidthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Width"]; }
+    }
+    public IFixedValueParameter<IntValue> DepthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+
+    public int Height {
+      get { return HeightParameter.Value.Value; }
+      set { HeightParameter.Value.Value = value; }
+    }
+
+    public int Width {
+      get { return WidthParameter.Value.Value; }
+      set { WidthParameter.Value.Value = value; }
+    }
+
+    public int Depth {
+      get { return DepthParameter.Value.Value; }
+      set { DepthParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PackingShape(bool deserializing) : base(deserializing) { }
+    protected PackingShape(PackingShape original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public PackingShape()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>("Width"));
+      Parameters.Add(new FixedValueParameter<IntValue>("Height"));
+      Parameters.Add(new FixedValueParameter<IntValue>("Depth"));
+
+      RegisterEvents();
+    }
+
+    public PackingShape(int width, int height, int depth)
+      : this() {
+      this.Width = width;
+      this.Height = height;
+      this.Depth = depth;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingShape(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      // only because of ToString override
+      HeightParameter.Value.ValueChanged += (sender, args) => OnToStringChanged();
+      WidthParameter.Value.ValueChanged += (sender, args) => OnToStringChanged();
+      DepthParameter.Value.ValueChanged += (sender, args) => OnToStringChanged();
+    }
+
+    public override string ToString() {
+      return String.Format("CuboidPackingShape ({0}, {1}, {2})", this.Width, this.Height, this.Depth);
+    }
+
+    #region IComparable Members
+
+    public int CompareTo(PackingShape other) {
+      //Using "Clustered-Area-Height"-comparison as descr
+
+      int result = (this.Width * this.Depth).CompareTo(other.Width * other.Depth);
+
+      if (result == 0)
+        result = this.Volume.CompareTo(other.Volume);
+      if (result == 0)
+        result = this.Height.CompareTo(other.Height);
+      return result;
+    }
+
+    public override int CompareTo(object obj) {
+      var other = (PackingShape)obj;
+      if (other != null) return CompareTo(other);
+      else throw new ArgumentException(string.Format("Cannot compare with object {0}", obj), "obj");
+    }
+
+    #endregion
+
+    private struct CuboidDiagonal {
+      public int x1;
+      public int y1;
+      public int z1;
+      public int x2;
+      public int y2;
+      public int z2;
+      public CuboidDiagonal(PackingShape myShape) : this(new PackingPosition(0, 0, 0, 0), myShape) { }
+      public CuboidDiagonal(PackingPosition myPosition, PackingShape myShape) {
+        x1 = myPosition.X;
+        y1 = myPosition.Y;
+        z1 = myPosition.Z;
+        x2 = myPosition.X + (myPosition.Rotated ? myShape.Depth : myShape.Width) - 1;
+        y2 = myPosition.Y + myShape.Height - 1;
+        z2 = myPosition.Z + (myPosition.Rotated ? myShape.Width : myShape.Depth) - 1;
+      }
+    }
+
+
+    #region Helpers
+    public override PackingPosition Origin { get { return new PackingPosition(0, 0, 0, 0); } }
+    public override int Volume { get { return Width * Height * Depth; } }
+
+    public override bool EnclosesPoint(PackingPosition myPosition, PackingPosition checkedPoint) {
+      return (myPosition.X <= checkedPoint.X &&
+                (myPosition.X + (myPosition.Rotated ? Depth : Width) - 1) >= checkedPoint.X &&
+                myPosition.Y <= checkedPoint.Y &&
+                (myPosition.Y + Height - 1) >= checkedPoint.Y &&
+                myPosition.Z <= checkedPoint.Z &&
+                (myPosition.Z + (myPosition.Rotated ? Width : Depth) - 1) >= checkedPoint.Z);
+    }
+    public override bool Encloses(PackingPosition checkedPosition, PackingShape<PackingPosition> checkedShape) {
+      return Encloses(checkedPosition, (PackingShape)checkedShape);
+    }
+    private bool Encloses(PackingPosition checkedPosition, PackingShape checkedShape) {
+      return Encloses(new CuboidDiagonal(this), new CuboidDiagonal(checkedPosition, checkedShape));
+    }
+    private bool Encloses(CuboidDiagonal c1, CuboidDiagonal c2) {
+      return (c1.x1 <= c2.x1 &&
+                c1.x2 >= c2.x2 &&
+                c1.y1 <= c2.y1 &&
+                c1.y2 >= c2.y2 &&
+                c1.z1 <= c2.z1 &&
+                c1.z2 >= c2.z2);
+    }
+
+    public override bool Overlaps(PackingPosition myPosition, PackingPosition checkedPosition, PackingShape<PackingPosition> checkedShape) {
+      return Overlaps(myPosition, checkedPosition, (PackingShape)checkedShape);
+    }
+    private bool Overlaps(PackingPosition myPosition, PackingPosition checkedPosition, PackingShape checkedShape) {
+      return Overlaps(new CuboidDiagonal(myPosition, this), new CuboidDiagonal(checkedPosition, checkedShape));
+    }
+    private bool Overlaps(CuboidDiagonal c1, CuboidDiagonal c2) {
+      return !(c1.x1 > c2.x2 ||
+               c1.y1 > c2.y2 ||
+               c1.z1 > c2.z2 ||
+               c1.x2 < c2.x1 ||
+               c1.y2 < c2.y1 ||
+               c1.z2 < c2.z1);
+    }
+
+    public override void ApplyHorizontalOrientation() {
+      if (Width > Depth) {
+        var aux = Width;
+        Width = Depth;
+        Depth = aux;
+      }
+    }
+    #endregion
+
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/BottomLeftPermutationDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 14170)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bottom-left Permutation Decoder (3d)", "Decodes the permutation and creates a packing solution candidate")]
+  [StorableClass]
+  public class BottomLeftPermutationDecoder : Item, IDecoder<Permutation> {
+
+    [StorableConstructor]
+    protected BottomLeftPermutationDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftPermutationDecoder(BottomLeftPermutationDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BottomLeftPermutationDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftPermutationDecoder(this, cloner);
+    }
+
+    public Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
+      Solution result = new Solution(binShape, useExtremePoints: false, stackingConstraints: useStackingConstraints);
+      IList<int> remainingIDs = new List<int>(permutation);
+      while (remainingIDs.Count > 0) {
+        var bp = new BinPacking3D(binShape);
+        bp.SlidingBasedPacking(ref remainingIDs, items);
+        result.Bins.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/ExtremePointPermutationDecoder.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 14170)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using System.Collections.Generic;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Extreme-point Permutation Decoder (3d)", "Decodes the permutation and creates a packing solution candidate")]
+  [StorableClass]
+  public class ExtremePointPermutationDecoder : Item, IDecoder<Permutation> {
+
+    [StorableConstructor]
+    protected ExtremePointPermutationDecoder(bool deserializing) : base(deserializing) { }
+    protected ExtremePointPermutationDecoder(ExtremePointPermutationDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ExtremePointPermutationDecoder() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointPermutationDecoder(this, cloner);
+    }
+
+    public Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
+      Solution result = new Solution(binShape, useExtremePoints: true, stackingConstraints: useStackingConstraints);
+      IList<int> remainingIDs = new List<int>(permutation);
+      while (remainingIDs.Count > 0) {
+        var bp = new BinPacking3D(binShape);
+        bp.ExtremePointBasedPacking(ref remainingIDs, items, stackingConstraints: useStackingConstraints);
+        result.Bins.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/PermutationProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/PermutationProblem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/PermutationProblem.cs	(revision 14170)
@@ -0,0 +1,87 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bin Packing Problem (3D, permutation encoding) (BPP)", "Represents a three-dimensional bin-packing problem using only bins with identical measures and bins/items with rectangular shapes.")]
+  [StorableClass]
+  [Creatable(Category = CreatableAttribute.Categories.CombinatorialProblems, Priority = 320)]
+  public sealed class PermutationProblem : ProblemBase<PermutationEncoding, Permutation> {
+    [StorableConstructor]
+    private PermutationProblem(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    private PermutationProblem(PermutationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public PermutationProblem()
+      : base() {
+      Decoder = new ExtremePointPermutationDecoder(); // default decoder
+
+      Encoding = new PermutationEncoding(EncodedSolutionName, Items.Count, PermutationTypes.Absolute);
+      AddOperators();
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PermutationProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+
+    private void AddOperators() {
+      Operators.Add(new TranslocationMoveEvaluator());
+      Operators.Add(new Swap2MoveEvaluator());
+
+      Operators.RemoveAll(x => x is SingleObjectiveMoveGenerator);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveMaker);
+      Operators.RemoveAll(x => x is SingleObjectiveMoveEvaluator);
+
+      Encoding.ConfigureOperators(Operators.OfType<IOperator>());
+
+      foreach (var op in Operators.OfType<IOperator<Permutation>>()) {
+        op.BinShapeParameter.ActualName = BinShapeParameter.Name;
+        op.ItemsParameter.ActualName = ItemsParameter.Name;
+        op.SolutionEvaluatorParameter.ActualName = SolutionEvaluatorParameter.Name;
+        op.DecoderParameter.ActualName = DecoderParameter.Name;
+        op.UseStackingConstraintsParameter.ActualName = UseStackingConstraintsParameter.Name;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      // update encoding length when number of items is changed
+      ItemsParameter.ValueChanged += (sender, args) => Encoding.Length = Items.Count;
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/Swap2MoveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 14170)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Swap2MoveEvaluator", "Move evaluator for 2-opt moves.")]
+  [StorableClass]
+  public sealed class Swap2MoveEvaluator : MoveEvaluatorBase<Permutation, Swap2Move>, IPermutationSwap2MoveOperator {
+    public ILookupParameter<Swap2Move> Swap2MoveParameter {
+      get { return MoveParameter; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return EncodedSolutionParameter; }
+    }
+
+    [StorableConstructor]
+    private Swap2MoveEvaluator(bool deserializing) : base(deserializing) { }
+    private Swap2MoveEvaluator(Swap2MoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public Swap2MoveEvaluator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap2MoveEvaluator(this, cloner);
+    }
+
+    public override double EvaluateMove(Permutation permutation, Swap2Move move, PackingShape binShape, ReadOnlyItemList<PackingItem> items, bool useStackingConstraints) {
+      // uses full evaluation
+      Swap2Manipulator.Apply(permutation, move.Index1, move.Index2);
+      var solution = DecoderParameter.ActualValue.Decode(permutation, binShape, items, useStackingConstraints);
+
+      return SolutionEvaluatorParameter.ActualValue.Evaluate(solution);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/TranslocationMoveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 14170)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("TranslocationMoveEvaluator", "Move evaluator for insertion or translocation moves.")]
+  [StorableClass]
+  public sealed class TranslocationMoveEvaluator : MoveEvaluatorBase<Permutation, TranslocationMove>, IPermutationTranslocationMoveOperator {
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return MoveParameter; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return EncodedSolutionParameter; }
+    }
+    [StorableConstructor]
+    private TranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
+    private TranslocationMoveEvaluator(TranslocationMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public TranslocationMoveEvaluator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveEvaluator(this, cloner);
+    }
+
+    public override double EvaluateMove(Permutation permutation, TranslocationMove move, PackingShape binShape,
+      ReadOnlyItemList<PackingItem> items, bool useStackingConstraints) {
+
+      // uses full evaluation
+      TranslocationManipulator.Apply(permutation, move.Index1, move.Index2, move.Index3);
+      var solution = DecoderParameter.ActualValue.Decode(permutation, binShape, items, useStackingConstraints);
+
+      return SolutionEvaluatorParameter.ActualValue.Evaluate(solution);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/ProblemBase.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/ProblemBase.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/ProblemBase.cs	(revision 14170)
@@ -0,0 +1,275 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  // in comparison to the 2d problem the 3d problem implementation also supports checking stacking constraints
+  [StorableClass]
+  public abstract class ProblemBase<TEnc, TSol> :
+    SingleObjectiveBasicProblem<TEnc>, IProblemInstanceConsumer<BPPData>, IProblemInstanceExporter<BPPData>
+    where TEnc : class, IEncoding
+    where TSol : class, IItem {
+    protected readonly string SolutionEvaluatorParameterName = "SolutionEvaluator";
+    protected readonly string UseStackingConstraintsParameterName = "UseStackingConstraints";
+
+    public readonly string EncodedSolutionName = "EncodedSolution";
+    #region Default Instance
+    private readonly BPPData defaultInstance = new BPPData() {
+      Name = "3D BPP Default Instance",
+      Description = "The default instance for 3D Bin Packing.",
+      BinShape = new PackingShape(25, 25, 35),
+      Items = new PackingItem[] {
+        new PackingItem(12,5,10, new PackingShape(25,25,35)),
+        new PackingItem(10,18,20, new PackingShape(25,25,35)),
+        new PackingItem(9,7,7, new PackingShape(25,25,35)),
+        new PackingItem(21,12,4, new PackingShape(25,25,35)),
+        new PackingItem(8,8,12, new PackingShape(25,25,35)),
+        new PackingItem(3,6,14, new PackingShape(25,25,35)),
+        new PackingItem(20,4,9, new PackingShape(25,25,35)),
+        new PackingItem(5,9,8, new PackingShape(25,25,35)),
+        new PackingItem(7,17,3, new PackingShape(25,25,35)),
+        new PackingItem(13,20,15, new PackingShape(25,25,35)),
+        new PackingItem(9,11,9, new PackingShape(25,25,35)),
+        new PackingItem(10,18,20, new PackingShape(25,25,35)),
+        new PackingItem(9,7,7, new PackingShape(25,25,35)),
+        new PackingItem(21,12,4, new PackingShape(25,25,35)),
+        new PackingItem(8,8,12, new PackingShape(25,25,35)),
+        new PackingItem(3,6,14, new PackingShape(25,25,35)),
+        new PackingItem(20,4,9, new PackingShape(25,25,35)),
+        new PackingItem(5,9,8, new PackingShape(25,25,35)),
+        new PackingItem(7,17,3, new PackingShape(25,25,35)),
+        new PackingItem(13,20,15, new PackingShape(25,25,35)),
+        new PackingItem(9,11,9, new PackingShape(25,25,35)),
+        new PackingItem(10,18,20, new PackingShape(25,25,35)),
+        new PackingItem(9,7,7, new PackingShape(25,25,35)),
+        new PackingItem(21,12,4, new PackingShape(25,25,35)),
+        new PackingItem(8,8,12, new PackingShape(25,25,35)),
+        new PackingItem(3,6,14, new PackingShape(25,25,35)),
+        new PackingItem(20,4,9, new PackingShape(25,25,35)),
+        new PackingItem(5,9,8, new PackingShape(25,25,35)),
+        new PackingItem(7,17,3, new PackingShape(25,25,35)),
+        new PackingItem(13,20,15, new PackingShape(25,25,35)),
+        new PackingItem(9,11, 9,new PackingShape(25,25,35)),
+        new PackingItem(10,18,20, new PackingShape(25,25,35)),
+        new PackingItem(9,7,7, new PackingShape(25,25,35)),
+        new PackingItem(21,12,4, new PackingShape(25,25,35)),
+        new PackingItem(8,8,12, new PackingShape(25,25,35)),
+        new PackingItem(3,6,14, new PackingShape(25,25,35)),
+        new PackingItem(20,4,9, new PackingShape(25,25,35)),
+        new PackingItem(5,9,8, new PackingShape(25,25,35)),
+        new PackingItem(7,17,3, new PackingShape(25,25,35)),
+        new PackingItem(13,20,15, new PackingShape(25,25,35)),
+        new PackingItem(9,11,9, new PackingShape(25,25,35))
+      },
+    };
+    #endregion
+
+    #region parameter properties
+    public IValueParameter<IDecoder<TSol>> DecoderParameter {
+      get { return (IValueParameter<IDecoder<TSol>>)Parameters["Decoder"]; }
+    }
+    public IValueParameter<IEvaluator> SolutionEvaluatorParameter {
+      get { return (IValueParameter<IEvaluator>)Parameters[SolutionEvaluatorParameterName]; }
+    }
+    public IFixedValueParameter<BoolValue> UseStackingConstraintsParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[UseStackingConstraintsParameterName]; }
+    }
+    public IValueParameter<ReadOnlyItemList<PackingItem>> ItemsParameter {
+      get { return (IValueParameter<ReadOnlyItemList<PackingItem>>)Parameters["Items"]; }
+    }
+    public IValueParameter<PackingShape> BinShapeParameter {
+      get { return (IValueParameter<PackingShape>)Parameters["BinShape"]; }
+    }
+    public IValueParameter<Solution> BestKnownSolutionParameter {
+      get { return (IValueParameter<Solution>)Parameters["BestKnownSolution"]; }
+    }
+    public IFixedValueParameter<IntValue> LowerBoundParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["LowerBound"]; }
+    }
+    #endregion
+
+    #region properties
+    public IDecoder<TSol> Decoder {
+      get { return DecoderParameter.Value; }
+      set { DecoderParameter.Value = value; }
+    }
+    public IEvaluator SolutionEvaluator {
+      get { return SolutionEvaluatorParameter.Value; }
+      set { SolutionEvaluatorParameter.Value = value; }
+    }
+    public bool UseStackingConstraints {
+      get { return UseStackingConstraintsParameter.Value.Value; }
+      set { UseStackingConstraintsParameter.Value.Value = value; }
+    }
+    public ReadOnlyItemList<PackingItem> Items {
+      get { return ItemsParameter.Value; }
+      set { ItemsParameter.Value = value; }
+    }
+    public PackingShape BinShape {
+      get { return BinShapeParameter.Value; }
+      set { BinShapeParameter.Value = value; }
+    }
+    public Solution BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+    public int LowerBound {
+      get { return LowerBoundParameter.Value.Value; }
+    }
+    public int NumberOfItems {
+      get { return Items == null ? 0 : Items.Count; }
+    }
+    #endregion
+
+    // persistence
+    [StorableConstructor]
+    protected ProblemBase(bool deserializing) : base(deserializing) { }
+
+    // cloning
+    protected ProblemBase(ProblemBase<TEnc, TSol> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected ProblemBase()
+      : base() {
+      var defaultEvaluator = new PackingRatioEvaluator();
+      Parameters.Add(new ValueParameter<IDecoder<TSol>>("Decoder", "The decoder translates a permutation to a packing solution candidiates"));
+      Parameters.Add(new ValueParameter<IEvaluator>(SolutionEvaluatorParameterName, "The evaluator calculates qualities of solution candidates", defaultEvaluator));
+      Parameters.Add(new FixedValueParameter<BoolValue>(UseStackingConstraintsParameterName, "A flag that determines if stacking constraints are considered when solving the problem.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<ReadOnlyItemList<PackingItem>>("Items", "The items which must be packed into bins"));
+      Parameters.Add(new ValueParameter<PackingShape>("BinShape", "The size of bins into which items must be packed"));
+      Parameters.Add(new OptionalValueParameter<Solution>("BestKnownSolution", "The best solution found so far"));
+      Parameters.Add(new FixedValueParameter<IntValue>("LowerBound", "A lower bound for the number of bins that is necessary to pack all items"));
+
+      Load(defaultInstance);
+    }
+
+    public override bool Maximization { get { return true; } }
+
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var encodedSolutionCand = (TSol)individual[EncodedSolutionName];
+      var decoder = Decoder;
+      var solution = decoder.Decode(encodedSolutionCand, BinShape, Items, UseStackingConstraints);
+      return SolutionEvaluator.Evaluate(solution);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      Analyze(individuals.Select(i => (TSol)i[EncodedSolutionName]).ToArray(), qualities, results, random);
+    }
+
+    // NOTE: same implementation as for 2d problem
+    public virtual void Analyze(TSol[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      var bestSolutionResultName = "Best Packing Solution";
+      var numContainersResultName = "Nr of Containers";
+      var binUtilResultName = "Overall Bin Utilization";
+
+      if (!results.ContainsKey(bestSolutionResultName)) results.Add(new Result(bestSolutionResultName, typeof(Solution)));
+      if (!results.ContainsKey(numContainersResultName)) results.Add(new Result(numContainersResultName, typeof(IntValue)));
+      if (!results.ContainsKey(binUtilResultName)) results.Add(new Result(binUtilResultName, typeof(DoubleValue)));
+
+
+      // find index of item with max quality
+      int bestIdx = 0;
+      for (int j = 1; j < qualities.Length; j++)
+        if (qualities[j] > qualities[bestIdx]) bestIdx = j;
+
+
+      // update best solution so far
+      var bestSolution = results[bestSolutionResultName].Value as Solution;
+      if (bestSolution == null ||
+        bestSolution.Quality.Value < qualities[bestIdx]) {
+
+        var newBestSolution = Decoder.Decode(individuals[bestIdx], BinShape, Items, UseStackingConstraints);
+        newBestSolution.Quality = new DoubleValue(qualities[bestIdx]);
+        results[bestSolutionResultName].Value = newBestSolution;
+        results[numContainersResultName].Value = new IntValue(newBestSolution.NrOfBins);
+        results[binUtilResultName].Value = new DoubleValue(BinUtilizationEvaluator.CalculateBinUtilization(newBestSolution));
+
+        // update best known solution
+        var bestKnownQuality = BestKnownQualityParameter.Value;
+        if (bestKnownQuality == null ||
+            bestKnownQuality.Value < qualities[bestIdx]) {
+          BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[bestIdx]);
+          BestKnownSolutionParameter.ActualValue = newBestSolution;
+        }
+      }
+    }
+
+
+    #region Problem instance handling
+    public void Load(BPPData data) {
+      BestKnownSolutionParameter.Value = null;
+      BestKnownQualityParameter.Value = null;
+
+      if (data.BestKnownQuality.HasValue)
+        BestKnownQuality = data.BestKnownQuality.Value;
+
+      BinShape = data.BinShape;
+      var items = new ItemList<PackingItem>(data.Items);
+      items.Sort((x, y) => y.CompareTo(x));
+      Items = items.AsReadOnly();
+
+      ApplyHorizontalOrientation();
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+
+
+    public BPPData Export() {
+      return new BPPData {
+        Name = Name,
+        Description = Description,
+        BinShape = BinShape,
+        Items = Items.ToArray()
+      };
+    }
+    #endregion
+
+
+    #region helpers
+    private void ApplyHorizontalOrientation() {
+      BinShape.ApplyHorizontalOrientation();
+      foreach (var shape in Items) {
+        shape.ApplyHorizontalOrientation();
+      }
+    }
+
+    private int CalculateLowerBound() {
+      //This is the obvious continuous lower bound calculation; Martello and Vigo proposed a better way but it has not been implemented yet;
+      int itemsVol = Items.Select(x => x.Volume).Sum();
+      int binVol = BinShape.Volume;
+      return (itemsVol + binVol - 1) / (binVol);
+    }
+
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Solution.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Solution.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/3D/Solution.cs	(revision 14170)
@@ -0,0 +1,21 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bin Packing Solution (3d)", "Represents a solution for a 3D bin packing problem.")]
+  [StorableClass]
+  public class Solution : PackingPlan<PackingPosition, PackingShape, PackingItem> {
+    public Solution(PackingShape binShape) : this(binShape, false, false) { }
+    public Solution(PackingShape binShape, bool useExtremePoints, bool stackingConstraints) : base(binShape, useExtremePoints, stackingConstraints) { }
+    [StorableConstructor]
+    protected Solution(bool deserializing) : base(deserializing) { }
+    protected Solution(Solution original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Solution(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/BinPacking.cs	(revision 14170)
@@ -0,0 +1,150 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("BinPacking", "Represents a single-bin packing for a bin-packing problem.")]
+  [StorableClass]
+  public abstract class BinPacking<TPos, TBin, TItem> : Item
+    where TPos : class, IPackingPosition
+    where TBin : PackingShape<TPos>
+    where TItem : PackingShape<TPos> {
+    #region Properties
+    [Storable]
+    public ObservableDictionary<int, TPos> Positions { get; private set; }
+
+    [Storable]
+    public ObservableDictionary<int, TItem> Items { get; private set; }
+
+    [Storable]
+    public TBin BinShape { get; private set; }
+
+    [Storable]
+    public SortedSet<TPos> ExtremePoints { get; protected set; }
+
+    [Storable]
+    protected Dictionary<int, List<int>> OccupationLayers { get; set; }
+
+    #endregion Properties
+
+    protected BinPacking(TBin binShape)
+      : base() {
+      Positions = new ObservableDictionary<int, TPos>();
+      Items = new ObservableDictionary<int, TItem>();
+      BinShape = (TBin)binShape.Clone();
+      OccupationLayers = new Dictionary<int, List<int>>();
+    }
+
+
+    [StorableConstructor]
+    protected BinPacking(bool deserializing) : base(deserializing) { }
+    protected BinPacking(BinPacking<TPos, TBin, TItem> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Positions = new ObservableDictionary<int, TPos>();
+      foreach (var kvp in original.Positions) {
+        Positions.Add(kvp.Key, cloner.Clone(kvp.Value));
+      }
+      this.Items = new ObservableDictionary<int, TItem>();
+      foreach (var kvp in original.Items) {
+        Items.Add(kvp.Key, cloner.Clone(kvp.Value));
+      }
+      this.BinShape = (TBin)original.BinShape.Clone(cloner);
+      this.OccupationLayers = new Dictionary<int, List<int>>();
+      foreach (var kvp in original.OccupationLayers) {
+        OccupationLayers.Add(kvp.Key, new List<int>(kvp.Value));
+      }
+    }
+
+    protected abstract void GenerateNewExtremePointsForNewItem(TItem item, TPos position);
+
+    public abstract TPos FindExtremePointForItem(TItem item, bool rotated, bool stackingConstraints);
+    public abstract TPos FindPositionBySliding(TItem item, bool rotated);
+
+    public abstract void SlidingBasedPacking(ref IList<int> sequence, IList<TItem> items);
+    public abstract void SlidingBasedPacking(ref IList<int> sequence, IList<TItem> items, Dictionary<int, bool> rotationArray);
+    public abstract void ExtremePointBasedPacking(ref IList<int> sequence, IList<TItem> items, bool stackingConstraints);
+    public abstract void ExtremePointBasedPacking(ref IList<int> sequence, IList<TItem> items, bool stackingConstraints, Dictionary<int, bool> rotationArray);
+
+    public void PackItem(int itemID, TItem item, TPos position) {
+      Items[itemID] = item;
+      Positions[itemID] = position;
+      ExtremePoints.Remove(position);
+      foreach (int id in Items.Select(x => x.Key))
+        GenerateNewExtremePointsForNewItem(Items[id], Positions[id]);
+
+      AddNewItemToOccupationLayers(itemID, item, position);
+    }
+
+    public double PackingDensity {
+      get {
+        double result = 0;
+        foreach (var entry in Items)
+          result += entry.Value.Volume;
+        result /= BinShape.Volume;
+        return result;
+      }
+    }
+
+
+    public int PointOccupation(TPos position) {
+      foreach (var id in GetLayerItemIDs(position)) {
+        if (Items[id].EnclosesPoint(Positions[id], position))
+          return id;
+      }
+      return -1;
+    }
+
+    public bool IsPointOccupied(TPos position) {
+      foreach (var id in GetLayerItemIDs(position)) {
+        if (Items[id].EnclosesPoint(Positions[id], position))
+          return true;
+      }
+      return false;
+    }
+    public bool IsPositionFeasible(TItem item, TPos position) {
+      //In this case feasability is defined as following: 1. the item fits into the bin-borders; 2. the point is supported by something; 3. the item does not collide with another already packed item
+      if (!BinShape.Encloses(position, item))
+        return false;
+
+      foreach (var id in GetLayerItemIDs(item, position)) {
+        if (Items[id].Overlaps(Positions[id], position, item))
+          return false;
+      }
+
+      return true;
+    }
+    public abstract int ShortestPossibleSideFromPoint(TPos position);
+    public abstract bool IsStaticStable(TItem measures, TPos position);
+
+
+    protected abstract void InitializeOccupationLayers();
+    protected abstract void AddNewItemToOccupationLayers(int itemID, TItem item, TPos position);
+    protected abstract List<int> GetLayerItemIDs(TPos position);
+    protected abstract List<int> GetLayerItemIDs(TItem item, TPos position);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj	(revision 14170)
@@ -0,0 +1,272 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BinPacking</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BinPacking-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Problems.BinPacking.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Problems.BinPacking.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Problems.BinPacking.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Problems.BinPacking.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="2D\BinPacking2D.cs" />
+    <Compile Include="2D\Evaluators\BinUtilizationEvaluator.cs" />
+    <Compile Include="2D\Evaluators\PackingRatioEvaluator.cs" />
+    <Compile Include="2D\Instances\BPPData.cs" />
+    <Compile Include="2D\Instances\RandomDataDescriptor.cs" />
+    <Compile Include="2D\Instances\RandomInstanceProvider.cs" />
+    <Compile Include="2D\IntegerVectorEncoding\BottomLeftIntegerVectorDecoder.cs" />
+    <Compile Include="2D\IntegerVectorEncoding\ExtremePointIntegerVectorDecoder.cs" />
+    <Compile Include="2D\IntegerVectorEncoding\IntegerVectorDecoderBase.cs" />
+    <Compile Include="2D\IntegerVectorEncoding\IntegerVectorProblem.cs" />
+    <Compile Include="2D\Interfaces\IDecoder.cs" />
+    <Compile Include="2D\Interfaces\IEvaluator.cs" />
+    <Compile Include="2D\Interfaces\IOperator.cs" />
+    <Compile Include="2D\MoveEvaluatorBase.cs" />
+    <Compile Include="2D\PackingItem.cs" />
+    <Compile Include="2D\PackingPosition.cs" />
+    <Compile Include="2D\PackingShape.cs" />
+    <Compile Include="2D\PermutationEncoding\BottomLeftPermutationDecoder.cs" />
+    <Compile Include="2D\PermutationEncoding\ExtremePointPermutationDecoder.cs" />
+    <Compile Include="2D\PermutationEncoding\PermutationProblem.cs" />
+    <Compile Include="2D\PermutationEncoding\Swap2MoveEvaluator.cs" />
+    <Compile Include="2D\PermutationEncoding\TranslocationMoveEvaluator.cs" />
+    <Compile Include="2D\ProblemBase.cs" />
+    <Compile Include="2D\Solution.cs" />
+    <Compile Include="3D\BinPacking3D.cs" />
+    <Compile Include="3D\Evaluators\BinUtilizationEvaluator.cs" />
+    <Compile Include="3D\Evaluators\PackingRatioEvaluator.cs" />
+    <Compile Include="3D\Instances\BPPData.cs" />
+    <Compile Include="3D\Instances\RandomDataDescriptor.cs" />
+    <Compile Include="3D\Instances\RandomInstanceProvider.cs" />
+    <Compile Include="3D\IntegerVectorEncoding\BottomLeftIntegerVectorDecoder.cs" />
+    <Compile Include="3D\IntegerVectorEncoding\ExtremePointIntegerVectorDecoder.cs" />
+    <Compile Include="3D\IntegerVectorEncoding\IntegerVectorDecoderBase.cs" />
+    <Compile Include="3D\IntegerVectorEncoding\IntegerVectorProblem.cs" />
+    <Compile Include="3D\Interfaces\IDecoder.cs" />
+    <Compile Include="3D\Interfaces\IEvaluator.cs" />
+    <Compile Include="3D\Interfaces\IOperator.cs" />
+    <Compile Include="3D\MoveEvaluatorBase.cs" />
+    <Compile Include="3D\PackingItem.cs" />
+    <Compile Include="3D\PackingPosition.cs" />
+    <Compile Include="3D\PackingShape.cs" />
+    <Compile Include="3D\PermutationEncoding\BottomLeftPermutationDecoder.cs" />
+    <Compile Include="3D\PermutationEncoding\ExtremePointPermutationDecoder.cs" />
+    <Compile Include="3D\PermutationEncoding\PermutationProblem.cs" />
+    <Compile Include="3D\PermutationEncoding\Swap2MoveEvaluator.cs" />
+    <Compile Include="3D\PermutationEncoding\TranslocationMoveEvaluator.cs" />
+    <Compile Include="3D\ProblemBase.cs" />
+    <Compile Include="3D\Solution.cs" />
+    <Compile Include="BinPacking.cs" />
+    <Compile Include="Interfaces\IPackingItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Interfaces\IPackingPosition.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Interfaces\IPackingShape.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PackingPlan.cs" />
+    <Compile Include="PackingPosition.cs" />
+    <Compile Include="PackingShape.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.IntegerVectorEncoding\3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj">
+      <Project>{ddfb14dd-2a85-493c-a52d-e69729bbaeb0}</Project>
+      <Name>HeuristicLab.Encodings.IntegerVectorEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{dbecb8b0-b166-4133-baf1-ed67c3fd7fca}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs	(revision 14170)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.BinPacking {
+  // a packing item is one of the items that needs to be located in one of the packing bins (containers)
+  public interface IPackingItem : IPackingShape {
+    double Weight { get; set; }
+    int Material { get; set; }
+    /// <summary>
+    /// Returns true if the "other" item can be stacked on this item.
+    /// </summary>
+    /// <param name="other"></param>
+    /// <returns></returns>
+    bool SupportsStacking (IPackingItem other);
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs	(revision 14170)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  
+  public interface IPackingPosition : IItem {
+    int AssignedBin { get; }
+    bool Rotated { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs	(revision 14170)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  // a packing shape represents a physical object of correct dimension (2d or 3d) 
+  // packing bins (containers) and packing items are both packing shapes
+  public interface IPackingShape : IItem, IComparable {
+    int Volume { get; }
+    void ApplyHorizontalOrientation();
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPlan.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPlan.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPlan.cs	(revision 14170)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  public abstract class PackingPlan<D, B, I> : Item
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    #region Properties
+    public int NrOfBins {
+      get {
+        if (Bins != null)
+          return Bins.Count;
+        else return 0;
+      }
+    }
+    [Storable]
+    protected bool StackingConstraints { get; set; }
+    [Storable]
+    protected bool UseExtremePoints { get; set; }
+
+    [Storable]
+    public B BinShape { get; private set; }
+
+    [Storable]
+    public ObservableList<BinPacking<D, B, I>> Bins { get; set; }
+
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          if (quality != null) DeregisterQualityEvents();
+          quality = value;
+          if (quality != null) RegisterQualityEvents();
+          OnQualityChanged();
+        }
+      }
+    }
+    #endregion
+
+    protected PackingPlan(B binShape, bool useExtremePoints, bool stackingConstraints)
+      : base() {
+      BinShape = (B)binShape.Clone();
+      StackingConstraints = stackingConstraints;
+      UseExtremePoints = useExtremePoints;
+      Bins = new ObservableList<BinPacking<D, B, I>>();
+    }
+
+    [StorableConstructor]
+    protected PackingPlan(bool deserializing) : base(deserializing) { }
+    protected PackingPlan(PackingPlan<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Bins = new ObservableList<BinPacking<D, B, I>>(original.Bins.Select(p => cloner.Clone(p)));
+      UseExtremePoints = original.UseExtremePoints;
+      StackingConstraints = original.StackingConstraints;
+      BinShape = cloner.Clone(original.BinShape);
+      Quality = cloner.Clone(original.Quality);
+    }
+
+
+    public void UpdateBinPackings() {
+      Bins.RemoveAll(x => x.Positions.Count == 0);
+      Bins = new ObservableList<BinPacking<D, B, I>>(Bins.OrderByDescending(bp => bp.PackingDensity));
+    }
+
+    #region Events
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var changed = QualityChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    private void RegisterQualityEvents() {
+      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+    }
+    private void DeregisterQualityEvents() {
+      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+    }
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPosition.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPosition.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/PackingPosition.cs	(revision 14170)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  // PackingPosition is immutable (and handled as value types concerning Equals and GetHashCode)
+  public abstract class PackingPosition : Item, IPackingPosition {
+    /// <summary>
+    /// The number of the bin to which the current item is assigned is stored in this variable. Counting starts at 0 !!!
+    /// </summary>    
+    [Storable]
+    private readonly int assignedBin;
+    public int AssignedBin {
+      get { return assignedBin; }
+    }
+
+    [Storable]
+    private readonly bool rotated;
+    /// <summary>
+    /// Determines if the positioned item is to be rotate by 90 degrees or not. (TODO: which axis?)
+    /// </summary>
+    public bool Rotated {
+      get { return rotated; }
+    }
+
+    [StorableConstructor]
+    protected PackingPosition(bool deserializing) : base(deserializing) { }
+    protected PackingPosition(PackingPosition original, Cloner cloner)
+      : base(original, cloner) {
+      assignedBin = original.AssignedBin;
+      rotated = original.Rotated;
+    }
+
+    protected PackingPosition(int assignedBin, bool rotated) {
+      this.assignedBin = assignedBin;
+      this.rotated = rotated;
+    }
+
+    public override string ToString() {
+      return string.Format("[{0}-{1}]", AssignedBin, Rotated);
+    }
+
+    public override bool Equals(object obj) {
+      var other = obj as PackingPosition;
+      if (other != null)
+        return (other.AssignedBin == this.AssignedBin && other.Rotated == this.Rotated);
+      else return false;
+    }
+
+    public override int GetHashCode() {
+      return 31 * AssignedBin * (Rotated ? 3 : 7);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs	(revision 14170)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  public abstract class PackingShape<T> : Item, IPackingShape, IParameterizedItem
+    where T : class, IPackingPosition {
+    public static Type PositionType {
+      get { return typeof(T); }
+    }
+
+    public abstract bool EnclosesPoint(T myPosition, T checkedPoint);
+    public abstract bool Encloses(T checkedPosition, PackingShape<T> checkedShape);
+    public abstract bool Overlaps(T myPosition, T checkedPosition, PackingShape<T> checkedShape);
+    public abstract int Volume { get; }
+    public abstract T Origin { get; }
+
+    protected PackingShape()
+      : base() {
+      Parameters = new ParameterCollection();
+    }
+
+    [StorableConstructor]
+    protected PackingShape(bool deserializing) { }
+    protected PackingShape(PackingShape<T> original, Cloner cloner) {
+      this.Parameters = new ParameterCollection(original.Parameters.Select(p => cloner.Clone(p)));
+    }
+
+    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
+      foreach (IValueParameter param in Parameters.OfType<IValueParameter>()) {
+        var children = GetCollectedValues(param);
+        foreach (var c in children) {
+          if (String.IsNullOrEmpty(c.Key))
+            values.Add(param.Name, c.Value);
+          else values.Add(param.Name + "." + c.Key, c.Value);
+        }
+      }
+    }
+
+    protected virtual IEnumerable<KeyValuePair<string, IItem>> GetCollectedValues(IValueParameter param) {
+      if (param.Value == null) yield break;
+      if (param.GetsCollected) yield return new KeyValuePair<string, IItem>(String.Empty, param.Value);
+      var parameterizedItem = param.Value as IParameterizedItem;
+      if (parameterizedItem != null) {
+        var children = new Dictionary<string, IItem>();
+        parameterizedItem.CollectParameterValues(children);
+        foreach (var child in children) yield return child;
+      }
+    }
+
+    public abstract void ApplyHorizontalOrientation();
+    public abstract int CompareTo(object obj);
+
+    [Storable]
+    public IKeyedItemCollection<string, IParameter> Parameters { get; private set; }
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame	(revision 14170)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BinPacking {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.BinPacking plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.BinPacking", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.BinPacking-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class HeuristicLabProblemsBinPackingPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame	(revision 14170)
+++ /stable/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame	(revision 14170)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.BinPacking")]
+[assembly: AssemblyDescription("HeuristicLab BinPacking classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 HEAL and Joseph Helm")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5D63ECBE-F92C-40DC-A081-C073323D72FF")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /stable/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 14169)
+++ /stable/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 14170)
@@ -39,4 +39,42 @@
   <PropertyGroup>
     <StartupObject />
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>CODE_ANALYSIS;DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <RunCodeAnalysis>true</RunCodeAnalysis>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>CODE_ANALYSIS;DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <RunCodeAnalysis>true</RunCodeAnalysis>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <ItemGroup>
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearch3dBinPackingSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearch3dBinPackingSampleTest.cs	(revision 14170)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearch3dBinPackingSampleTest.cs	(revision 14170)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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
+
+using System.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.TabuSearch;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.BinPacking3D;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class TabuSearch3dBinPackingSampleTest {
+    private const string SampleFileName = "TS_BPP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateTabuSearchBppSampleTest() {
+      var ts = CreateTabuSearchBppSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ts, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunTabuSearchBppSampleTest() {
+      var ts = CreateTabuSearchBppSample();
+      ts.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ts);
+      // Assert.AreEqual(6294, SamplesUtils.GetDoubleResult(ts, "BestQuality"));
+      // Assert.AreEqual(7380.0386666666664, SamplesUtils.GetDoubleResult(ts, "CurrentAverageQuality"));
+      // Assert.AreEqual(8328, SamplesUtils.GetDoubleResult(ts, "CurrentWorstQuality"));
+      // Assert.AreEqual(750000, SamplesUtils.GetIntResult(ts, "EvaluatedMoves"));
+    }
+
+    private TabuSearch CreateTabuSearchBppSample() {
+      TabuSearch ts = new TabuSearch();
+      #region Problem Configuration
+      PermutationProblem bppProblem = new PermutationProblem();
+      #endregion
+      #region Algorithm Configuration
+      ts.Name = "Tabu Search - 3D Bin Packing Problem";
+      ts.Description = "A tabu search algorithm that solves a 3D bin packing problem instance";
+      ts.Problem = bppProblem;
+
+      ts.MaximumIterations.Value = 1000;
+      // move generator has to be set first
+      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
+        .OfType<Encodings.PermutationEncoding.StochasticTranslocationMultiMoveGenerator>()
+        .Single();
+      ts.MoveGenerator = moveGenerator;
+      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
+        .OfType<Problems.BinPacking3D.TranslocationMoveEvaluator>()
+        .Single();
+      ts.MoveEvaluator = moveEvaluator;
+      var moveMaker = ts.MoveMakerParameter.ValidValues
+        .OfType<TranslocationMoveMaker>()
+        .Single();
+      ts.MoveMaker = moveMaker;
+      ts.SampleSize.Value = 100;
+      ts.Seed.Value = 0;
+      ts.SetSeedRandomly.Value = true;
+
+      var tabuChecker = ts.TabuCheckerParameter.ValidValues
+        .OfType<TranslocationMoveSoftTabuCriterion>()
+        .Single();
+      tabuChecker.UseAspirationCriterion.Value = true;
+      ts.TabuChecker = tabuChecker;
+
+      var tabuMaker = ts.TabuMakerParameter.ValidValues
+        .OfType<TranslocationMoveTabuMaker>()
+        .Single();
+      ts.TabuMaker = tabuMaker;
+      ts.TabuTenure.Value = 60;
+
+      #endregion
+      ts.Engine = new ParallelEngine.ParallelEngine();
+      return ts;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 14169)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 14170)
@@ -270,4 +270,9 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\bin\HeuristicLab.Problems.Binary-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.BinPacking-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.BinPacking-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
