Index: /branches/1966_HeuristicLab.BinPacking/Build.cmd
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/Build.cmd	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/Build.cmd	(revision 16100)
@@ -0,0 +1,104 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Release]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Release
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :clean
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:clean
+IF "%~4"=="" GOTO :prompt_clean
+
+SET CLEANBEFOREBUILD=%~4
+GOTO :main
+
+:prompt_clean
+SET /P CLEANBEFOREBUILD=Would you like to clean before building [n]: 
+IF "%CLEANBEFOREBUILD%"=="" SET CLEANBEFOREBUILD=n
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%" NEQ "n" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.BinPacking.sln
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.BinPacking.sln	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.BinPacking.sln	(revision 16100)
@@ -0,0 +1,98 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+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
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D116A47D-AFF7-4E88-B621-2111EE0DE4FD}"
+	ProjectSection(SolutionItems) = preProject
+		..\Build.cmd = ..\Build.cmd
+		..\PreBuildEvent.cmd = ..\PreBuildEvent.cmd
+	EndProjectSection
+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", "{78763A4E-E163-48C2-98EB-709760D06F25}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BinPacking2D-3.3", "HeuristicLab.Problems.BinPacking.2D\3.3\HeuristicLab.Problems.BinPacking2D-3.3.csproj", "{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BinPacking3D-3.3", "HeuristicLab.Problems.BinPacking.3D\3.3\HeuristicLab.Problems.BinPacking3D-3.3.csproj", "{95680C63-1E06-4E66-B33B-272A772321C7}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{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|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Debug|Mixed Platforms.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|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F8A55094-3CD5-4034-B0CA-5BD7FFB016D4}.Release|Mixed Platforms.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
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|x64.ActiveCfg = Debug|x64
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|x64.Build.0 = Debug|x64
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|x86.ActiveCfg = Debug|x86
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Debug|x86.Build.0 = Debug|x86
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|Any CPU.Build.0 = Release|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|x64.ActiveCfg = Release|x64
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|x64.Build.0 = Release|x64
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|x86.ActiveCfg = Release|x86
+		{78763A4E-E163-48C2-98EB-709760D06F25}.Release|x86.Build.0 = Release|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|x64.ActiveCfg = Debug|x64
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|x64.Build.0 = Debug|x64
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|x86.ActiveCfg = Debug|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Debug|x86.Build.0 = Debug|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|Any CPU.Build.0 = Release|Any CPU
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|Mixed Platforms.Build.0 = Release|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|x64.ActiveCfg = Release|x64
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|x64.Build.0 = Release|x64
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|x86.ActiveCfg = Release|x86
+		{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}.Release|x86.Build.0 = Release|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|x64.ActiveCfg = Debug|x64
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|x64.Build.0 = Debug|x64
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|x86.ActiveCfg = Debug|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Debug|x86.Build.0 = Debug|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|Mixed Platforms.Build.0 = Release|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|x64.ActiveCfg = Release|x64
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|x64.Build.0 = Release|x64
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|x86.ActiveCfg = Release|x86
+		{95680C63-1E06-4E66-B33B-272A772321C7}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/BinPacking2D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/BinPacking2D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/BinPacking2D.cs	(revision 16100)
@@ -0,0 +1,222 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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>(new EPComparer2D());
+      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)), new EPComparer2D());
+    }
+    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;
+    }
+  }
+  public class EPComparer2D : IComparer<PackingPosition> {
+    public int Compare(PackingPosition a, PackingPosition b) {
+      int result = a.X.CompareTo(b.X);
+      if (result == 0)
+        result = a.Y.CompareTo(b.Y);
+
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/BinUtilizationEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings[i].BinShape.Volume;
+        totalUsedSpace += solution.BinPackings[i].Items.Sum(kvp => kvp.Value.Volume);
+      }
+
+      return totalUsedSpace / totalUsableSpace;
+    }
+
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/PackingRatioEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings[i].Items.Sum(kvp => kvp.Value.Volume);
+        double c = solution.BinPackings[i].BinShape.Volume;
+        result += Math.Pow(f / c, k);
+      }
+
+      result = result / nrOfBins;
+      return result;
+    }
+
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/HeuristicLab.Problems.BinPacking2D-3.3.csproj
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/HeuristicLab.Problems.BinPacking2D-3.3.csproj	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/HeuristicLab.Problems.BinPacking2D-3.3.csproj	(revision 16100)
@@ -0,0 +1,220 @@
+﻿<?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>{56DD7F51-3164-4C26-A97A-ADD6FE4B4E86}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BinPacking2D</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BinPacking2D-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="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <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="BinPacking2D.cs" />
+    <Compile Include="Evaluators\BinUtilizationEvaluator.cs" />
+    <Compile Include="Evaluators\PackingRatioEvaluator.cs" />
+    <Compile Include="Instances\BPPData.cs" />
+    <Compile Include="Instances\RandomDataDescriptor.cs" />
+    <Compile Include="Instances\RandomInstanceProvider.cs" />
+    <Compile Include="IntegerVectorEncoding\BottomLeftIntegerVectorDecoder.cs" />
+    <Compile Include="IntegerVectorEncoding\IntegerVectorDecoderBase.cs" />
+    <Compile Include="IntegerVectorEncoding\ExtremePointIntegerVectorDecoder.cs" />
+    <Compile Include="IntegerVectorEncoding\IntegerVectorProblem.cs" />
+    <Compile Include="Interfaces\IOperator.cs" />
+    <Compile Include="Interfaces\IDecoder.cs" />
+    <Compile Include="Interfaces\IEvaluator.cs" />
+    <Compile Include="PackingItem.cs" />
+    <Compile Include="PackingPosition.cs" />
+    <Compile Include="PackingShape.cs" />
+    <Compile Include="PermutationEncoding\BottomLeftPermutationDecoder.cs" />
+    <Compile Include="PermutationEncoding\ExtremePointPermutationDecoder.cs" />
+    <Compile Include="PermutationEncoding\PermutationProblem.cs" />
+    <Compile Include="PermutationEncoding\Swap2MoveEvaluator.cs" />
+    <Compile Include="PermutationEncoding\TranslocationMoveEvaluator.cs" />
+    <Compile Include="ProblemBase.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Solution.cs" />
+    <Compile Include="MoveEvaluatorBase.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <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>
+    </ProjectReference>
+  </ItemGroup>
+  <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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/BPPData.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/BPPData.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/BPPData.cs	(revision 16100)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+
+namespace HeuristicLab.Problems.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomDataDescriptor.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomDataDescriptor.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomDataDescriptor.cs	(revision 16100)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomInstanceProvider.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomInstanceProvider.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Instances/RandomInstanceProvider.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinMeasures);
+      bp.SlidingBasedPacking(ref remainingIDs, items);
+      return bp;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinMeasures);
+      bp.ExtremePointBasedPacking(ref remainingIDs, items, stackingConstraints: false);
+      return bp;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.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.BinPackings) {
+          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.BinPackings.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IDecoder.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IEvaluator.cs	(revision 16100)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  public interface IEvaluator : IItem {
+    double Evaluate(Solution solution);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Interfaces/IOperator.cs	(revision 16100)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluatorBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluatorBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluatorBase.cs	(revision 16100)
@@ -0,0 +1,95 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DGV.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DGV.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DGV.cs	(revision 16100)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("GroupingVectorMoveEvaluator2D", "Class for evaluating packing moves for 2dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator2DGV<T> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, T>, ISingleObjectiveMoveEvaluator, IGroupingVectorMoveOperator, I2DOperator
+  where T : class , IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator2DGV(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator2DGV(PackingMoveEvaluator2DGV<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator2DGV<T>(this, cloner);
+    }
+    public PackingMoveEvaluator2DGV()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DMCV.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DMCV.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DMCV.cs	(revision 16100)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("MultiComponentVectorMoveEvaluator2D", "Class for evaluating packing moves for 2dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator2DMCV<T> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, T>, ISingleObjectiveMoveEvaluator, IMultiComponentVectorMoveOperator, I2DOperator 
+  where T : class, IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator2DMCV(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator2DMCV(PackingMoveEvaluator2DMCV<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator2DMCV<T>(this, cloner);
+    }
+    public PackingMoveEvaluator2DMCV()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DPS.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DPS.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/MoveEvaluators/PackingMoveEvaluator2DPS.cs	(revision 16100)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("PackingSequenceMoveEvaluator2D", "Class for evaluating packing moves for 2dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator2DPS<T> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, T>, ISingleObjectiveMoveEvaluator, IPackingSequenceMoveOperator, I2DOperator
+  where T : class, IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator2DPS(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator2DPS(PackingMoveEvaluator2DPS<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator2DPS<T>(this, cloner);
+    }
+    public PackingMoveEvaluator2DPS()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingItem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingItem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingItem.cs	(revision 16100)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingPosition.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingPosition.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingPosition.cs	(revision 16100)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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 {
+    [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);
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingShape.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingShape.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PackingShape.cs	(revision 16100)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/PermutationProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/PermutationProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/PermutationProblem.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Plugin.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Plugin.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Plugin.cs.frame	(revision 16100)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.BinPacking plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.BinPacking2D", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.BinPacking2D-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "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 Plugin : PluginBase {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/ProblemBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/ProblemBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/ProblemBase.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.2D")]
+[assembly: AssemblyDescription("HeuristicLab bin packing classes (2D)")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 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("43175434-F3CA-48F1-8471-88A774C28428")]
+
+// 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Solution.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Solution.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/Solution.cs	(revision 16100)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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 binMeasures) : this(binMeasures, false, false) { }
+    public Solution(PackingShape binMeasures, bool useExtremePoints, bool stackingConstraints) : base(binMeasures, 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/BinPacking3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/BinPacking3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/BinPacking3D.cs	(revision 16100)
@@ -0,0 +1,337 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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>(new EPComparer3D());
+      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)), new EPComparer3D());
+    }
+    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;
+    }
+  }
+  public class EPComparer3D : IComparer<PackingPosition> {
+    public int Compare(PackingPosition a, PackingPosition b) {
+      int result = a.Z.CompareTo(b.Z);
+      if (result == 0)
+        result = a.X.CompareTo(b.X);
+      if (result == 0)
+        result = a.Y.CompareTo(b.Y);
+
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/BinUtilizationEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings[i].BinShape.Volume;
+        totalUsedSpace += solution.BinPackings[i].Items.Sum(kvp => kvp.Value.Volume);
+      }
+
+      return totalUsedSpace / totalUsableSpace;
+    }
+
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/PackingRatioEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings[i].Items.Sum(kvp => kvp.Value.Volume);
+        double c = solution.BinPackings[i].BinShape.Volume;
+        result += Math.Pow(f / c, k);
+      }
+
+      result = result / nrOfBins;
+      return result;
+    }
+
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/HeuristicLab.Problems.BinPacking3D-3.3.csproj
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/HeuristicLab.Problems.BinPacking3D-3.3.csproj	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/HeuristicLab.Problems.BinPacking3D-3.3.csproj	(revision 16100)
@@ -0,0 +1,219 @@
+﻿<?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>{95680C63-1E06-4E66-B33B-272A772321C7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BinPacking3D</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BinPacking3D-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="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <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="BinPacking3D.cs" />
+    <Compile Include="Evaluators\BinUtilizationEvaluator.cs" />
+    <Compile Include="Evaluators\PackingRatioEvaluator.cs" />
+    <Compile Include="Instances\BPPData.cs" />
+    <Compile Include="Instances\RandomDataDescriptor.cs" />
+    <Compile Include="Instances\RandomInstanceProvider.cs" />
+    <Compile Include="IntegerVectorEncoding\BottomLeftIntegerVectorDecoder.cs" />
+    <Compile Include="IntegerVectorEncoding\ExtremePointIntegerVectorDecoder.cs" />
+    <Compile Include="IntegerVectorEncoding\IntegerVectorDecoderBase.cs" />
+    <Compile Include="IntegerVectorEncoding\IntegerVectorProblem.cs" />
+    <Compile Include="Interfaces\IDecoder.cs" />
+    <Compile Include="Interfaces\IEvaluator.cs" />
+    <Compile Include="Interfaces\IOperator.cs" />
+    <Compile Include="MoveEvaluatorBase.cs" />
+    <Compile Include="PackingItem.cs" />
+    <Compile Include="PackingPosition.cs" />
+    <Compile Include="PackingShape.cs" />
+    <Compile Include="PermutationEncoding\BottomLeftPermutationDecoder.cs" />
+    <Compile Include="PermutationEncoding\ExtremePointPermutationDecoder.cs" />
+    <Compile Include="PermutationEncoding\PermutationProblem.cs" />
+    <Compile Include="PermutationEncoding\Swap2MoveEvaluator.cs" />
+    <Compile Include="PermutationEncoding\TranslocationMoveEvaluator.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemBase.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Solution.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <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>
+    </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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/I3DOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/I3DOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/I3DOperator.cs	(revision 16100)
@@ -0,0 +1,25 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface I3DOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/BPPData.cs	(revision 16100)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+
+namespace HeuristicLab.Problems.BinPacking3D {
+
+  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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomDataDescriptor.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomDataDescriptor.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomDataDescriptor.cs	(revision 16100)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomInstanceProvider.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomInstanceProvider.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Instances/RandomInstanceProvider.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinMeasures);
+      bp.SlidingBasedPacking(ref remainingIDs, items);
+      return bp;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/ExtremePointIntegerVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinMeasures);
+      bp.ExtremePointBasedPacking(ref remainingIDs, items, useStackingConstraints);
+      return bp;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorDecoderBase.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.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.BinPackings) {
+          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.BinPackings.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/IntegerVectorEncoding/IntegerVectorProblem.cs	(revision 16100)
@@ -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.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> {
+    // 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IDecoder.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IEvaluator.cs	(revision 16100)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface IEvaluator : IItem {
+    double Evaluate(Solution solution);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Interfaces/IOperator.cs	(revision 16100)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluatorBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluatorBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluatorBase.cs	(revision 16100)
@@ -0,0 +1,99 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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 (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"]; }
+    }
+    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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DGV.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DGV.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DGV.cs	(revision 16100)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("GroupingVectorMoveEvaluator3D", "Class for evaluating packing moves for 3dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator3DGV<M> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, M>, ISingleObjectiveMoveEvaluator, IGroupingVectorMoveOperator, I3DOperator 
+  where M: class, IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator3DGV(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator3DGV(PackingMoveEvaluator3DGV<M> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator3DGV<M>(this, cloner);
+    }
+    public PackingMoveEvaluator3DGV()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DMCV.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DMCV.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DMCV.cs	(revision 16100)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("MultiComponentVectorMoveEvaluator3D", "Class for evaluating packing moves for 3dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator3DMCV<M> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, M>, ISingleObjectiveMoveEvaluator, IMultiComponentVectorMoveOperator, I3DOperator
+  where M : class, IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator3DMCV(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator3DMCV(PackingMoveEvaluator3DMCV<M> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator3DMCV<M>(this, cloner);
+    }
+    public PackingMoveEvaluator3DMCV()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DPS.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DPS.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/MoveEvaluators/PackingMoveEvaluator3DPS.cs	(revision 16100)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("PackingSequenceMoveEvaluator3D", "Class for evaluating packing moves for 3dimensional problems.")]
+  [StorableClass]
+  public class PackingMoveEvaluator3DPS<M> : PackingMoveEvaluator<PackingPosition, PackingShape, PackingItem, M>, ISingleObjectiveMoveEvaluator, IPackingSequenceMoveOperator, I3DOperator
+  where M : class, IItem {
+    [StorableConstructor]
+    protected PackingMoveEvaluator3DPS(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator3DPS(PackingMoveEvaluator3DPS<M> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingMoveEvaluator3DPS<M>(this, cloner);
+    }
+    public PackingMoveEvaluator3DPS()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingItem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingItem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingItem.cs	(revision 16100)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingPosition.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingPosition.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingPosition.cs	(revision 16100)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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 {
+    [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);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingRatioEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingRatioEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingRatioEvaluator.cs	(revision 16100)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Packing-Ratio Evaluator (3d)", "Calculates the ratio between packed and unpacked space. Found in Falkenauer:1996")]
+  [StorableClass]
+  public class PackingRatioEvaluator : PackingRatioEvaluator<PackingPosition, PackingShape, PackingItem> {
+
+    [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);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingShape.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingShape.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PackingShape.cs	(revision 16100)
@@ -0,0 +1,194 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/BottomLeftPermutationDecoder.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/ExtremePointPermutationDecoder.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings.Add(bp);
+      }
+      result.UpdateBinPackings();
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/PermutationProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/PermutationProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/PermutationProblem.cs	(revision 16100)
@@ -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 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> {
+    // 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;
+        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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/Swap2MoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/PermutationEncoding/TranslocationMoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Plugin.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Plugin.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Plugin.cs.frame	(revision 16100)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.BinPacking plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.BinPacking3D", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.BinPacking3D-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "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 Plugin : PluginBase {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/ProblemBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/ProblemBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/ProblemBase.cs	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.3D")]
+[assembly: AssemblyDescription("HeuristicLab bin packing classes (3D)")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 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("C1F5F4AC-2C92-4127-8909-AFBCF59EBCE0")]
+
+// 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Solution.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Solution.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.3D/3.3/Solution.cs	(revision 16100)
@@ -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 binMeasures) : this(binMeasures, false, false) { }
+    public Solution(PackingShape binMeasures, bool useExtremePoints, bool stackingConstraints) : base(binMeasures, 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml	(revision 16100)
@@ -0,0 +1,30 @@
+﻿<!--
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see<http://www.gnu.org/licenses/> .
+ */
+-->
+
+<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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container2DView.xaml.cs	(revision 16100)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml	(revision 16100)
@@ -0,0 +1,136 @@
+﻿<!--
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see<http://www.gnu.org/licenses/> .
+ */
+-->
+
+<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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Container3DView.xaml.cs	(revision 16100)
@@ -0,0 +1,301 @@
+﻿/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see<http://www.gnu.org/licenses/> .
+ */
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/HeuristicLab.Problems.BinPacking.Views-3.3.csproj	(revision 16100)
@@ -0,0 +1,239 @@
+﻿<?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>{78763A4E-E163-48C2-98EB-709760D06F25}</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="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <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.Problems.BinPacking.2D\3.3\HeuristicLab.Problems.BinPacking2D-3.3.csproj">
+      <Project>{56dd7f51-3164-4c26-a97a-add6fe4b4e86}</Project>
+      <Name>HeuristicLab.Problems.BinPacking2D-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.BinPacking.3D\3.3\HeuristicLab.Problems.BinPacking3D-3.3.csproj">
+      <Project>{95680c63-1e06-4e66-b33b-272a772321c7}</Project>
+      <Name>HeuristicLab.Problems.BinPacking3D-3.3</Name>
+    </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>
+    </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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.Designer.cs	(revision 16100)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.cs	(revision 16100)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings[currentBin];
+    }
+
+    private void binSelection_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateState(Content);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan2DView.resx	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.Designer.cs	(revision 16100)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.cs	(revision 16100)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.BinPackings)
+          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.BinPackings[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.BinPackings[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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/PackingPlan3DView.resx	(revision 16100)
@@ -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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Plugin.cs.frame	(revision 16100)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.BinPacking", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  public class HeuristicLabProblemsBinPackingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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-2015 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BestBinPackingSolutionAnalyzer.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BestBinPackingSolutionAnalyzer.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BestBinPackingSolutionAnalyzer.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("BestBinPackingSolutionAnalyzer", "An operator for analyzing the best solution of BinPacking Problems given in packingPlan-representation.")]
+  [StorableClass]
+  public class BestBinPackingSolutionAnalyzer<D, B, I> : BinPackingAnalyzer<D, B, I>, IStochasticOperator
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IRandom Random {
+      get { return RandomParameter.ActualValue; }
+    }
+
+    [StorableConstructor]
+    protected BestBinPackingSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BestBinPackingSolutionAnalyzer(BestBinPackingSolutionAnalyzer<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BestBinPackingSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestBinPackingSolutionAnalyzer<D, B, I>(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<PackingPlan<D, B, I>> solutions = PackingPlanParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      bool max = MaximizationParameter.ActualValue.Value;
+      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+
+      int i = -1;
+      if (!max)
+        i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      else i = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
+
+      if (bestKnownQuality == null ||
+          max && qualities[i].Value > bestKnownQuality.Value ||
+          !max && qualities[i].Value < bestKnownQuality.Value) {
+        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
+        BestKnownSolutionParameter.ActualValue = (PackingPlan<D, B, I>)solutions[i].Clone();
+      }
+
+      PackingPlan<D, B, I> bestSolution = BestSolutionParameter.ActualValue;
+      if (bestSolution == null) {
+        bestSolution = (PackingPlan<D, B, I>)solutions[i].Clone();
+        bestSolution.Quality = (DoubleValue)qualities[i].Clone();
+        BestSolutionParameter.ActualValue = bestSolution;
+        results.Add(new Result("Best Packing Solution", bestSolution));
+      } else {
+        if (max && bestSolution.Quality.Value < qualities[i].Value ||
+          !max && bestSolution.Quality.Value > qualities[i].Value) {
+          bestSolution.Quality.Value = qualities[i].Value;
+          //bestSolution.PackingItemPositions = new ObservableDictionary<int, D> (solutions[i].PackingItemPositions);
+          //bestSolution.PackingBinMeasures = new ObservableDictionary<int, B>(solutions[i].PackingBinMeasures);
+          bestSolution.BinPackings = new ObservableList<BinPacking<D, B, I>>(solutions[i].BinPackings);
+        }
+      }
+      string binUtilKey = "Overall Bin Utilization";
+      var binUtil = new DoubleValue(BinUtilizationEvaluator<D, B, I>.CalculateBinUtilization(bestSolution));
+      if (!results.ContainsKey(binUtilKey))
+        results.Add(new Result(binUtilKey, binUtil));
+      else
+        results[binUtilKey].Value = binUtil;
+
+
+      string nocKey = "Nr Of Containers";
+      if (!results.ContainsKey(nocKey))
+        results.Add(new Result(nocKey, new IntValue(bestSolution.NrOfBins)));
+      else
+        results[nocKey].Value = new IntValue(bestSolution.NrOfBins);
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BinPackingAnalyzer.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BinPackingAnalyzer.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Analyzers/BinPackingAnalyzer.cs	(revision 16100)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("BinPackingAnalyzer", "Represents the generalized form of Analyzers for BinPacking Problems.")]
+  [StorableClass]
+  public abstract class BinPackingAnalyzer<D, B, I> : SingleSuccessorOperator, IAnalyzer
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+    public virtual bool EnabledByDefault {
+      get { return true; }
+    }
+
+    #region Parameter Properties
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<PackingPlan<D, B, I>> BestSolutionParameter {
+      get { return (LookupParameter<PackingPlan<D, B, I>>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<PackingPlan<D, B, I>> BestKnownSolutionParameter {
+      get { return (LookupParameter<PackingPlan<D, B, I>>)Parameters["BestKnownSolution"]; }
+    }
+    public ScopeTreeLookupParameter<PackingPlan<D, B, I>> PackingPlanParameter {
+      get { return (ScopeTreeLookupParameter<PackingPlan<D,B,I>>)Parameters["PackingPlan"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected BinPackingAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BinPackingAnalyzer(BinPackingAnalyzer<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    protected BinPackingAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the packing solutions which should be analyzed."));
+      Parameters.Add(new LookupParameter<PackingPlan<D, B, I>>("BestSolution", "The best performing packing plan."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best packing solution should be stored."));
+      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this packing-problem instance."));
+      Parameters.Add(new LookupParameter<PackingPlan<D, B, I>>("BestKnownSolution", "The best known solution of this packing-problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<PackingPlan<D, B, I>>("PackingPlan", "The solutions from which the best solution has to be chosen from."));
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/BinBasedMultiComponentVectorCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/BinBasedMultiComponentVectorCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/BinBasedMultiComponentVectorCrossover.cs	(revision 16100)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Bin Based Multi Component Vector Crossover", "An operator which crosses two MultiComponentVector representations. The applied strategy is based on the RBX crossover proposed by Potvin.")]
+  [StorableClass]
+  public class BinBasedMultiComponentVectorCrossover :  MultiComponentVectorCrossover {
+    [StorableConstructor]
+    protected BinBasedMultiComponentVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected BinBasedMultiComponentVectorCrossover(BinBasedMultiComponentVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public BinBasedMultiComponentVectorCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinBasedMultiComponentVectorCrossover(this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding Cross(IRandom random, MultiComponentVectorEncoding parent1, MultiComponentVectorEncoding parent2) {
+      MultiComponentVectorEncoding child = new MultiComponentVectorEncoding ();
+
+      int nrOfItems = parent1.NrOfItems;
+
+      bool[] itemAlreadyAssigned = new bool[nrOfItems];
+      int nrOfBins = parent1.NrOfBins > parent2.NrOfBins ? parent2.NrOfBins : parent1.NrOfBins;
+
+      //Add one bin from parent1
+      int swappedBinNr = random.Next(nrOfBins);
+      var swappedBin = new ItemList<PackingInformation>();
+      for (int i = 0; i < parent1.PackingInformations[swappedBinNr].Count; i++) {
+        PackingInformation pi = new PackingInformation(parent1.PackingInformations[swappedBinNr][i]);
+        if (!itemAlreadyAssigned[pi.ItemID]) {
+          itemAlreadyAssigned[pi.ItemID] = true;
+          swappedBin.Add(new PackingInformation(pi));
+        }
+      }
+      child.PackingInformations[swappedBinNr] = swappedBin;
+
+      //Get the remaining bins from parent2
+      for (int binNr = 0; binNr < nrOfBins; binNr++) {
+        if (binNr != swappedBinNr) {
+          var newBin = new ItemList<PackingInformation>();
+          var currentParent = parent2;
+          int nrOfItemsInBin = currentParent.PackingInformations[binNr].Count;
+          for (int i = 0; i < nrOfItemsInBin; i++) {
+            PackingInformation pi = new PackingInformation(currentParent.PackingInformations[binNr][i]);
+            if (!itemAlreadyAssigned[pi.ItemID]) {
+              itemAlreadyAssigned[pi.ItemID] = true;
+              newBin.Add(new PackingInformation(pi));
+            }
+          }
+          child.PackingInformations[binNr] = newBin;
+        }
+      }
+
+      //Pack still remaining items in bin#0
+      for (int itemID = 0; itemID < nrOfItems; itemID++) {
+        if (!itemAlreadyAssigned[itemID])
+          child.PackingInformations[0].Add(new PackingInformation(itemID, random.Next(2) == 0 ? true : false));
+      }                
+
+      return child;
+    }       
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/ChangePositionMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/ChangePositionMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/ChangePositionMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("ChangePositionMoveAttribute", "Specifies the tabu attributes for a change position move on an multi component vector.")]
+  [StorableClass]
+  public class ChangePositionMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }      
+    [Storable]
+    public int ItemID { get; protected set; }
+    [Storable]
+    public int TargetIndex { get; protected set; }
+
+    [StorableConstructor]
+    protected ChangePositionMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected ChangePositionMoveAttribute(ChangePositionMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+        this.Index = original.Index;
+        this.TargetIndex = original.TargetIndex;      
+      this.ItemID = original.ItemID;
+    }
+    public ChangePositionMoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public ChangePositionMoveAttribute(int affectedGroup, int index, int itemID, int targetIndex, double moveQuality)
+      : base(moveQuality) {
+        AffectedGroup = affectedGroup;
+        Index = index;
+        TargetIndex = targetIndex;
+        ItemID = itemID;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChangePositionMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleGroupingMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleGroupingMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleGroupingMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleGroupingMoveAttribute", "Specifies the tabu attributes for a single grouping move on an multi component vector.")]
+  [StorableClass]
+  public class SingleGroupingMoveAttribute : MultiComponentVectorMoveAttribute { 
+    [Storable]
+    public int OldGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int ItemID { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMoveAttribute(SingleGroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {   
+      this.OldGroup = original.OldGroup;
+      this.Index = original.Index;
+      this.ItemID = original.ItemID;
+      this.NewGroup = original.NewGroup;
+    }
+    public SingleGroupingMoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public SingleGroupingMoveAttribute(int oldGroup, int index, int itemID, int newGroup, double moveQuality)
+      : base(moveQuality) {
+        OldGroup = oldGroup;
+      Index = index;
+      ItemID = itemID;
+      NewGroup = newGroup;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleItemRotationMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleItemRotationMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SingleItemRotationMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleItemRotationMoveAttribute", "Specifies the tabu attributes for a single item rotation move on an multi component vector.")]
+  [StorableClass]
+  public class SingleItemRotationMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public bool ItemRotation { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleItemRotationMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SingleItemRotationMoveAttribute(SingleItemRotationMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.AffectedGroup = original.AffectedGroup;
+      this.Index = original.Index;
+      this.ItemIndex = original.ItemIndex;
+      this.ItemRotation = original.ItemRotation;
+    }
+    public SingleItemRotationMoveAttribute() : this(-1, -1, -1, false, -1) { }
+    public SingleItemRotationMoveAttribute(int affectedGroup, int index, int itemIndex, bool itemRotation, double moveQuality)
+      : base(moveQuality) {
+        AffectedGroup = affectedGroup;
+        Index = index;
+      ItemIndex = itemIndex;
+      ItemRotation = itemRotation;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleItemRotationMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SwapPositionMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SwapPositionMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Attributes/SwapPositionMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SwapPositionMoveAttribute", "Specifies the tabu attributes for a swap sequence move on an multi component vector.")]
+  [StorableClass]
+  public class SwapPositionMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+    [Storable]
+    public int ItemID1 { get; protected set; }
+    [Storable]
+    public int ItemID2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapPositionMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SwapPositionMoveAttribute(SwapPositionMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+        this.AffectedGroup = original.AffectedGroup;
+        this.Index1 = original.Index1;
+        this.Index2 = original.Index2;
+      this.ItemID1 = original.ItemID1;
+      this.ItemID2 = original.ItemID2;
+    }
+    public SwapPositionMoveAttribute() : this(-1, -1, -1, -1, -1, -1) { }
+    public SwapPositionMoveAttribute(int affectedGroup, int index1, int index2, int itemID1, int itemID2, double moveQuality)
+      : base(moveQuality) {
+        AffectedGroup = affectedGroup;
+        Index1 = index1;
+        Index2 = index2;
+        ItemID1 = itemID1;
+        ItemID2 = itemID2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapPositionMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/ExhaustiveMultiComponentVectorMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/ExhaustiveMultiComponentVectorMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/ExhaustiveMultiComponentVectorMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Exhaustive MultiComponentVector Move Generator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class ExhaustiveMultiComponentVectorMoveGenerator : MultiComponentVectorMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveMultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveMultiComponentVectorMoveGenerator(ExhaustiveMultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveMultiComponentVectorMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveMultiComponentVectorMoveGenerator(this, cloner);
+    }
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector) {
+      //NrOfMoves = nrOfRotationMoves + nrOfSingleGroupingMoves + nrOfSwapPositionMoves
+      //  nrOfRotationMoves       = nrOfItems
+      //  nrOfSingleGroupingMoves = nrOfItems * (nrOfBins - 1)
+      //  nrOfSwapPositionMoves   = SUM(foreach binNr: !nrOfItemsInBin)
+      int totalMoves = 
+        NrOfRotationMoves(multiComponentVector) +
+        NrOfSingleGroupingMoves(multiComponentVector) +
+        NrOfSwapPositionMoves(multiComponentVector) +
+        NrOfChangePositionMoves(multiComponentVector);
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[totalMoves];
+      int count = 0;
+      foreach (MultiComponentVectorMove move in GenerateRotationMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      foreach (MultiComponentVectorMove move in GenerateSingleGroupingMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      foreach (MultiComponentVectorMove move in GenerateSwapPositionMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      foreach (MultiComponentVectorMove move in GenerateChangePositionMoves(multiComponentVector)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }  
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      return Apply(multiComponentVector);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/ChangePositionMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/ChangePositionMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/ChangePositionMove.cs	(revision 16100)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("ChangePositionMove", "A move on a multi component vector that is specified by two indexes. The packing informations at the first index is inserted at the second one.")]
+  [StorableClass]
+  public class ChangePositionMove : MultiComponentVectorMove {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int TargetIndex { get; protected set; }
+
+    [StorableConstructor]
+    protected ChangePositionMove(bool deserializing) : base(deserializing) { }
+    protected ChangePositionMove(ChangePositionMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.AffectedGroup = original.AffectedGroup;
+      this.Index = original.Index;
+      this.TargetIndex = original.TargetIndex;
+    }
+    public ChangePositionMove(int affectedBin, int index, int targetIndex, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        AffectedGroup = affectedBin;
+        Index = index;
+        TargetIndex = targetIndex;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChangePositionMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      return GetVectorAfterMove(MultiComponentVector, AffectedGroup, Index, TargetIndex);
+    }
+    public static MultiComponentVectorEncoding GetVectorAfterMove(MultiComponentVectorEncoding multiComponentVector, int affectedBin, int index, int targetIndex) {
+      var result = multiComponentVector.Clone(new Cloner()) as MultiComponentVectorEncoding;
+      var aux = result.PackingInformations[affectedBin][index];
+      result.PackingInformations[affectedBin].Remove(aux);
+      result.PackingInformations[affectedBin].Insert(targetIndex, aux);
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(ChangePositionMoveAttribute);
+    }
+
+    public override string ToString() {
+      return "PM(g=" + AffectedGroup  + ",i=" + Index + ",ti=" + TargetIndex + ")";
+    }
+
+    public override MultiComponentVectorMoveAttribute GetAttribute(double quality) {
+      return new ChangePositionMoveAttribute(AffectedGroup, Index,
+        MultiComponentVector.PackingInformations[AffectedGroup][Index].ItemID,
+        TargetIndex, quality);
+    }
+
+    public override bool BelongsToAttribute(MultiComponentVectorMoveAttribute attribute, bool hardCriterion) {
+      ChangePositionMoveAttribute actualAttribute = attribute as ChangePositionMoveAttribute;
+      if (actualAttribute != null) {
+        if (hardCriterion) {
+          if (Index == actualAttribute.Index
+          || TargetIndex == actualAttribute.TargetIndex
+          || MultiComponentVector.PackingInformations[AffectedGroup][Index].ItemID == actualAttribute.ItemID)
+            return true;
+        } else {
+          if (Index == actualAttribute.Index
+          && TargetIndex == actualAttribute.TargetIndex
+          && MultiComponentVector.PackingInformations[AffectedGroup][Index].ItemID == actualAttribute.ItemID)
+            return true;
+        }
+      }
+
+      return false;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleGroupingMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleGroupingMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleGroupingMove.cs	(revision 16100)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleGroupingMove", "A move on a multi component vector that is specified by a single index and a new grouping-value. The grouping of the item on the specified index is changed to the new value.")]
+  [StorableClass]
+  public class SingleGroupingMove : MultiComponentVectorMove {       
+    [Storable]
+    public int OldGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleGroupingMove(bool deserializing) : base(deserializing) { }
+    protected SingleGroupingMove(SingleGroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.OldGroup = original.OldGroup;
+      this.Index = original.Index;
+      this.NewGroup = original.NewGroup;
+    }
+    public SingleGroupingMove(int oldGroup, int index, int newGroup, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        OldGroup = oldGroup;
+        Index = index;
+        NewGroup = newGroup;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleGroupingMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      return GetVectorAfterMove(MultiComponentVector, OldGroup, Index, NewGroup);
+    }
+    public static MultiComponentVectorEncoding GetVectorAfterMove(MultiComponentVectorEncoding originalSolution, int oldBin, int index, int newBin) {
+      var solution = originalSolution.Clone (new Cloner()) as MultiComponentVectorEncoding;
+      var itemgene = solution.PackingInformations[oldBin][index];
+      solution.PackingInformations[oldBin].Remove(itemgene);
+      solution.PackingInformations[newBin].Add(itemgene);
+      return solution;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SingleGroupingMoveAttribute);
+    }
+
+    public override string ToString() {
+      return "GM(og"+OldGroup+",i="+Index+",ng="+NewGroup+")";
+    }
+
+    public override MultiComponentVectorMoveAttribute GetAttribute(double quality) {
+      return new SingleGroupingMoveAttribute(OldGroup, Index,
+        MultiComponentVector.PackingInformations[OldGroup][Index].ItemID, NewGroup, quality);
+    }
+
+    public override bool BelongsToAttribute(MultiComponentVectorMoveAttribute attribute, bool hardCriterion) {
+      SingleGroupingMoveAttribute actualAttribute = attribute as SingleGroupingMoveAttribute;
+      if (actualAttribute != null) {
+        if (hardCriterion) {
+          if (MultiComponentVector.PackingInformations[OldGroup][Index].ItemID == actualAttribute.ItemID
+                || NewGroup == actualAttribute.NewGroup)
+            return true;
+        } else {
+          if (MultiComponentVector.PackingInformations[OldGroup][Index].ItemID == actualAttribute.ItemID
+                && NewGroup == actualAttribute.NewGroup)
+            return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleItemRotationMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleItemRotationMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SingleItemRotationMove.cs	(revision 16100)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SingleItemRotationMove", "A move on a multi component vector that is specified by a single index. The item at the specified index is rotated.")]
+  [StorableClass]
+  public class SingleItemRotationMove : MultiComponentVectorMove {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }
+
+    [StorableConstructor]
+    protected SingleItemRotationMove(bool deserializing) : base(deserializing) { }
+    protected SingleItemRotationMove(SingleItemRotationMove original, Cloner cloner)
+      : base(original, cloner) {
+        this.AffectedGroup = original.AffectedGroup;
+        this.Index = original.Index;
+    }
+    public SingleItemRotationMove(int affectedBin, int index, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        AffectedGroup = affectedBin;
+        Index = index;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleItemRotationMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      return GetVectorAfterMove (MultiComponentVector, AffectedGroup, Index);
+    }
+    public static MultiComponentVectorEncoding GetVectorAfterMove(MultiComponentVectorEncoding multiComponentVector, int affectedGroup, int index) {
+      var result = multiComponentVector.Clone(new Cloner()) as MultiComponentVectorEncoding;
+      result.PackingInformations[affectedGroup][index].Rotated = !result.PackingInformations[affectedGroup][index].Rotated;
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SingleItemRotationMoveAttribute);
+    }
+
+    public override string ToString() {
+      return "RM(g=" + AffectedGroup + ",i=" + Index + ")";
+    }
+
+    public override MultiComponentVectorMoveAttribute GetAttribute(double quality) {
+        return new SingleItemRotationMoveAttribute(AffectedGroup, Index, 
+          MultiComponentVector.PackingInformations[AffectedGroup][Index].ItemID, 
+          MultiComponentVector.PackingInformations[AffectedGroup][Index].Rotated, quality);
+    }
+
+    public override bool BelongsToAttribute(MultiComponentVectorMoveAttribute attribute, bool hardCriterion) {
+      SingleItemRotationMoveAttribute actualAttribute = attribute as SingleItemRotationMoveAttribute;
+      if (actualAttribute != null) {
+        if (hardCriterion) {
+          if (AffectedGroup == actualAttribute.AffectedGroup || MultiComponentVector.PackingInformations[AffectedGroup][Index].Rotated == actualAttribute.ItemRotation)
+            return true;
+        } else {
+          if (AffectedGroup == actualAttribute.AffectedGroup && MultiComponentVector.PackingInformations[AffectedGroup][Index].Rotated == actualAttribute.ItemRotation)
+            return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SwapPositionMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SwapPositionMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/Moves/SwapPositionMove.cs	(revision 16100)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("SwapPositionMove", "A move on a multi component vector that is specified by two indexes. The packing informations at the speciefied indexes are beeing swapped.")]
+  [StorableClass]
+  public class SwapPositionMove : MultiComponentVectorMove {
+    [Storable]
+    public int AffectedGroup { get; protected set; }
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapPositionMove(bool deserializing) : base(deserializing) { }
+    protected SwapPositionMove(SwapPositionMove original, Cloner cloner)
+      : base(original, cloner) {
+        this.AffectedGroup = original.AffectedGroup;
+        this.Index1 = original.Index1;
+        this.Index2 = original.Index2;
+    }
+    public SwapPositionMove(int affectedGroup, int index1, int index2, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) {
+        AffectedGroup = affectedGroup;
+        Index1 = index1;
+        Index2 = index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapPositionMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      return GetVectorAfterMove(MultiComponentVector, AffectedGroup, Index1, Index2);
+    }
+    public static MultiComponentVectorEncoding GetVectorAfterMove(MultiComponentVectorEncoding multiComponentVector, int affectedGroup, int index1, int index2) {
+      var result = multiComponentVector.Clone(new Cloner()) as MultiComponentVectorEncoding;
+      var aux = result.PackingInformations[affectedGroup][index1];
+      result.PackingInformations[affectedGroup][index1] = result.PackingInformations[affectedGroup][index2];
+      result.PackingInformations[affectedGroup][index2] = aux;
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(SwapPositionMoveAttribute);
+    }
+
+    public override string ToString() {
+      return "SPM(g=" + AffectedGroup + ",i1=" + Index1 + ",i2=" + Index2 + ")";
+    }
+
+    public override MultiComponentVectorMoveAttribute GetAttribute(double quality) {
+      return new SwapPositionMoveAttribute(AffectedGroup, Index1, Index2,
+        MultiComponentVector.PackingInformations[AffectedGroup][Index1].ItemID,
+        MultiComponentVector.PackingInformations[AffectedGroup][Index2].ItemID, quality);
+    }
+
+    public override bool BelongsToAttribute(MultiComponentVectorMoveAttribute attribute, bool hardCriterion) {
+      SwapPositionMoveAttribute actualAttribute = attribute as SwapPositionMoveAttribute;
+      if (actualAttribute != null) {
+        if (hardCriterion) {
+          if (Index1 == actualAttribute.Index1
+            || Index2 == actualAttribute.Index2
+            || MultiComponentVector.PackingInformations[AffectedGroup][Index1].ItemID == actualAttribute.ItemID1
+            || MultiComponentVector.PackingInformations[AffectedGroup][Index2].ItemID == actualAttribute.ItemID2)
+            return true;
+        } else {
+          if (Index1 == actualAttribute.Index1
+            && Index2 == actualAttribute.Index2
+            && MultiComponentVector.PackingInformations[AffectedGroup][Index1].ItemID == actualAttribute.ItemID1
+            && MultiComponentVector.PackingInformations[AffectedGroup][Index2].ItemID == actualAttribute.ItemID2)
+            return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/StochasticMultiComponentVectorMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/StochasticMultiComponentVectorMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Multi/StochasticMultiComponentVectorMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Stochastic MultiComponentVector Move Generator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class StochasticMultiComponentVectorMoveGenerator : MultiComponentVectorMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticMultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticMultiComponentVectorMoveGenerator(StochasticMultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticMultiComponentVectorMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticMultiComponentVectorMoveGenerator(this, cloner);
+    }
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector, IRandom random, int sampleSize) {
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[sampleSize];
+      var rm = new List<MultiComponentVectorMove> (GenerateRotationMoves(multiComponentVector));
+      var gm = new List<MultiComponentVectorMove>(GenerateSingleGroupingMoves(multiComponentVector));
+      var sm = new List<MultiComponentVectorMove>(GenerateSwapPositionMoves(multiComponentVector));
+      var cpm = new List<MultiComponentVectorMove>(GenerateChangePositionMoves(multiComponentVector));
+
+      for (int i = 0; i < sampleSize; i++) {
+        int typeDecision = random.Next(4);
+        switch (typeDecision) {
+          case 0: moves[i] = rm[random.Next(rm.Count)];
+            break;
+          case 1: moves[i] = gm[random.Next(gm.Count)];
+            break;
+          case 2: moves[i] = sm[random.Next(sm.Count)];
+            break;
+          case 3: moves[i] = cpm[random.Next(cpm.Count)];
+            break;
+          default:
+            break;
+        }
+      }
+      return moves;
+    }
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(multiComponentVector, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMove.cs	(revision 16100)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMove", "An abstract move for a multi component vector encoded solution.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorMove : Item, IPackingMove {
+    [Storable]
+    public MultiComponentVectorEncoding MultiComponentVector { get; protected set; }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMove(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMove(MultiComponentVectorMove original, Cloner cloner)
+      : base(original, cloner) {
+        if (original.MultiComponentVector != null)
+          this.MultiComponentVector = cloner.Clone(original.MultiComponentVector);
+    }
+    public MultiComponentVectorMove(MultiComponentVectorEncoding multiComponentVector)
+      : base() {
+        MultiComponentVector = multiComponentVector;
+    }
+
+    public abstract IPackingSolutionEncoding GetSolutionAfterMove();
+    public abstract Type GetMoveAttributeType();
+    public abstract MultiComponentVectorMoveAttribute GetAttribute(double quality);
+    public abstract bool BelongsToAttribute (MultiComponentVectorMoveAttribute attribute, bool hardCriterion);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveAttribute", "Base class for specifying a move attribute for multi component vector moves.")]
+  [StorableClass]
+  public class MultiComponentVectorMoveAttribute : Item {
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveAttribute(MultiComponentVectorMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
+    }
+    public MultiComponentVectorMoveAttribute() : this(0) { }
+    public MultiComponentVectorMoveAttribute( double moveQuality)
+      : base() {
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,123 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveGenerator", "Base class for all multi-component vector move generators.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorMoveGenerator : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }               
+
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveGenerator(MultiComponentVectorMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveGenerator()
+      : base() {
+        Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The multi component vector for which moves should be generated."));
+        Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+
+    public static int NrOfRotationMoves(MultiComponentVectorEncoding mcv) {
+      return mcv.NrOfItems;
+    }
+    public static IEnumerable<MultiComponentVectorMove> GenerateRotationMoves(MultiComponentVectorEncoding multiComponentVector) {
+      for (int binNr = 0; binNr < multiComponentVector.PackingInformations.Count; binNr++)
+        for (int index = 0; index < multiComponentVector.PackingInformations[binNr].Count; index++)
+          yield return new SingleItemRotationMove(binNr, index, multiComponentVector);
+    }
+
+    public static int NrOfSingleGroupingMoves(MultiComponentVectorEncoding mcv) {
+      return mcv.NrOfItems * (mcv.NrOfBins - 1);
+    }
+    public static IEnumerable<MultiComponentVectorMove> GenerateSingleGroupingMoves(MultiComponentVectorEncoding multiComponentVector) {
+      for (int oldBin = 0; oldBin < multiComponentVector.PackingInformations.Count; oldBin++)
+        for (int index = 0; index < multiComponentVector.PackingInformations[oldBin].Count; index++)
+          for (int newBin = 0; newBin < multiComponentVector.NrOfBins; newBin++) 
+            if (newBin != oldBin)
+              yield return new SingleGroupingMove(oldBin, index, newBin, multiComponentVector);
+    }
+
+    public static int NrOfSwapPositionMoves(MultiComponentVectorEncoding mcv) {
+      int nrOfSwapPositionMoves = 0;
+      foreach (var groupInformations in mcv.PackingInformations) {
+        nrOfSwapPositionMoves += (groupInformations.Value.Count * (groupInformations.Value.Count - 1)) / 2;
+      }
+      return nrOfSwapPositionMoves;
+    }
+    public static IEnumerable<MultiComponentVectorMove> GenerateSwapPositionMoves(MultiComponentVectorEncoding multiComponentVector) {
+      for (int bin = 0; bin < multiComponentVector.PackingInformations.Count; bin++)
+        for (int oldIndex = 0; oldIndex < multiComponentVector.PackingInformations[bin].Count - 1; oldIndex++) 
+          for (int newIndex = oldIndex + 1; newIndex < multiComponentVector.PackingInformations[bin].Count; newIndex++)
+            yield return new SwapPositionMove(bin, oldIndex, newIndex, multiComponentVector);
+    }
+
+    public static int NrOfChangePositionMoves(MultiComponentVectorEncoding mcv) {
+      int nrOfChangePositionMoves = 0;
+      foreach (var groupInformations in mcv.PackingInformations) {
+        nrOfChangePositionMoves += (groupInformations.Value.Count * (groupInformations.Value.Count - 1)) / 2;
+      }
+      return nrOfChangePositionMoves;
+    }
+    public static IEnumerable<MultiComponentVectorMove> GenerateChangePositionMoves(MultiComponentVectorEncoding multiComponentVector) {
+      for (int bin = 0; bin < multiComponentVector.PackingInformations.Count; bin++)
+        for (int oldIndex = 0; oldIndex < multiComponentVector.PackingInformations[bin].Count - 1; oldIndex++) 
+          for (int newIndex = oldIndex + 1; newIndex < multiComponentVector.PackingInformations[bin].Count; newIndex++)
+            yield return new ChangePositionMove(bin, oldIndex, newIndex, multiComponentVector);
+    }
+
+    public override IOperation Apply() {
+      MultiComponentVectorEncoding mcv = MultiComponentVectorParameter.ActualValue;
+      MultiComponentVectorMove[] moves = GenerateMoves(mcv);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveHardTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveHardTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveHardTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveHardTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class MultiComponentVectorMoveHardTabuCriterion : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveHardTabuCriterion(MultiComponentVectorMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveHardTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      MultiComponentVectorMove move = PackingMoveParameter.ActualValue as MultiComponentVectorMove;
+      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
+      int length = multiComponentVector.PackingInformations.Count;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, multiComponentVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, MultiComponentVectorMove move, MultiComponentVectorEncoding multiComponentVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      foreach (IItem attr in attributes) {
+        MultiComponentVectorMoveAttribute mcvAttr = attr as MultiComponentVectorMoveAttribute;
+        if (mcvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= mcvAttr.MoveQuality
+              || !maximization && moveQuality >= mcvAttr.MoveQuality)) {
+
+          isTabu = move.BelongsToAttribute(mcvAttr, true);
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveMaker.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveMaker", "Peforms a single move on a given multi-component vector and updates the quality.")]
+  [StorableClass]
+  public class MultiComponentVectorMoveMaker : SingleSuccessorOperator, IMoveMaker, IMultiComponentVectorMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlan"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanAfterMoveParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlanAfterMove"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveMaker(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveMaker(MultiComponentVectorMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution as grouping vector."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlan", "The currently best performing, decoded bin-packing solution represented as generalized packing-plan."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlanAfterMove", "The moved and decoded bin-packing solution represented as generalized packing-plan."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      IPackingMove move = PackingMoveParameter.ActualValue;
+      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      multiComponentVector.PackingInformations = (move.GetSolutionAfterMove() as MultiComponentVectorEncoding).PackingInformations;
+      PackingPlanParameter.ActualValue = PackingPlanAfterMoveParameter.ActualValue;
+
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveSoftTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveSoftTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorMoveSoftTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MultiComponentVectorMoveSoftTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class MultiComponentVectorMoveSoftTabuCriterion : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorMoveSoftTabuCriterion(MultiComponentVectorMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorMoveSoftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      MultiComponentVectorMove move = PackingMoveParameter.ActualValue as MultiComponentVectorMove;
+      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
+      int length = multiComponentVector.PackingInformations.Count;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, multiComponentVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, MultiComponentVectorMove move, MultiComponentVectorEncoding multiComponentVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      foreach (IItem attr in attributes) {
+        MultiComponentVectorMoveAttribute mcvAttr = attr as MultiComponentVectorMoveAttribute;
+        if (mcvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= mcvAttr.MoveQuality
+              || !maximization && moveQuality >= mcvAttr.MoveQuality)) {
+
+                isTabu = move.BelongsToAttribute(mcvAttr, false);
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorTabuMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorTabuMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/MultiComponentVectorTabuMaker.cs	(revision 16100)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi component tabu maker", "Declares a given single grouping move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class MultiComponentVectorTabuMaker : TabuMaker, IMultiComponentVectorMoveOperator {
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
+      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorTabuMaker(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorTabuMaker(MultiComponentVectorTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      IPackingMove move = PackingMoveParameter.ActualValue;
+      MultiComponentVectorEncoding solution = MultiComponentVectorParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (maximization && quality > moveQuality || !maximization && quality < moveQuality)
+        baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      MultiComponentVectorMove mcvMove = move as MultiComponentVectorMove;
+      if (mcvMove != null)
+        return mcvMove.GetAttribute(baseQuality);
+      else return solution;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Attributes/MCVTripleMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Attributes/MCVTripleMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Attributes/MCVTripleMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MCVTripleMoveAttribute", "Specifies the tabu attributes for a change position move on an multi component vector.")]
+  [StorableClass]
+  public class MCVTripleMoveAttribute : MultiComponentVectorMoveAttribute {
+    [Storable]
+    public int Index { get; protected set; } 
+    [Storable]
+    public int ItemID { get; protected set; }  
+    [Storable]
+    public int TargetIndex { get; protected set; }
+    [Storable]
+    public bool Rotation { get; protected set; }
+    [Storable]
+    public int GroupBefore { get; protected set; }
+    [Storable]
+    public int GroupAfter { get; protected set; }
+
+    [StorableConstructor]
+    protected MCVTripleMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected MCVTripleMoveAttribute(MCVTripleMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+        this.Index = original.Index;
+        this.TargetIndex = original.TargetIndex;      
+      this.ItemID = original.ItemID;
+      this.Rotation = original.Rotation;
+      this.GroupBefore = original.GroupBefore;
+      this.GroupAfter = original.GroupAfter;
+    }
+    public MCVTripleMoveAttribute() : this(-1, -1, -1, false, -1, -1, -1) { }
+    public MCVTripleMoveAttribute(int index, int targetIndex, int itemID, bool rotation, int groupBefore, int groupAfter, double moveQuality)
+      : base(moveQuality) {
+        Index = index;
+        TargetIndex = targetIndex;
+        ItemID = itemID;
+        Rotation = rotation;
+        GroupBefore = groupBefore;
+        GroupAfter = groupAfter;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MCVTripleMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/ExhaustiveMCVTripleMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/ExhaustiveMCVTripleMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/ExhaustiveMCVTripleMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Exhaustive MultiComponentVector Triple Move Generator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class ExhaustiveMCVTripleMoveGenerator : MultiComponentVectorMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveMCVTripleMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveMCVTripleMoveGenerator(ExhaustiveMCVTripleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveMCVTripleMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveMCVTripleMoveGenerator(this, cloner);
+    }
+
+    public static IEnumerable<MultiComponentVectorMove> GenerateMCVTripleMoves(MultiComponentVectorEncoding mcv) {  
+      foreach (var oldGroup in mcv.PackingInformations) 
+        for (int sourceIndex = 0; sourceIndex < oldGroup.Value.Count; sourceIndex++) 
+          foreach (var newGroup in mcv.PackingInformations) 
+            for (int targetIndex = 0; targetIndex < newGroup.Value.Count; targetIndex++) {
+              yield return new MCVTripleMove(oldGroup.Key, newGroup.Key, sourceIndex, targetIndex, false, mcv);
+              yield return new MCVTripleMove(oldGroup.Key, newGroup.Key, sourceIndex, targetIndex, true, mcv);
+            }
+    }
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector) {
+      var generatedMoves = new List<MultiComponentVectorMove>(GenerateMCVTripleMoves(multiComponentVector));
+      int totalMoves = generatedMoves.Count;
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[totalMoves];
+      int count = 0;
+      foreach (MultiComponentVectorMove move in generatedMoves) {
+        moves[count++] = move;
+      }
+      return moves;
+    }  
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      return Apply(multiComponentVector);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Moves/MCVTripleMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Moves/MCVTripleMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/Moves/MCVTripleMove.cs	(revision 16100)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("MCVTripleMove", "A move on a multi component vector that is specified by a rotation-value, two indexes and a groupNr.")]
+  [StorableClass]
+  public class MCVTripleMove : MultiComponentVectorMove {   
+    [Storable]
+    public int OldGroup { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+    [Storable]
+    public int Index { get; protected set; }    
+    [Storable]
+    public int TargetIndex { get; protected set; }
+    [Storable]
+    public bool Rotation { get; protected set; }
+
+    [StorableConstructor]
+    protected MCVTripleMove(bool deserializing) : base(deserializing) { }
+    protected MCVTripleMove(MCVTripleMove original, Cloner cloner)
+      : base(original, cloner) {     
+      this.OldGroup = original.OldGroup;
+      this.NewGroup = original.NewGroup;
+      this.Index = original.Index;       
+      this.TargetIndex = original.TargetIndex;
+      this.Rotation = original.Rotation;
+    }
+    public MCVTripleMove(int oldGroup, int newGroup, int index, int targetIndex, bool rotation, MultiComponentVectorEncoding multiComponentVector)
+      : base(multiComponentVector) { 
+        OldGroup = oldGroup;
+        NewGroup = newGroup;
+        Index = index;        
+        TargetIndex = targetIndex;
+        Rotation = rotation;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MCVTripleMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      var result = MultiComponentVector.Clone(new Cloner()) as MultiComponentVectorEncoding;
+      if (Rotation)
+        result = SingleItemRotationMove.GetVectorAfterMove(result, OldGroup, Index);
+      if (!OldGroup.Equals(NewGroup)) {
+        result = SingleGroupingMove.GetVectorAfterMove(result, OldGroup, Index, NewGroup);
+        int newIndex = result.PackingInformations[NewGroup].Count - 1;
+        if (!newIndex.Equals(TargetIndex))
+          result = ChangePositionMove.GetVectorAfterMove(result, NewGroup, newIndex, TargetIndex);
+      } else if (!Index.Equals(TargetIndex))
+          result = ChangePositionMove.GetVectorAfterMove(result, NewGroup, Index, TargetIndex);
+      return result;
+    }
+
+    public override System.Type GetMoveAttributeType() {
+      return typeof(MCVTripleMoveAttribute);
+    }
+
+    public override string ToString() {
+      return "TM(og=" + OldGroup + ",ng=" + NewGroup + ",i=" + Index + ",ti=" + TargetIndex + ",r=" + Rotation + ")";
+    }
+
+
+    public override MultiComponentVectorMoveAttribute GetAttribute(double quality) {
+      return new MCVTripleMoveAttribute(Index, TargetIndex, MultiComponentVector.PackingInformations[OldGroup][Index].ItemID,
+        Rotation, OldGroup, NewGroup, quality);
+    }
+
+    public override bool BelongsToAttribute(MultiComponentVectorMoveAttribute attribute, bool hardCriterion) {
+      MCVTripleMoveAttribute actualAttribute = attribute as MCVTripleMoveAttribute;
+      if (actualAttribute != null) {
+        if (hardCriterion) {
+          if (Index == actualAttribute.Index || TargetIndex == actualAttribute.TargetIndex
+                  || MultiComponentVector.PackingInformations[OldGroup][Index].ItemID == actualAttribute.ItemID
+                  //|| (OldGroup == actualAttribute.GroupBefore && NewGroup == actualAttribute.GroupAfter)
+            )
+            return true;
+        } else {
+          if ((Index == actualAttribute.Index || TargetIndex == actualAttribute.TargetIndex)
+                  && MultiComponentVector.PackingInformations[OldGroup][Index].ItemID == actualAttribute.ItemID
+                  //&& Rotation == actualAttribute.Rotation
+                  //&& (OldGroup == actualAttribute.GroupBefore && NewGroup == actualAttribute.GroupAfter)
+            )
+            return true;
+        }
+      }
+      return false;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/StochasticMCVTripleMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/StochasticMCVTripleMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/Triple/StochasticMCVTripleMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Stochastic MultiComponentVector Triple Move Generator", "Generates all possible multi component moves from a given multiComponentVector.")]
+  [StorableClass]
+  public class StochasticMCVTripleMoveGenerator : MultiComponentVectorMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+
+    [StorableConstructor]
+    protected StochasticMCVTripleMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticMCVTripleMoveGenerator(StochasticMCVTripleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticMCVTripleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticMCVTripleMoveGenerator(this, cloner);
+    }
+
+    public static List<MultiComponentVectorMove> GenerateMCVTripleMoves(MultiComponentVectorEncoding mcv, IRandom random, int sampleSize) {
+      var result = new List<MultiComponentVectorMove>();
+      var moves = new List<MultiComponentVectorMove> (ExhaustiveMCVTripleMoveGenerator.GenerateMCVTripleMoves(mcv));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        result.Add(moves [random.Next(moveCount)]);
+      }
+      return result;
+    }
+
+    public static MultiComponentVectorMove[] Apply(MultiComponentVectorEncoding multiComponentVector, IRandom random, int sampleSize) {
+      var generatedMoves = GenerateMCVTripleMoves(multiComponentVector, random, sampleSize);
+      int totalMoves = generatedMoves.Count;
+      MultiComponentVectorMove[] moves = new MultiComponentVectorMove[totalMoves];
+      int count = 0;
+      foreach (MultiComponentVectorMove move in generatedMoves) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override MultiComponentVectorMove[] GenerateMoves(MultiComponentVectorEncoding multiComponentVector) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(multiComponentVector, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorCrossover.cs	(revision 16100)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Crossover", "An operator which crosses two GroupingVector representations.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorCrossover : PackingSolutionCrossover, IMultiComponentVectorOperator {
+
+    [StorableConstructor]
+    protected MultiComponentVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorCrossover(MultiComponentVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorCrossover()
+      : base() {
+      ParentsParameter.ActualName = "MultiComponentVector";
+      ChildParameter.ActualName = "MultiComponentVector";
+    }
+
+    public abstract MultiComponentVectorEncoding Cross(IRandom random, MultiComponentVectorEncoding parent1, MultiComponentVectorEncoding parent2);
+
+    public override IOperation Apply() {
+      var parents = ParentsParameter.ActualValue;
+
+      ChildParameter.ActualValue =
+        Cross(RandomParameter.ActualValue, parents[0] as MultiComponentVectorEncoding, parents[1] as MultiComponentVectorEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorEncoding.cs	(revision 16100)
@@ -0,0 +1,189 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Encoding", "Represents an encoding for a bin packing problem using an array of objects containing multiple packing-informations for every packing-item.")]
+  [StorableClass]
+  public class MultiComponentVectorEncoding : Item, IPackingSolutionEncoding {
+
+    [Storable]
+    public ObservableDictionary<int, ItemList<PackingInformation>> PackingInformations { get; set; }
+
+    public int NrOfBins { get { return PackingInformations.Count; } }
+    public int NrOfItems {
+      get {
+        int nrOfItems = 0;
+        foreach (var entry in PackingInformations) { nrOfItems += entry.Value.Count; }
+        return nrOfItems;
+      }
+    }
+
+    [StorableConstructor]
+    protected MultiComponentVectorEncoding(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorEncoding(MultiComponentVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.PackingInformations = new ObservableDictionary<int, ItemList<PackingInformation>>();
+      foreach (var entry in original.PackingInformations) {
+        this.PackingInformations[entry.Key] = cloner.Clone(entry.Value);
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiComponentVectorEncoding(this, cloner);
+    }
+
+    public MultiComponentVectorEncoding()
+      : base() {
+      PackingInformations = new ObservableDictionary<int, ItemList<PackingInformation>>();
+    }
+
+    public List<List<int>> GenerateSequenceMatrix() {
+      List<List<int>> result = new List<List<int>>();
+      foreach (var bi in PackingInformations) {
+        var temp = new List<int>();
+        foreach (var piEntry in bi.Value) {
+          temp.Add(piEntry.ItemID);
+        }
+        result.Add(temp);
+      }
+      return result;
+    }
+    public Dictionary<int, bool> GenerateRotationArray() {
+      Dictionary<int, bool> result = new Dictionary<int, bool>();
+      foreach (var bi in PackingInformations)
+        foreach (var pi in bi.Value)
+          result[pi.ItemID] = pi.Rotated;
+      return result;
+    }
+
+
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("[ ");
+      foreach (var gi in PackingInformations) {
+        sb.Append("g#" + gi.Key.ToString() + "{ ");
+        foreach (var pi in gi.Value) {
+          sb.Append(pi.ToString() + " ");
+        }
+        sb.Append("} ");
+      }
+      sb.Append("]");
+      return sb.ToString();
+    }
+
+
+    public override bool Equals(object obj) {
+      MultiComponentVectorEncoding mce = obj as MultiComponentVectorEncoding;
+      if (mce != null && mce.PackingInformations != null && mce.PackingInformations.Count == this.PackingInformations.Count) {
+        for (int i = 0; i < mce.PackingInformations.Count; i++) {
+          if (mce.PackingInformations[i] != this.PackingInformations[i])
+            return false;
+        }
+      }
+
+      return true;
+    }
+    public override int GetHashCode() {
+      return PackingInformations.GetHashCode();
+    }
+
+  }
+
+  [Item("Packing Information", "Represents a composition of packing informations for the multi-component packing-encoding.")]
+  [StorableClass]
+  public class PackingInformation : Item {
+    [Storable]
+    public int ItemID { get; set; }
+    [Storable]
+    public bool Rotated { get; set; }
+
+    public PackingInformation(int itemID, bool rotated) {
+      this.ItemID = itemID;
+      this.Rotated = rotated;
+    }
+    public PackingInformation(PackingInformation original) {
+      this.ItemID = original.ItemID;
+      this.Rotated = original.Rotated;
+    }
+
+    [StorableConstructor]
+    protected PackingInformation(bool deserializing) : base(deserializing) { }
+    protected PackingInformation(PackingInformation original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemID = original.ItemID;
+      this.Rotated = original.Rotated;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingInformation(this, cloner);
+    }
+
+    public override string ToString() {
+      return String.Format("{0}", ItemID.ToString());
+      //return String.Format("({0}, {1}) ", ItemID, Rotated ? "t" : "f");
+    }
+
+    public override bool Equals(object obj) {
+      PackingInformation pi = obj as PackingInformation;
+      if (pi != null)
+        return this.ItemID.Equals(pi.ItemID) && this.Rotated.Equals(pi.Rotated);
+
+      return false;
+    }
+
+    public override int GetHashCode() {
+      return base.GetHashCode();
+    }
+
+    public static ObservableDictionary<int, ItemList<PackingInformation>> CreateDictionaryRandomly(int items, int nrOfBins, IRandom random) {
+      var result = new ObservableDictionary<int, ItemList<PackingInformation>>();
+      for (int i = 0; i < nrOfBins; i++)
+        result[i] = new ItemList<PackingInformation>();
+
+      Permutation randomItemSequence = new Permutation(PermutationTypes.Absolute, items, random);
+      foreach (int i in randomItemSequence) {
+        result[random.Next(nrOfBins)].Add(new PackingInformation(i, random.Next(100) > 60 ? true : false));
+      }
+      return result;
+    }
+
+    public static ObservableDictionary<int, ItemList<PackingInformation>> CreateDictionaryRandomlyWithSortedSequence(int items, int nrOfBins, IRandom random) {
+      var result = new ObservableDictionary<int, ItemList<PackingInformation>>();
+      for (int i = 0; i < nrOfBins; i++)
+        result[i] = new ItemList<PackingInformation>();
+
+      for (int i = 0; i < items; i++) {
+        result[random.Next(nrOfBins)].Add(new PackingInformation(i, false));
+      }
+      return result;
+    }
+  }
+
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorManipulator.cs	(revision 16100)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Multi Component Vector Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public abstract class MultiComponentVectorManipulator : PackingSolutionManipulator, IMultiComponentVectorOperator {
+    [StorableConstructor]
+    protected MultiComponentVectorManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiComponentVectorManipulator(MultiComponentVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+    public MultiComponentVectorManipulator()
+      : base() {
+      EncodedSolutionParameter.ActualName = "MultiComponentVector";
+    }
+
+    protected abstract void Manipulate(IRandom random, MultiComponentVectorEncoding individual);
+    public override IOperation Apply() {
+      var solution = EncodedSolutionParameter.ActualValue as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("PackingSolutionEncoding was not found or is not of type MultiComponentVectorEncoding.");
+      Manipulate(RandomParameter.ActualValue, solution);
+      return base.Apply();
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/MultiComponentVectorRandomCreator.cs	(revision 16100)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+	[Item("Multi Component Vector Creator", "Creator class used to create MultiComponentVector solutions for bin packing problems.")]
+	[StorableClass]
+	public class MultiComponentVectorRandomCreator : PackingSolutionCreator, IStochasticOperator {
+
+		public ILookupParameter<IRandom> RandomParameter {
+			get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+		}
+		public IValueLookupParameter<IntValue> PackingItemsParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["PackingItems"]; }
+		}
+		public IValueLookupParameter<IntValue> LowerBoundParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["LowerBound"]; }
+		}
+		public IValueParameter<BoolValue> SortedSequenceParameter {
+			get { return (IValueParameter<BoolValue>)Parameters["SortedSequence"]; }
+		}
+
+		[StorableConstructor]
+		protected MultiComponentVectorRandomCreator(bool deserializing) : base(deserializing) { }
+		protected MultiComponentVectorRandomCreator(MultiComponentVectorRandomCreator original, Cloner cloner) : base(original, cloner) {
+		}
+		public override IDeepCloneable Clone(Cloner cloner) {
+			return new MultiComponentVectorRandomCreator(this, cloner);
+		}
+
+		public MultiComponentVectorRandomCreator()
+			: base() {
+			Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("PackingItems", "The number of packing-items handled in this problem instance."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("LowerBound", "The lower possible number of bins needed to solve this problem (taken from Dell'Amico, Martello and Vigo; 2002)"));
+			Parameters.Add(new ValueParameter<BoolValue>("SortedSequence", "Determines if the items of the created instances are to be sorted by their size."));
+
+			EncodedSolutionParameter.ActualName = "MultiComponentVector";
+			SortedSequenceParameter.ActualValue = new BoolValue(false);
+		}
+
+
+		public static MultiComponentVectorEncoding Apply(int items, int lowerBound, IRandom random, bool sortedSequence) {
+			var solution = new MultiComponentVectorEncoding();
+			if (sortedSequence)
+				solution.PackingInformations = PackingInformation.CreateDictionaryRandomlyWithSortedSequence(items, /*lowerBound*/ 1, random);
+			else
+        solution.PackingInformations = PackingInformation.CreateDictionaryRandomly(items, /*lowerBound*/ 1, random);
+			return solution;
+		}
+
+		protected override IItem CreateSolution() {
+			return Apply(PackingItemsParameter.ActualValue.Value, LowerBoundParameter.ActualValue.Value, RandomParameter.ActualValue, SortedSequenceParameter.Value.Value);
+		}
+	}
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/SequenceBasedMultiComponentVectorCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/SequenceBasedMultiComponentVectorCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/SequenceBasedMultiComponentVectorCrossover.cs	(revision 16100)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("Sequence Based Multi Component Vector Crossover", "An operator which crosses two MultiComponentVector representations. The applied strategy is based on the SBX crossover proposed by Potvin.")]
+  [StorableClass]
+  public class SequenceBasedMultiComponentVectorCrossover :  MultiComponentVectorCrossover {
+    [StorableConstructor]
+    protected SequenceBasedMultiComponentVectorCrossover (bool deserializing) : base(deserializing) { }
+    protected SequenceBasedMultiComponentVectorCrossover (SequenceBasedMultiComponentVectorCrossover  original, Cloner cloner) : base(original, cloner) { }
+    public SequenceBasedMultiComponentVectorCrossover ()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceBasedMultiComponentVectorCrossover (this, cloner);
+    }
+
+    public override MultiComponentVectorEncoding Cross(IRandom random, MultiComponentVectorEncoding parent1, MultiComponentVectorEncoding parent2) {
+      MultiComponentVectorEncoding child = new MultiComponentVectorEncoding();
+      int nrOfItems = parent1.NrOfItems;
+      bool[] itemAlreadyAssigned = new bool[nrOfItems];
+
+      bool useParent2 = false;
+      int nrOfBins = parent1.NrOfBins > parent2.NrOfBins ? parent2.NrOfBins : parent1.NrOfBins;
+
+
+      for (int binNr = 0; binNr < nrOfBins; binNr++) {
+        MultiComponentVectorEncoding currentParent1 = useParent2 ? parent2 : parent1;
+        MultiComponentVectorEncoding currentParent2 = useParent2 ? parent1 : parent2;
+
+
+        var newBin = new ItemList<PackingInformation>();
+        double crossPointPercent = 0;
+
+        int nrOfItems1 = currentParent1.PackingInformations[binNr].Count;
+        if (nrOfItems1 > 0) {
+          double crossPoint1 = random.Next(nrOfItems1);
+          crossPointPercent = crossPoint1 / nrOfItems1;
+          for (int i = 0; i < crossPoint1; i++) {
+            PackingInformation pi = new PackingInformation(currentParent1.PackingInformations[binNr][i]);
+            if (!itemAlreadyAssigned[pi.ItemID]) {
+              itemAlreadyAssigned[pi.ItemID] = true;
+              newBin.Add(new PackingInformation(pi));
+            }
+          }
+        }
+
+        int nrOfItems2 = currentParent2.PackingInformations[binNr].Count;
+        if (nrOfItems2 > 0) {
+          int crossPoint2 = Convert.ToInt32(nrOfItems2 * crossPointPercent);
+          for (int i = crossPoint2; i < nrOfItems2; i++) {
+            PackingInformation pi = new PackingInformation(currentParent2.PackingInformations[binNr][i]);
+            if (!itemAlreadyAssigned[pi.ItemID]) {
+              itemAlreadyAssigned[pi.ItemID] = true;
+              newBin.Add(new PackingInformation(pi));
+            }
+          }
+        }
+
+        child.PackingInformations[binNr] = newBin;
+        useParent2 = !useParent2;
+      }
+
+      for (int itemID = 0; itemID < nrOfItems; itemID++) {
+        if (!itemAlreadyAssigned[itemID])
+          child.PackingInformations[0].Add(new PackingInformation(itemID, random.Next(2) == 0 ? true : false));
+      }
+      
+      return child;
+    }       
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/ThreeWayMultiComponentVectorManipulator.cs	(revision 16100)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
+  [Item("ThreeWayMultiComponentVectorManipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class ThreeWayMultiComponentVectorManipulator :  MultiComponentVectorManipulator {
+    [StorableConstructor]
+    protected ThreeWayMultiComponentVectorManipulator(bool deserializing) : base(deserializing) { }
+    protected ThreeWayMultiComponentVectorManipulator(ThreeWayMultiComponentVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+    public ThreeWayMultiComponentVectorManipulator()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ThreeWayMultiComponentVectorManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, MultiComponentVectorEncoding individual) {
+      int manipulatorDecision = random.Next(0, 3);
+      int affectedBin = 0;
+      do {  
+        affectedBin = random.Next(individual.NrOfBins);
+      } while (individual.PackingInformations[affectedBin].Count <= 0);
+      int affectedIndex = random.Next (individual.PackingInformations[affectedBin].Count);
+
+      //Randomly rotate one item
+      if (manipulatorDecision == 0) {
+        individual.PackingInformations = SingleItemRotationMove.GetVectorAfterMove(individual, affectedBin, affectedIndex).PackingInformations;
+      } 
+      //Randomly change the bin-assignment for one item
+      else if (manipulatorDecision == 1) {
+        int targetBin = 0;
+        if (individual.NrOfBins > 1)
+          do { targetBin = random.Next(individual.NrOfBins); }
+          while (targetBin == affectedBin);
+        individual.PackingInformations = SingleGroupingMove.GetVectorAfterMove(individual, affectedBin, affectedIndex, targetBin).PackingInformations;
+      }
+      //Swap the sequence of two items assigned to the same bin
+      else if (manipulatorDecision == 2) {
+        int targetIndex = 0;
+        int nrOfItems = individual.PackingInformations[affectedBin].Count;
+        if (nrOfItems > 1)
+          do { targetIndex = random.Next(nrOfItems); }
+          while (targetIndex == affectedIndex);
+        individual.PackingInformations = ChangePositionMove.GetVectorAfterMove(individual, affectedBin, affectedIndex, targetIndex).PackingInformations;
+      }
+
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking.cs	(revision 16100)
@@ -0,0 +1,150 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs	(revision 16100)
@@ -0,0 +1,183 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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 (BinPackings != null)
+          return BinPackings.Count;
+        else return 0;
+      }
+    }
+    [Storable]
+    protected bool StackingConstraints { get; set; }
+    [Storable]
+    protected bool UseExtremePoints { get; set; }
+
+    [Storable]
+    public B BinMeasures { get; private set; }
+
+    [Storable]
+    public ObservableList<BinPacking<D, B, I>> BinPackings { 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 binMeasures, bool useExtremePoints, bool stackingConstraints)
+      : base() {
+      BinMeasures = (B)binMeasures.Clone();
+      StackingConstraints = stackingConstraints;
+      UseExtremePoints = useExtremePoints;
+      BinPackings = 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.BinPackings = new ObservableList<BinPacking<D, B, I>>(original.BinPackings);
+    }
+
+
+    public void UpdateBinPackings() {
+      BinPackings.RemoveAll(x => x.Positions.Count == 0);
+      BinPackings = new ObservableList<BinPacking<D, B, I>>(BinPackings.OrderByDescending(bp => bp.PackingDensity));
+    }
+
+    /*
+    public void Pack(MultiComponentVectorEncoding solution, ItemList<I> itemMeasures) {
+      var sequenceMatrix = solution.GenerateSequenceMatrix();
+      Dictionary<int, bool> rotated = solution.GenerateRotationArray();
+
+      //Fill bins according to grouping vector
+      List<int> remainingIDs = new List<int>();
+      foreach (var sequence in sequenceMatrix) {
+        remainingIDs = remainingIDs.Concat(sequence).ToList();
+        var bp = NewBinPacking();
+        if (!UseExtremePoints)
+          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures, rotated);
+        else
+          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints, rotated);
+        BinPackings.Add(bp);
+      }
+      UpdateBinPackings();
+
+      //Try to put remaining items in existing bins
+      var temp = new List<int>(remainingIDs);
+      foreach (int id in temp) {
+        foreach (var bp in BinPackings) {
+          var position = UseExtremePoints ? bp.FindExtremePointForItem(itemMeasures[id], rotated[id], StackingConstraints) : bp.FindPositionBySliding(itemMeasures[id], rotated[id]);
+          if (position != null) {
+            bp.PackItem(id, itemMeasures[id], position);
+            remainingIDs.Remove(id);
+            break;
+          }
+        }
+      }
+
+      //Put still remaining items in new bins
+      while (remainingIDs.Count > 0) {
+        var bp = NewBinPacking();
+        if (!UseExtremePoints)
+          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures, rotated);
+        else
+          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints, rotated);
+        BinPackings.Add(bp);
+      }
+      UpdateBinPackings();
+
+      var newSolution = new ObservableDictionary<int, ItemList<PackingInformation>>();
+      foreach (var bp in BinPackings) {
+        int binIndex = newSolution.Count;
+        newSolution[binIndex] = new ItemList<PackingInformation>();
+        foreach (var entry in bp.ItemPositions)
+          newSolution[binIndex].Add(new PackingInformation(entry.Key, entry.Value.Rotated));
+      }
+      solution.PackingInformations = newSolution;
+    }
+    public void Pack(GroupingVectorEncoding solution, ItemList<I> itemMeasures) {
+    }
+     * 
+     
+
+    */
+    #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();
+    }
+
+    public event EventHandler BinPackingsChanged;
+    private void OnBinPackingsChanged() {
+      var changed = BinPackingsChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    private void RegisterBinPackingsEvents() {
+      BinPackings.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(BinPackings_PropertyChanged);
+    }
+    private void DeregisterBinPackingsEvents() {
+      BinPackings.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(BinPackings_PropertyChanged);
+    }
+    private void BinPackings_PropertyChanged(object sender, EventArgs e) {
+      OnBinPackingsChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCreator.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding {
+  [Item("PackingSolutionCreator", "Represents the generalized form of creators for bin packing problems.")]
+  [StorableClass]
+  public abstract class PackingSolutionCreator : SingleSuccessorOperator, IPackingSolutionCreator {
+
+    public ILookupParameter<IItem> EncodedSolutionParameter {
+      get { return (ILookupParameter<IItem>)Parameters["EncodedPackingSolution"]; }
+    }
+
+    [StorableConstructor]
+    protected PackingSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected PackingSolutionCreator(PackingSolutionCreator original, Cloner cloner) : base(original, cloner) { }
+    public PackingSolutionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IItem>("EncodedPackingSolution", "The new bin packing solution candidate."));
+    }
+
+    public override IOperation Apply() {
+      EncodedSolutionParameter.ActualValue = CreateSolution();
+      return base.Apply();
+    }
+
+    protected abstract IItem CreateSolution();
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionCrossover.cs	(revision 16100)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding {
+  [Item("PackingSolutionCrossover", "A bin packing crossover operation.")]
+  [StorableClass]
+  public abstract class PackingSolutionCrossover<T> : SingleSuccessorOperator, IPackingSolutionCrossover<T>, IStochasticOperator
+  where T : class, IItem {
+
+    public ILookupParameter<T> ChildParameter {
+      get { return (ILookupParameter<T>)Parameters["Child"]; }
+    }
+    public IScopeTreeLookupParameter<T> ParentsParameter {
+      get { return (IScopeTreeLookupParameter<T>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected PackingSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected PackingSolutionCrossover(PackingSolutionCrossover<T> original, Cloner cloner) : base(original, cloner) { }
+    public PackingSolutionCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<T>("Child", "The child solution resulting from the crossover."));
+      ChildParameter.ActualName = "EncodedSolution";
+      Parameters.Add(new ScopeTreeLookupParameter<T>("Parents", "The parent solution which should be crossed."));
+      ParentsParameter.ActualName = "EncodedSolution";
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingSolutionManipulator.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding {
+  [Item("PackingSolutionManipulator", "A bin packing manipulation operation.")]
+  [StorableClass]
+  public abstract class PackingSolutionManipulator<T> : SingleSuccessorOperator, IPackingSolutionManipulator<T>, IStochasticOperator
+  where T : class, IItem {
+
+    public ILookupParameter<T> EncodedSolutionParameter {
+      get { return (ILookupParameter<T>)Parameters["EncodedSolution"]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected PackingSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected PackingSolutionManipulator(PackingSolutionManipulator<T> original, Cloner cloner) : base(original, cloner) { }
+    public PackingSolutionManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<T>("EncodedSolution", "The bin packing solution to be manipulated."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/BinUtilizationEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/BinUtilizationEvaluator.cs	(revision 16100)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("Bin-Utilization Evaluator", "<Description missing> Found in Lee:2010")] // TODO
+  [StorableClass]
+  public abstract class BinUtilizationEvaluator<D, B, I> : EvaluatorBase<D, B, I>
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    [StorableConstructor]
+    protected BinUtilizationEvaluator(bool deserializing) : base(deserializing) { }
+    protected BinUtilizationEvaluator(BinUtilizationEvaluator<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public BinUtilizationEvaluator() : base() { }
+
+    protected override double Evaluate() {
+      DoubleValue quality = new DoubleValue(0);
+
+      IPackingPlan plan = PackingPlanParameter.ActualValue;
+      B binMeasure = PackingBinMeasuresParameter.ActualValue;
+      ItemList<I> itemMeasures = PackingItemMeasuresParameter.ActualValue;
+
+      // TODO: check and remove code
+
+      //Check if data is valid
+      //if (plan.PackingItemPositions.Count != itemMeasures.Count)
+      //  throw new Exception("ERROR: ItemMeasures.count does not match packingPosition.count");
+
+
+      ////Check if any items are overlapping or not contained in their bins
+      //bool itemPositionsAreValid = !HasOverlappingOrNotContainedItems(plan.PackingItemPositions, binMeasure, itemMeasures, nrOfBins);
+
+
+
+      //if (itemPositionsAreValid)
+      return CalculateBinUtilization(plan as PackingPlan<D, B, I>);
+
+      //return quality;
+    }
+
+    public static double CalculateBinUtilization(PackingPlan<D, B, I> plan) {
+      int nrOfBins = plan.NrOfBins;
+      double result = 0;
+
+      //for (int i = 0; i < nrOfBins; i++) {
+      //  double usableSpace = plan.GetPackingBinMeasuresForBinNr(i).MultipliedMeasures;
+      //  var indexes = plan.PackingItemPositions.Select((Value, Index) => new { Value, Index }).Where(s => s.Value.Value.AssignedBin == i).Select(s => s.Index);
+      //  var packedItemsInThisBin = plan.PackingItemMeasures.Select((Value, Index) => new { Value, Index }).Where(s => indexes.Contains(s.Index));
+      //  double usedSpaceInThisBin = packedItemsInThisBin.Select(s => s.Value.MultipliedMeasures).Sum();
+      //  result += (usedSpaceInThisBin / usableSpace);
+      //}
+
+      //result = result / nrOfBins;
+      //return new DoubleValue (result);
+
+      double totalUsedSpace = 0;
+      double totalUsableSpace = 0;
+
+      for (int i = 0; i < nrOfBins; i++) {
+        double usableSpace = plan.BinPackings[i].BinMeasures.Volume;
+        //var indexes = plan.PackingItemPositions.Select((Value, Index) => new { Value, Index }).Where(s => s.Value.Value.AssignedBin == i).Select(s => s.Index);
+        //var packedItemsInThisBin = plan.PackingItemMeasures.Select((Value, Index) => new { Value, Index }).Where(s => indexes.Contains(s.Index));
+        //double usedSpaceInThisBin = packedItemsInThisBin.Select(s => s.Value.MultipliedMeasures).Sum();
+        //result += (usedSpaceInThisBin / usableSpace);
+        totalUsableSpace += usableSpace;
+        //totalUsedSpace += usedSpaceInThisBin;
+        totalUsedSpace += plan.BinPackings[i].PackingDensity * usableSpace;
+      }
+
+      result = totalUsedSpace / totalUsableSpace;
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/PackingRatioEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Evaluators/PackingRatioEvaluator.cs	(revision 16100)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  public abstract class PackingRatioEvaluator<D, B, I> : EvaluatorBase<D, B, I>
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    [StorableConstructor]
+    protected PackingRatioEvaluator(bool deserializing) : base(deserializing) { }
+    protected PackingRatioEvaluator(PackingRatioEvaluator<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PackingRatioEvaluator() : base() { }
+
+    protected override double Evaluate() {
+      DoubleValue quality = new DoubleValue(0);
+
+      IPackingPlan plan = PackingPlanParameter.ActualValue;
+      B binMeasure = PackingBinMeasuresParameter.ActualValue;
+      ItemList<I> itemMeasures = PackingItemMeasuresParameter.ActualValue;
+
+
+      //Check if data is valid
+      //if (plan.PackingItemPositions.Count != itemMeasures.Count)
+      //  throw new Exception("ERROR: ItemMeasures.count does not match packingPosition.count");
+
+
+      ////Check if any items are overlapping or not contained in their bins
+      //bool itemPositionsAreValid = !HasOverlappingOrNotContainedItems(plan.PackingItemPositions, binMeasure, itemMeasures, nrOfBins);
+
+
+
+      //if (itemPositionsAreValid)
+      return CalculatePackingRatio(plan as PackingPlan<D, B, I>);
+
+      //return quality;
+    }
+
+    /* 
+        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(PackingPlan<D, B, I> plan) {
+      int nrOfBins = plan.NrOfBins;
+      double result = 0;
+
+      //C
+      //double usableSpace = binMeasure.MultipliedMeasures;
+      //nrOfBins = N
+      for (int i = 0; i < nrOfBins; i++) {
+        //C
+        //double usableSpace = plan.GetPackingBinMeasuresForBinNr(0).MultipliedMeasures;//plan.GetPackingBinMeasuresForBinNr(i).MultipliedMeasures;
+        //var indexes = plan.PackingItemPositions.Select((Value, Index) => new { Value, Index }).Where(s => s.Value.Value.AssignedBin == i).Select(s => s.Index);
+        //var packedItemsInThisBin = plan.PackingItemMeasures.Select((Value, Index) => new { Value, Index }).Where(s => indexes.Contains(s.Index));
+        //Fi
+        //double usedSpaceInThisBin = packedItemsInThisBin.Select(s => s.Value.MultipliedMeasures).Sum();
+        //k = 2 --> (Fi/C)*(Fi/C)
+        //result += (((usedSpaceInThisBin) / (usableSpace)) * ((usedSpaceInThisBin) / (usableSpace))) / (i*i + 1);
+        var pd = plan.BinPackings[i].PackingDensity;
+        result += (pd * pd) / (i + 1);
+      }
+
+      result = result / nrOfBins;
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/HeuristicLab.Problems.BinPacking-3.3.csproj	(revision 16100)
@@ -0,0 +1,211 @@
+﻿<?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="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <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="Encodings\PackingPlans\BinPacking.cs" />
+    <Compile Include="Encodings\PackingPlans\PackingPlan.cs" />
+    <Compile Include="Interfaces\IDecodingEvaluator.cs" />
+    <Compile Include="Interfaces\IPackingPosition.cs" />
+    <Compile Include="Interfaces\IPackingSequenceMoveOperator.cs" />
+    <Compile Include="Interfaces\IPackingMove.cs" />
+    <Compile Include="Interfaces\IMultiComponentVectorMoveOperator.cs" />
+    <Compile Include="Interfaces\IGroupingVectorMoveOperator.cs" />
+    <Compile Include="Interfaces\IMultiComponentVectorOperator.cs" />
+    <Compile Include="Interfaces\IGroupingVectorOperator.cs" />
+    <Compile Include="Interfaces\IPackingMoveEvaluator.cs" />
+    <Compile Include="Interfaces\IPackingOperator.cs" />
+    <Compile Include="Interfaces\IPackingSolutionManipulator.cs" />
+    <Compile Include="Interfaces\IPackingSequenceOperator.cs" />
+    <Compile Include="Interfaces\IPackingSolutionCrossover.cs" />
+    <Compile Include="Interfaces\IPackingSolutionEncoding.cs" />
+    <Compile Include="Interfaces\IPackingSolutionCreator.cs" />
+    <Compile Include="Interfaces\IPackingSolutionDecoder.cs" />
+    <Compile Include="Interfaces\IPackingShape.cs" />
+    <Compile Include="PackingDimensions.cs" />
+    <Compile Include="Interfaces\IPackingItem.cs" />
+    <Compile Include="PackingShape.cs" />
+    <Compile Include="PackingSolutionDecoder.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>
+    <Folder Include="Evaluators\" />
+  </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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IDecodingEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IDecodingEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IDecodingEvaluator.cs	(revision 16100)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IDecodingEvaluator : ISingleObjectiveEvaluator {
+    ILookupParameter<IPackingSolutionDecoder> PackingSolutionDecoderParameter { get; }
+    ILookupParameter<IEvaluator> PackingPlanEvaluatorParameter { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IEvaluator.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IEvaluator : IItem {
+     double Evaluate(Solution )
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorMoveOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorMoveOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorMoveOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IGroupingVectorMoveOperator : IGroupingVectorOperator, IMoveOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IGroupingVectorOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IGroupingVectorOperator : IOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorMoveOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorMoveOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorMoveOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IMultiComponentVectorMoveOperator : IMultiComponentVectorOperator, IMoveOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IMultiComponentVectorOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IMultiComponentVectorOperator : IOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingItem.cs	(revision 16100)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMove.cs	(revision 16100)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking  {
+  public interface IPackingMove<out T> : IItem {
+    T GetSolutionAfterMove();
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingMoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking  {
+  public interface IPackingMoveEvaluator : ISingleObjectiveMoveEvaluator, IMoveOperator, IPackingOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingOperator : IOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPlan.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPlan.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPlan.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  // represents a packing solution (either 2d or 3d)
+  public interface IPackingPlan : IItem {
+    int NrOfBins { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingPosition.cs	(revision 16100)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  
+  public interface IPackingPosition : IItem {
+    int AssignedBin { get; }
+    bool Rotated { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceMoveOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceMoveOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceMoveOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSequenceMoveOperator : IPackingSequenceOperator, IMoveOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceOperator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceOperator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSequenceOperator.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSequenceOperator : IOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingShape.cs	(revision 16100)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCreator.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSolutionCreator : ISolutionCreator {
+    ILookupParameter<IItem> EncodedSolutionParameter { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionCrossover.cs	(revision 16100)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSolutionCrossover<T> : ICrossover, IPackingOperator
+  where T : class, IItem {
+    ILookupParameter<T> ChildParameter { get; }
+    IScopeTreeLookupParameter<T> ParentsParameter { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionDecoder.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSolutionDecoder : IOperator {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionEncoding.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionEncoding.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionEncoding.cs	(revision 16100)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSolutionEncoding : IItem {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Interfaces/IPackingSolutionManipulator.cs	(revision 16100)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.BinPacking {
+  public interface IPackingSolutionManipulator<T> : IManipulator, IPackingOperator
+  where T : class, IItem {
+    ILookupParameter<T> EncodedSolutionParameter { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingDimensions.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingDimensions.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingDimensions.cs	(revision 16100)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("Packing Dimensions", "Represents an abstract packing-position associated with a packing-problem.")]
+  [StorableClass]
+  // PackingDimensions 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: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingMoveEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingMoveEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingMoveEvaluator.cs	(revision 16100)
@@ -0,0 +1,108 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("PackingMoveEvaluator", "A base class for operators which evaluate Packing-Solution moves.")]
+  [StorableClass]
+  public abstract class PackingMoveEvaluator<D, B, I, M> : SingleSuccessorOperator, IPackingMoveEvaluator
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem 
+    where M : IItem {     
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<ItemList<I>> PackingItemMeasuresParameter {
+      get { return (LookupParameter<ItemList<I>>)Parameters["PackingItemMeasures"]; }
+    }
+    public ILookupParameter<B> PackingBinMeasuresParameter {
+      get { return (LookupParameter<B>)Parameters["PackingBinMeasures"]; }
+    }
+    public IValueLookupParameter<IPackingSolutionDecoder> PackingSolutionDecoderParameter {
+      get { return (IValueLookupParameter<IPackingSolutionDecoder>)Parameters["PackingSolutionDecoder"]; }
+    }
+    public IValueLookupParameter<IEvaluator> PackingPlanEvaluatorParameter {
+      get { return (IValueLookupParameter<IEvaluator>)Parameters["PackingPlanEvaluator"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public ILookupParameter<IPackingMove<M>> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove<M>>)Parameters["PackingMove"]; }
+    }  
+    
+    [StorableConstructor]
+    protected PackingMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected PackingMoveEvaluator(PackingMoveEvaluator<D, B, I, M> original, Cloner cloner) : base(original, cloner) { }
+    protected PackingMoveEvaluator()
+      : base() {
+      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<ItemList<I>>("PackingItemMeasures", "Packing-item data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<B>("PackingBinMeasures", "Packing-bin data taken from the bin-packing problem-instance."));
+      Parameters.Add(new ValueLookupParameter<IPackingSolutionDecoder>("PackingSolutionDecoder", "The decoding operator that is used to calculate a packing plan from the used representation."));
+      Parameters.Add(new ValueLookupParameter<IEvaluator>("PackingPlanEvaluator", "The actual packing plan evaluation operator."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the decoded solution should be added to."));
+      Parameters.Add(new LookupParameter<IPackingMove<M>>("PackingMove", "The move to evaluate."));
+    }
+
+
+
+    public override IOperation Apply() {
+      IPackingMove<M> move = PackingMoveParameter.ActualValue;
+      var newSolution = move.GetSolutionAfterMove();
+      CurrentScopeParameter.ActualValue.Variables.Add(new Variable("MovedSolution", newSolution));
+
+      PackingPlan<D, B, I> packingPlan = (PackingSolutionDecoderParameter.ActualValue as PackingSolutionDecoder<D, B, I>).
+        CreatePackingPlanFromEncoding(newSolution, PackingBinMeasuresParameter.ActualValue, PackingItemMeasuresParameter.ActualValue);
+
+
+      CurrentScopeParameter.ActualValue.Variables.Add(new Variable("PackingPlanAfterMove", packingPlan));
+
+      var quality = PackingRatioEvaluator<D, B, I>.CalculatePackingRatio(packingPlan);
+
+      double moveQuality = quality;
+
+      if (MoveQualityParameter.ActualValue == null) MoveQualityParameter.ActualValue = new DoubleValue(moveQuality);
+      else MoveQualityParameter.ActualValue.Value = moveQuality;
+      return base.Apply();
+    }
+
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSequenceProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSequenceProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSequenceProblem.cs	(revision 16100)
@@ -0,0 +1,80 @@
+﻿#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.CodeDom;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  public abstract class PackingSequenceProblem<TSolution, TEncoding> : SingleObjectiveBasicProblem<TEncoding>
+    where TSolution : class, IItem
+    where TEncoding : class, IEncoding {
+
+    // persistence
+    [StorableConstructor]
+    protected PackingSequenceProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+
+    // cloning
+    protected PackingSequenceProblem(PackingSequenceProblem<TSolution, TEncoding> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected PackingSequenceProblem() : base() { }
+
+    public virtual bool IsBetter(double quality, double bestQuality) {
+      return (Maximization && quality > bestQuality || !Maximization && quality < bestQuality);
+    }
+
+    public virtual void Analyze(TSolution[] solutions, double[] qualities, ResultCollection results,
+      IRandom random) {
+      if (!results.ContainsKey("Best Solution Quality")) {
+        results.Add(new Result("Best Solution Quality", typeof(DoubleValue)));
+      }
+      if (!results.ContainsKey("Best Solution")) {
+        results.Add(new Result("Best Solution", typeof(TSolution)));
+      }
+
+      var bestQuality = Maximization ? qualities.Max() : qualities.Min();
+
+      if (results["Best Solution Quality"].Value == null ||
+          IsBetter(bestQuality, ((DoubleValue)results["Best Solution Quality"].Value).Value)) {
+        var bestIdx = Array.IndexOf(qualities, bestQuality);
+        var bestClone = (IItem)solutions[bestIdx].Clone();
+        results["Best Solution"].Value = bestClone;
+        results["Best Solution Quality"].Value = new DoubleValue(bestQuality);
+      }
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingShape.cs	(revision 16100)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+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);
+
+    public IKeyedItemCollection<string, IParameter> Parameters { get; private set; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSolutionDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSolutionDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/PackingSolutionDecoder.cs	(revision 16100)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.BinPacking {
+
+  [Item("Packing-Solution Decoder", "An operator to create a concrete bin packing solution from a given encoding-instance.")]
+  [StorableClass]
+  public abstract class PackingSolutionDecoder<D, B, I> : SingleSuccessorOperator, IPackingSolutionDecoder
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    private ILookupParameter<ItemList<I>> PackingItemMeasuresParameter {
+      get { return (LookupParameter<ItemList<I>>)Parameters["PackingItemMeasures"]; }
+    }
+    private ILookupParameter<B> PackingBinMeasuresParameter {
+      get { return (LookupParameter<B>)Parameters["PackingBinMeasures"]; }
+    }
+    public ILookupParameter<IItem> EncodedSolutionParameter {
+      get { return (ILookupParameter<IItem>)Parameters["EncodedSolution"]; }
+    }
+    public ILookupParameter<PackingPlan<D, B, I>> PackingPlanParameter {
+      get { return (ILookupParameter<PackingPlan<D, B, I>>)Parameters["PackingPlan"]; }
+    }
+    public ValueParameter<BoolValue> StackingConstraintsParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StackingConstraint"]; }
+    }
+
+
+    public PackingSolutionDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IItem>("EncodedSolution", "The new bin-packing solution represented as encoding."));
+      Parameters.Add(new LookupParameter<PackingPlan<D, B, I>>("PackingPlan", "The decoded bin-packing solution represented as generalized packing plan."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<I>>("PackingItemMeasures", "Packing-item data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<B>("PackingBinMeasures", "Packing-bin data taken from the bin-packing problem-instance."));
+      Parameters.Add(new ValueParameter<BoolValue>("StackingConstraint", "A flag determining whether stacking constraints should be enforced or not.", new BoolValue(true)));
+    }
+
+    [StorableConstructor]
+    protected PackingSolutionDecoder(bool deserializing) : base(deserializing) { }
+    protected PackingSolutionDecoder(PackingSolutionDecoder<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public abstract PackingPlan<D, B, I> CreatePackingPlanFromEncoding(IItem solution, B binMeasures, ItemList<I> itemMeasures);
+
+    public override IOperation Apply() {
+      PackingPlan<D, B, I> result = CreatePackingPlanFromEncoding(EncodedSolutionParameter.ActualValue, PackingBinMeasuresParameter.ActualValue, PackingItemMeasuresParameter.ActualValue);
+      PackingPlanParameter.ActualValue = result;
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Plugin.cs.frame	(revision 16100)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsBinPackingPlugin : PluginBase {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Properties/AssemblyInfo.cs.frame	(revision 16100)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+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-2015 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: /branches/1966_HeuristicLab.BinPacking/PreBuildEvent.cmd
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/PreBuildEvent.cmd	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/PreBuildEvent.cmd	(revision 16100)
@@ -0,0 +1,2 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
Index: /branches/1966_HeuristicLab.BinPacking/old files/CuboidPackingBin.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/CuboidPackingBin.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/CuboidPackingBin.cs	(revision 16100)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Problems.BinPacking.Shapes;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+
+namespace HeuristicLab.Problems.BinPacking.PackingBin {
+  [Item("CuboidPackingBin", "Represents a cuboidic container for a three dimensional bin-packing problem.")]
+  [StorableClass]
+  public class CuboidPackingBin : CuboidPackingShape, IPackingBin {
+    public CuboidPackingBin(int width, int height, int depth) : base(width, height, depth) { }
+
+    [StorableConstructor]
+    protected CuboidPackingBin(bool deserializing) : base(deserializing) { }
+    protected CuboidPackingBin(CuboidPackingBin original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CuboidPackingBin(this, cloner);
+    }
+    public CuboidPackingBin()
+      : base() {
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DGVDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DGVDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DGVDecoder.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface I3DGVDecoder : IOperator, IPackingSolutionDecoder {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DMCVDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DMCVDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DMCVDecoder.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface I3DMCVDecoder : IOperator, IPackingSolutionDecoder {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DPSDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DPSDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/DecoderInterfaces/I3DPSDecoder.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  public interface I3DPSDecoder : IOperator, IPackingSolutionDecoder {
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftGroupingVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftGroupingVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftGroupingVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, GroupingVector-decoder", "<Description missing...>")]
+  [StorableClass]
+  public class DeepestBottomLeftGroupingVectorDecoder : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DGVDecoder {
+    public DeepestBottomLeftGroupingVectorDecoder() : base() {}
+    [StorableConstructor]
+    protected DeepestBottomLeftGroupingVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected DeepestBottomLeftGroupingVectorDecoder(DeepestBottomLeftGroupingVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeepestBottomLeftGroupingVectorDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as GroupingVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type GroupingVector");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftMultiComponentVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftMultiComponentVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftMultiComponentVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, MultiComponentVector-decoder", "<Description missing...>")]
+  [StorableClass]
+  public class DeepestBottomLeftMultiComponentVectorDecoder : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DMCVDecoder {
+    public DeepestBottomLeftMultiComponentVectorDecoder() : base() { }
+    [StorableConstructor]
+    protected DeepestBottomLeftMultiComponentVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected DeepestBottomLeftMultiComponentVectorDecoder(DeepestBottomLeftMultiComponentVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeepestBottomLeftMultiComponentVectorDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponent Vector");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftPackingSequenceDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftPackingSequenceDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/DBL/DeepestBottomLeftPackingSequenceDecoder.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, PackingSequence-decoder", "<Description missing...>")]
+  [StorableClass]
+  public class DeepestBottomLeftPackingSequenceDecoder : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DPSDecoder {
+    public DeepestBottomLeftPackingSequenceDecoder() : base() { }
+    [StorableConstructor]
+    protected DeepestBottomLeftPackingSequenceDecoder(bool deserializing) : base(deserializing) { }
+    protected DeepestBottomLeftPackingSequenceDecoder(DeepestBottomLeftPackingSequenceDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeepestBottomLeftPackingSequenceDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as Permutation;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type Permutation");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointGroupingVectorDecoder3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointGroupingVectorDecoder3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointGroupingVectorDecoder3D.cs	(revision 16100)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, extreme points based decoder for the GroupingVector encoding.", "<Description missing...>")]
+  [StorableClass]
+  public class ExtremePointGroupingVectorDecoder3D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DGVDecoder {
+    public ExtremePointGroupingVectorDecoder3D() : base() { }
+    [StorableConstructor]
+    protected ExtremePointGroupingVectorDecoder3D(bool deserializing) : base(deserializing) { }
+    protected ExtremePointGroupingVectorDecoder3D(ExtremePointGroupingVectorDecoder3D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointGroupingVectorDecoder3D(this, cloner);
+    }
+
+    public static PackingPlan<PackingPosition, PackingShape, PackingItem> Decode(GroupingVectorEncoding solution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures, bool stackingConstraints) {
+      Solution result = new Solution(binMeasures, true, stackingConstraints);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as GroupingVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type GroupingVector");
+      return Decode(solution, binMeasures, itemMeasures, StackingConstraintsParameter.Value.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointMultiComponentVectorDecoder3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointMultiComponentVectorDecoder3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointMultiComponentVectorDecoder3D.cs	(revision 16100)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, extreme points based decoder for the MultiComponentVector encoding.", "<Description missing...>")]
+  [StorableClass]
+  public class ExtremePointMultiComponentVectorDecoder3D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DMCVDecoder {
+    public ExtremePointMultiComponentVectorDecoder3D () : base() { }
+    [StorableConstructor]
+    protected ExtremePointMultiComponentVectorDecoder3D (bool deserializing) : base(deserializing) { }
+    protected ExtremePointMultiComponentVectorDecoder3D(ExtremePointMultiComponentVectorDecoder3D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointMultiComponentVectorDecoder3D(this, cloner);
+    }
+
+    public static PackingPlan<PackingPosition, PackingShape, PackingItem> Decode(MultiComponentVectorEncoding solution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures, bool stackingConstraints) {
+      Solution result = new Solution(binMeasures, true, stackingConstraints);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector");
+      return Decode(solution, binMeasures, itemMeasures, StackingConstraintsParameter.Value.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointPackingSequenceDecoder3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointPackingSequenceDecoder3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders/EP/ExtremePointPackingSequenceDecoder3D.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Identical bin, three dimensional, extreme points based decoder for the PackingSequence encoding.", "<Description missing...>")]
+  [StorableClass]
+  public class ExtremePointPackingSequenceDecoder3D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I3DPSDecoder {
+    public ExtremePointPackingSequenceDecoder3D () : base() {}
+    [StorableConstructor]
+    protected ExtremePointPackingSequenceDecoder3D (bool deserializing) : base(deserializing) { }
+    protected ExtremePointPackingSequenceDecoder3D(ExtremePointPackingSequenceDecoder3D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointPackingSequenceDecoder3D(this, cloner);
+    }
+
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as Permutation;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type Permutation");
+      Solution result = new Solution(binMeasures, true, StackingConstraintsParameter.Value.Value);
+      result.Pack(solution, itemMeasures); 
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftGroupingVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftGroupingVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftGroupingVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin two dimensional grouping vector decoder", "<Description missing...>")]
+  [StorableClass]
+  public class BottomLeftGroupingVectorDecoder : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I2DGVDecoder {
+    public BottomLeftGroupingVectorDecoder() : base() {}
+    [StorableConstructor]
+    protected BottomLeftGroupingVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftGroupingVectorDecoder(BottomLeftGroupingVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftGroupingVectorDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as GroupingVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type GroupingVector");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftMultiComponentVectorDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftMultiComponentVectorDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftMultiComponentVectorDecoder.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin two dimensional multi component vector decoder", "<Description missing...>")]
+  [StorableClass]
+  public class BottomLeftMultiComponentVectorDecoder : PackingSolutionDecoder<PackingPosition,PackingShape, PackingItem>, I2DMCVDecoder {
+    public BottomLeftMultiComponentVectorDecoder() : base() {}
+    [StorableConstructor]
+    protected BottomLeftMultiComponentVectorDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftMultiComponentVectorDecoder(BottomLeftMultiComponentVectorDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftMultiComponentVectorDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponent Vector");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftPackingSequenceDecoder.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftPackingSequenceDecoder.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/BL/BottomLeftPackingSequenceDecoder.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin, two dimensional, direct permutation decoder", "<Description missing...>")]
+  [StorableClass]
+  public class BottomLeftPackingSequenceDecoder : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I2DPSDecoder {
+
+    public BottomLeftPackingSequenceDecoder(): base() { }
+    [StorableConstructor]
+    protected BottomLeftPackingSequenceDecoder(bool deserializing) : base(deserializing) { }
+    protected BottomLeftPackingSequenceDecoder(BottomLeftPackingSequenceDecoder original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BottomLeftPackingSequenceDecoder(this, cloner);
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as Permutation;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type PackingSequence");
+      Solution result = new Solution(binMeasures);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointGroupingVectorDecoder2D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointGroupingVectorDecoder2D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointGroupingVectorDecoder2D.cs	(revision 16100)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin, two dimensional, extreme points based decoder for the GroupingVector encoding.", "<Description missing...>")]
+  [StorableClass]
+  public class ExtremePointGroupingVectorDecoder2D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I2DGVDecoder {
+    public ExtremePointGroupingVectorDecoder2D () : base() {}
+    [StorableConstructor]
+    protected ExtremePointGroupingVectorDecoder2D (bool deserializing) : base(deserializing) { }
+    protected ExtremePointGroupingVectorDecoder2D(ExtremePointGroupingVectorDecoder2D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointGroupingVectorDecoder2D(this, cloner);
+    }
+
+    public static PackingPlan<PackingPosition, PackingShape, PackingItem> Decode(GroupingVectorEncoding solution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      Solution result = new Solution(binMeasures, true, false);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as GroupingVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type GroupingVector");
+      return Decode(solution, binMeasures, itemMeasures);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointMultiComponentVectorDecoder2D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointMultiComponentVectorDecoder2D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointMultiComponentVectorDecoder2D.cs	(revision 16100)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin, two dimensional, extreme points based decoder for the MultiComponentVector encoding.", "<Description missing...>")] // TODO
+  [StorableClass]
+  public class ExtremePointMultiComponentVectorDecoder2D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I2DMCVDecoder {
+    public ExtremePointMultiComponentVectorDecoder2D () : base() {}
+    [StorableConstructor]
+    protected ExtremePointMultiComponentVectorDecoder2D (bool deserializing) : base(deserializing) { }
+    protected ExtremePointMultiComponentVectorDecoder2D(ExtremePointMultiComponentVectorDecoder2D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointMultiComponentVectorDecoder2D(this, cloner);
+    }
+
+    public static PackingPlan<PackingPosition, PackingShape, PackingItem> Decode(MultiComponentVectorEncoding solution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      Solution result = new Solution(binMeasures, true, false);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector");
+      return Decode(solution, binMeasures, itemMeasures);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointPackingSequenceDecoder2D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointPackingSequenceDecoder2D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Decoders2d/EP/ExtremePointPackingSequenceDecoder2D.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking;
+using HeuristicLab.Encodings.PackingEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Identical bin, two dimensional, extreme points based decoder for the PackingSequence encoding.", "<Description missing...>")] // TODO
+  [StorableClass]
+  public class ExtremePointPackingSequenceDecoder2D : PackingSolutionDecoder<PackingPosition, PackingShape, PackingItem>, I2DPSDecoder {
+    public ExtremePointPackingSequenceDecoder2D () : base() {}
+    [StorableConstructor]
+    protected ExtremePointPackingSequenceDecoder2D (bool deserializing) : base(deserializing) { }
+    protected ExtremePointPackingSequenceDecoder2D(ExtremePointPackingSequenceDecoder2D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtremePointPackingSequenceDecoder2D(this, cloner);
+    }
+
+
+    public override PackingPlan<PackingPosition, PackingShape, PackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, PackingShape binMeasures, ItemList<PackingItem> itemMeasures) {
+      var solution = encodedSolution as Permutation;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type Permutation");
+      Solution result = new Solution(binMeasures, true, false);
+      result.Pack(solution, itemMeasures);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorCrossover.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Crossover", "An operator which crosses two GroupingVector representations.")]
+  [StorableClass]
+  public abstract class GroupingVectorCrossover : PackingSolutionCrossover, IGroupingVectorOperator {
+
+    [StorableConstructor]
+    protected GroupingVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected GroupingVectorCrossover(GroupingVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorCrossover()
+      : base() {
+        ParentsParameter.ActualName = "GroupingVector";
+        ChildParameter.ActualName = "GroupingVector";
+    }
+
+    public abstract GroupingVectorEncoding Cross(IRandom random, GroupingVectorEncoding parent1, GroupingVectorEncoding parent2);
+
+    public override IOperation Apply() {
+      var parents = ParentsParameter.ActualValue;
+
+      ChildParameter.ActualValue =
+        Cross(RandomParameter.ActualValue, parents[0] as GroupingVectorEncoding, parents[1] as GroupingVectorEncoding);
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorDiscreteCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorDiscreteCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorDiscreteCrossover.cs	(revision 16100)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Discrete Crossover", "An operator which crosses two GroupingVector representations.")]
+  [StorableClass]
+  public class GroupingVectorDiscreteCrossover : GroupingVectorCrossover, IGroupingVectorOperator {
+
+    [StorableConstructor]
+    protected GroupingVectorDiscreteCrossover (bool deserializing) : base(deserializing) { }
+    protected GroupingVectorDiscreteCrossover(GroupingVectorDiscreteCrossover original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorDiscreteCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingVectorDiscreteCrossover(this, cloner);
+    }
+
+    public override GroupingVectorEncoding Cross(IRandom random, GroupingVectorEncoding parent1, GroupingVectorEncoding parent2) {
+      GroupingVectorEncoding result = new GroupingVectorEncoding();
+      result.GroupingVector = DiscreteCrossover.Apply(
+        random, new ItemArray<IntegerVector> (new IntegerVector[]{parent1.GroupingVector, parent2.GroupingVector}));
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorEncoding.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorEncoding.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorEncoding.cs	(revision 16100)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Encoding", "Represents an encoding for a bin packing problem using an array of group-assignments for every packing-item.")]
+  [StorableClass]
+  public class GroupingVectorEncoding : Item, IPackingSolutionEncoding {
+
+    [Storable]
+    public IntegerVector GroupingVector { get; set; }
+
+    [StorableConstructor]
+    protected GroupingVectorEncoding(bool deserializing) : base(deserializing) { }
+    protected GroupingVectorEncoding(GroupingVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+        this.GroupingVector = cloner.Clone(original.GroupingVector);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingVectorEncoding(this, cloner);
+    }
+
+    public GroupingVectorEncoding()
+      : base() {
+        GroupingVector = new IntegerVector();
+    }
+
+    public List<List<int>> GenerateSequenceMatrix() {
+      List<List<int>> result = new List<List<int>>();
+      int nrOfBins = GroupingVector.Max() + 1;
+      for (int i = 0; i < nrOfBins; i++)
+        result.Add(new List<int>());
+      for (int i = 0; i < GroupingVector.Length; i++) {
+        result[GroupingVector[i]].Add(i);
+      }
+      return result;
+    }
+    
+
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("[ ");
+      sb.Append(GroupingVector.ToString());         
+      sb.Append("]");
+      return sb.ToString();
+    }
+
+
+    public override bool Equals(object obj) {
+      if (obj.GetType() == typeof(GroupingVectorEncoding))
+        return AreEqual(this, obj as GroupingVectorEncoding);
+
+      return false;
+    }
+    public override int GetHashCode() {
+      return GroupingVector.GetHashCode();
+    }
+    private static bool AreEqual(GroupingVectorEncoding groupingVectorEncoding1, GroupingVectorEncoding groupingVectorEncoding2) {
+      return AreEqual(groupingVectorEncoding1.GroupingVector, groupingVectorEncoding2.GroupingVector);
+    }
+
+    private static bool AreEqual(IntArray v1, IntArray v2) {
+      if (v1.Length != v2.Length)
+        return false;
+      for (int i = 0; i < v1.Length; i++) {
+        if (v1[i] != v2[i])
+          return false;
+      }
+      return true;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorManipulator.cs	(revision 16100)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public abstract class GroupingVectorManipulator : PackingSolutionManipulator, IGroupingVectorOperator {
+    [StorableConstructor]
+    protected GroupingVectorManipulator(bool deserializing) : base(deserializing) { }
+    protected GroupingVectorManipulator(GroupingVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorManipulator()
+      : base() {
+        EncodedSolutionParameter.ActualName = "GroupingVector";
+    }
+
+    protected abstract void Manipulate(IRandom random, GroupingVectorEncoding individual);
+    public override IOperation Apply() {
+      var solution = EncodedSolutionParameter.ActualValue as GroupingVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("PackingSolutionEncoding was not found or is not of type GroupingVectorEncoding.");
+      Manipulate(RandomParameter.ActualValue, solution);
+      return base.Apply();
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorOnePositionManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorOnePositionManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorOnePositionManipulator.cs	(revision 16100)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector One Position Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class GroupingVectorOnePositionManipulator :  GroupingVectorManipulator {
+    [StorableConstructor]
+    protected GroupingVectorOnePositionManipulator(bool deserializing) : base(deserializing) { }
+    protected GroupingVectorOnePositionManipulator(GroupingVectorOnePositionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorOnePositionManipulator()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingVectorOnePositionManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, GroupingVectorEncoding individual) {
+      int max = 0;
+      foreach (int i in individual.GroupingVector)
+        if (i > max) max = i;
+
+      int index = random.Next(individual.GroupingVector.Length);
+      individual.GroupingVector[index] = random.Next(max);
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorRandomCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorRandomCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorRandomCreator.cs	(revision 16100)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+	[Item("Grouping Vector Creator", "Creator class used to create GroupingVector solutions for bin packing problems.")]
+	[StorableClass]
+	public class GroupingVectorRandomCreator : PackingSolutionCreator, IStochasticOperator {
+
+		public ILookupParameter<IRandom> RandomParameter {
+			get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+		}
+		public IValueLookupParameter<IntValue> PackingItemsParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["PackingItems"]; }
+		}
+		public IValueLookupParameter<IntValue> LowerBoundParameter {
+			get { return (IValueLookupParameter<IntValue>)Parameters["LowerBound"]; }
+		}
+
+		[StorableConstructor]
+		protected GroupingVectorRandomCreator(bool deserializing) : base(deserializing) { }
+		protected GroupingVectorRandomCreator(GroupingVectorRandomCreator original, Cloner cloner) : base(original, cloner) {
+		}
+		public override IDeepCloneable Clone(Cloner cloner) {
+			return new GroupingVectorRandomCreator(this, cloner);
+		}
+
+		public GroupingVectorRandomCreator()
+			: base() {
+			Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("PackingItems", "The number of packing-items handled in this problem instance."));
+			Parameters.Add(new ValueLookupParameter<IntValue>("LowerBound", "The lower possible number of bins needed to solve this problem (taken from Dell'Amico, Martello and Vigo; 2002)"));
+
+			EncodedSolutionParameter.ActualName = "GroupingVector";
+		}
+
+
+		public static GroupingVectorEncoding Apply(int items, int lowerBound, IRandom random) {
+			var solution = new GroupingVectorEncoding();
+      solution.GroupingVector = new IntegerVector(items, random, 0, lowerBound + 1);
+			return solution;
+		}
+
+		protected override IItem CreateSolution() {
+			return Apply(PackingItemsParameter.ActualValue.Value, LowerBoundParameter.ActualValue.Value, RandomParameter.ActualValue);
+		}
+	}
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSinglePointCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSinglePointCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSinglePointCrossover.cs	(revision 16100)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Single Point Crossover", "An operator which crosses two GroupingVector representations.")]
+  [StorableClass]
+  public class GroupingVectorSinglePointCrossover : GroupingVectorCrossover, IGroupingVectorOperator {
+
+    [StorableConstructor]
+    protected GroupingVectorSinglePointCrossover (bool deserializing) : base(deserializing) { }
+    protected GroupingVectorSinglePointCrossover(GroupingVectorSinglePointCrossover original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorSinglePointCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingVectorSinglePointCrossover(this, cloner);
+    }
+
+    public override GroupingVectorEncoding Cross(IRandom random, GroupingVectorEncoding parent1, GroupingVectorEncoding parent2) {
+      GroupingVectorEncoding result = new GroupingVectorEncoding();
+      result.GroupingVector = SinglePointCrossover.Apply(random, parent1.GroupingVector, parent2.GroupingVector);
+      return result;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSwap2Manipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSwap2Manipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/GroupingVectorSwap2Manipulator.cs	(revision 16100)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Vector Swap2 Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class GroupingVectorSwap2Manipulator :  GroupingVectorManipulator {
+    [StorableConstructor]
+    protected GroupingVectorSwap2Manipulator (bool deserializing) : base(deserializing) { }
+    protected GroupingVectorSwap2Manipulator(GroupingVectorSwap2Manipulator original, Cloner cloner) : base(original, cloner) { }
+    public GroupingVectorSwap2Manipulator()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingVectorSwap2Manipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, GroupingVectorEncoding individual) {
+
+      int index1 = 0;
+      int index2 = 1;
+
+      if (individual.GroupingVector.Length <= 1)
+        return;
+      else if (individual.GroupingVector.Length != 2) {
+        index1 = random.Next(individual.GroupingVector.Length);
+        index2 = random.Next(individual.GroupingVector.Length);
+        while (index2.Equals(index1)) {
+          index2 = random.Next(individual.GroupingVector.Length);
+        }
+      }
+
+      int temp = individual.GroupingVector [index1];
+      individual.GroupingVector[index1] = individual.GroupingVector[index2];
+      individual.GroupingVector[index2] = temp;
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMove.cs	(revision 16100)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Change Grouping Move", "A move on a grouping vector that is specified by a single group-assignment-index.")]
+  [StorableClass]
+  public class ChangeGroupingMove : GroupingMove, IPackingMove {
+    [Storable]
+    public int Index { get; protected set; }
+    [Storable]
+    public int NewGroup { get; protected set; }
+
+    [StorableConstructor]
+    protected ChangeGroupingMove(bool deserializing) : base(deserializing) { }
+    protected ChangeGroupingMove(ChangeGroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index = original.Index;
+      this.NewGroup = original.NewGroup;
+    }
+    public ChangeGroupingMove(int index, int newGroup, GroupingVectorEncoding groupingVector)
+      : base(groupingVector) {
+      Index = index;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChangeGroupingMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      GroupingVectorEncoding newSolution = new GroupingVectorEncoding();
+      newSolution.GroupingVector = new IntegerVector(GroupingVector.GroupingVector);
+      newSolution.GroupingVector[Index] = NewGroup;
+      return newSolution;
+    }
+
+    public override Type GetMoveAttributeType() {
+      return typeof(ChangeGroupingMoveAttribute);
+    }
+
+    public override GroupingMoveAttribute GetAttribute(double quality) {
+      return new ChangeGroupingMoveAttribute(Index, NewGroup, quality);
+    }
+
+    public override bool BelongsToAttribute(GroupingMoveAttribute attribute, bool hardCriterion) {
+      var attr = attribute as ChangeGroupingMoveAttribute;
+      if (attr != null) {
+        if (hardCriterion) {
+          if (Index == attr.ItemIndex) //|| GroupingVector.GroupingVector[Index] == attr.AssignedBin)
+            return true;
+        } else
+          if (Index == attr.ItemIndex && GroupingVector.GroupingVector[Index] == attr.AssignedBin)
+            return true;
+      }
+      return false;
+    }
+
+    public override string ToString() {
+      return "CGM(i=" + Index + ", g=" + NewGroup + ")";
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("ChangeGroupingMoveAttribute", "Specifies the tabu attributes for a ChangeGrouping move on a grouping vector.")]
+  [StorableClass]
+  public class ChangeGroupingMoveAttribute : GroupingMoveAttribute {
+    [Storable]
+    public int ItemIndex { get; protected set; }
+    [Storable]
+    public int AssignedBin { get; protected set; }
+
+    [StorableConstructor]
+    protected ChangeGroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected ChangeGroupingMoveAttribute(ChangeGroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex = original.ItemIndex;
+      this.AssignedBin = original.AssignedBin;
+    }
+    public ChangeGroupingMoveAttribute() : this(-1, -1, -1) { }
+    public ChangeGroupingMoveAttribute(int itemIndex, int assignedBin, double moveQuality)
+      : base(moveQuality) {
+      ItemIndex = itemIndex;
+      AssignedBin = assignedBin;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChangeGroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ChangeGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Change Grouping Move Generator", "Base class for all ChangeGrouping move generators.")]
+  [StorableClass]
+  public abstract class ChangeGroupingMoveGenerator : SingleSuccessorOperator, IGroupingVectorMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected ChangeGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ChangeGroupingMoveGenerator(ChangeGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ChangeGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The grouping vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      GroupingVectorEncoding gv = GroupingVectorParameter.ActualValue;
+      ChangeGroupingMove[] moves = GenerateMoves(gv);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract ChangeGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ExhaustiveChangeGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ExhaustiveChangeGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/ExhaustiveChangeGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Exhaustive Change Grouping Move Generator", "Generates all possible ChangeGrouping moves from a given groupingVector.")]
+  [StorableClass]
+  public class ExhaustiveChangeGroupingMoveGenerator : ChangeGroupingMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveChangeGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveChangeGroupingMoveGenerator(ExhaustiveChangeGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveChangeGroupingMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveChangeGroupingMoveGenerator(this, cloner);
+    }
+
+    public static IEnumerable<ChangeGroupingMove> Generate(GroupingVectorEncoding groupingVector, int nrOfBins) {
+      for (int i = 0; i < groupingVector.GroupingVector.Length; i++)
+        for (int j = 0; j < nrOfBins; j++) {
+          if (j != groupingVector.GroupingVector[i])
+            yield return new ChangeGroupingMove(i, j, groupingVector);
+        }
+    }
+
+    public static ChangeGroupingMove[] Apply(GroupingVectorEncoding groupingVector) {
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+
+      int totalMoves = (groupingVector.GroupingVector.Length) * (nrOfBins - 1);
+      ChangeGroupingMove[] moves = new ChangeGroupingMove[totalMoves];
+      int count = 0;
+      foreach (ChangeGroupingMove move in Generate(groupingVector, nrOfBins)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override ChangeGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector) {
+      return Apply(groupingVector);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/StochasticChangeGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/StochasticChangeGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/ChangeGrouping/StochasticChangeGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Stochastic ChangeGrouping Move Generator", "Generates a number of possible grouping moves from a given grouping vector.")]
+  [StorableClass]
+  public class StochasticChangeGroupingMoveGenerator : ChangeGroupingMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticChangeGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticChangeGroupingMoveGenerator(StochasticChangeGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticChangeGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticChangeGroupingMoveGenerator(this, cloner);
+    }
+
+    public static ChangeGroupingMove[] Apply(GroupingVectorEncoding groupingVector, IRandom random, int sampleSize) {
+
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+      var generatedMoves = new List<ChangeGroupingMove>();
+      var moves = new List<ChangeGroupingMove>(ExhaustiveChangeGroupingMoveGenerator.Generate(groupingVector, nrOfBins));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        generatedMoves.Add(moves[random.Next(moveCount)]);
+      }
+
+      return generatedMoves.ToArray();
+    }
+
+    protected override ChangeGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(groupingVector, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMove.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("GroupingMove", "An abstract move for a groupingVector encoded solution.")]
+  [StorableClass]
+  public abstract class GroupingMove : Item, IPackingMove {
+    [Storable]
+    public GroupingVectorEncoding GroupingVector { get; protected set; }
+
+    [StorableConstructor]
+    protected GroupingMove(bool deserializing) : base(deserializing) { }
+    protected GroupingMove(GroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+        if (original.GroupingVector != null)
+          this.GroupingVector = cloner.Clone(original.GroupingVector);
+    }
+    public GroupingMove(GroupingVectorEncoding groupingVector)
+      : base() {
+        GroupingVector = groupingVector;
+    }
+
+    public abstract IPackingSolutionEncoding GetSolutionAfterMove();
+    public abstract Type GetMoveAttributeType();
+    public abstract GroupingMoveAttribute GetAttribute(double quality);
+    public abstract bool BelongsToAttribute (GroupingMoveAttribute attribute, bool hardCriterion);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("GroupingMoveAttribute", "Base class for specifying a move attribute for grouping vector moves.")]
+  [StorableClass]
+  public class GroupingMoveAttribute : Item {
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected GroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected GroupingMoveAttribute(GroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
+    }
+    public GroupingMoveAttribute() : this(0) { }
+    public GroupingMoveAttribute( double moveQuality)
+      : base() {
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveHardTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveHardTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveHardTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("GroupingMoveHardTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class GroupingMoveHardTabuCriterion : SingleSuccessorOperator, IGroupingVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected GroupingMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected GroupingMoveHardTabuCriterion(GroupingMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public GroupingMoveHardTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      GroupingMove move = PackingMoveParameter.ActualValue as GroupingMove;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      int length = groupingVector.GroupingVector.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;   
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, groupingVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, GroupingMove move, GroupingVectorEncoding groupingVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      foreach (IItem attr in attributes) {
+        GroupingMoveAttribute gvAttr = attr as GroupingMoveAttribute;
+        if (gvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= gvAttr.MoveQuality
+              || !maximization && moveQuality >= gvAttr.MoveQuality)) {
+
+          isTabu = move.BelongsToAttribute(gvAttr, true);
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveMaker.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping Move Maker", "Peforms a grouping move on a given grouping vector and updates the quality.")]
+  [StorableClass]
+  public class GroupingMoveMaker : SingleSuccessorOperator, IMoveMaker, IGroupingVectorMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlan"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanAfterMoveParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlanAfterMove"]; }
+    }
+
+    [StorableConstructor]
+    protected GroupingMoveMaker(bool deserializing) : base(deserializing) { }
+    protected GroupingMoveMaker(GroupingMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public GroupingMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution as grouping vector."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlan", "The currently best performing, decoded bin-packing solution represented as generalized packing-plan."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlanAfterMove", "The moved and decoded bin-packing solution represented as generalized packing-plan."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      IPackingMove move = PackingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      groupingVector.GroupingVector = (move.GetSolutionAfterMove() as GroupingVectorEncoding).GroupingVector;
+      PackingPlanParameter.ActualValue = PackingPlanAfterMoveParameter.ActualValue;
+
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveSoftTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveSoftTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingMoveSoftTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("GroupingMoveSoftTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class GroupingMoveSoftTabuCriterion : SingleSuccessorOperator, IGroupingVectorMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected GroupingMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected GroupingMoveSoftTabuCriterion(GroupingMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public GroupingMoveSoftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      GroupingMove move = PackingMoveParameter.ActualValue as GroupingMove;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      int length = groupingVector.GroupingVector.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;   
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, groupingVector, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, GroupingMove move, GroupingVectorEncoding groupingVector, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
+
+      foreach (IItem attr in attributes) {
+        GroupingMoveAttribute gvAttr = attr as GroupingMoveAttribute;
+        if (gvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= gvAttr.MoveQuality
+              || !maximization && moveQuality >= gvAttr.MoveQuality)) {
+
+          isTabu = move.BelongsToAttribute(gvAttr, false);
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingTabuMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingTabuMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/GroupingTabuMaker.cs	(revision 16100)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Grouping tabu maker", "Declares a given grouping move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class GroupingTabuMaker : TabuMaker, IGroupingVectorMoveOperator {
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+
+    [StorableConstructor]
+    protected GroupingTabuMaker(bool deserializing) : base(deserializing) { }
+    protected GroupingTabuMaker(GroupingTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public GroupingTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GroupingTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      IPackingMove move = PackingMoveParameter.ActualValue;
+      GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (maximization && quality > moveQuality || !maximization && quality < moveQuality)
+        baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      var gMove = move as GroupingMove;
+
+      if (gMove != null)
+        return gMove.GetAttribute(baseQuality);
+      else
+        return move.GetSolutionAfterMove();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/ExhaustiveSwapGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/ExhaustiveSwapGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/ExhaustiveSwapGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Exhaustive Swap Grouping Move Generator", "Generates all possible Swap grouping moves from a given groupingVector.")]
+  [StorableClass]
+  public class ExhaustiveSwapGroupingMoveGenerator : SwapGroupingMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveSwapGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveSwapGroupingMoveGenerator(ExhaustiveSwapGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveSwapGroupingMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveSwapGroupingMoveGenerator(this, cloner);
+    }
+    public static IEnumerable<SwapGroupingMove> Generate(GroupingVectorEncoding groupingVector, int nrOfBins) {
+      for (int i = 0; i < groupingVector.GroupingVector.Length - 1; i++)
+        for (int j = i + 1; j < groupingVector.GroupingVector.Length; j++) {
+          if (j != i)
+            yield return new SwapGroupingMove(i, j, groupingVector);
+        }
+    }
+
+    public static SwapGroupingMove[] Apply(GroupingVectorEncoding groupingVector) {
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+
+      int totalMoves = (groupingVector.GroupingVector.Length * (groupingVector.GroupingVector.Length - 1)) / 2;
+      SwapGroupingMove[] moves = new SwapGroupingMove[totalMoves];
+      int count = 0;
+      foreach (SwapGroupingMove move in Generate(groupingVector, nrOfBins)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override SwapGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector) {
+      return Apply(groupingVector);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/StochasticSwapGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/StochasticSwapGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/StochasticSwapGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Stochastic SwapGrouping Move Generator", "Generates a number of possible grouping moves from a given grouping vector.")]
+  [StorableClass]
+  public class StochasticSwapGroupingMoveGenerator : SwapGroupingMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticSwapGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticSwapGroupingMoveGenerator(StochasticSwapGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticSwapGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticSwapGroupingMoveGenerator(this, cloner);
+    }
+
+    public static SwapGroupingMove[] Apply(GroupingVectorEncoding groupingVector, IRandom random, int sampleSize) {
+
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+      var generatedMoves = new List<SwapGroupingMove>();
+      var moves = new List<SwapGroupingMove>(ExhaustiveSwapGroupingMoveGenerator.Generate(groupingVector, nrOfBins));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        generatedMoves.Add(moves[random.Next(moveCount)]);
+      }
+
+      return generatedMoves.ToArray();
+    }
+
+    protected override SwapGroupingMove[] GenerateMoves(GroupingVectorEncoding SwapGrouping) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(SwapGrouping, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMove.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Swap Grouping Move", "A move on a grouping vector that is specified by two group-assignment-indexes.")]
+  [StorableClass]
+  public class SwapGroupingMove : GroupingMove, IPackingMove {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapGroupingMove(bool deserializing) : base(deserializing) { }
+    protected SwapGroupingMove(SwapGroupingMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+    }
+    public SwapGroupingMove(int index1, int index2, GroupingVectorEncoding groupingVector)
+      : base(groupingVector) {
+      Index1 = index1;
+      Index2 = index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapGroupingMove(this, cloner);
+    }
+
+    public override IPackingSolutionEncoding GetSolutionAfterMove() {
+      GroupingVectorEncoding newSolution = new GroupingVectorEncoding();
+      newSolution.GroupingVector = new IntegerVector(GroupingVector.GroupingVector);
+      newSolution.GroupingVector[Index1] = GroupingVector.GroupingVector[Index2];
+      newSolution.GroupingVector[Index2] = GroupingVector.GroupingVector[Index1];
+      return newSolution;
+    }
+
+    public override Type GetMoveAttributeType() {
+      return typeof(SwapGroupingMoveAttribute);
+    }
+
+    public override GroupingMoveAttribute GetAttribute(double quality) {
+      return new SwapGroupingMoveAttribute(Index1, Index2, GroupingVector.GroupingVector[Index1], GroupingVector.GroupingVector[Index2], quality);
+    }
+
+    public override bool BelongsToAttribute(GroupingMoveAttribute attribute, bool hardCriterion) {
+      var attr = attribute as SwapGroupingMoveAttribute;
+      if (attr != null) {
+        if (hardCriterion) {
+          if (Index1 == attr.ItemIndex1 || Index2 == attr.ItemIndex2)// || GroupingVector.GroupingVector[Index1] == attr.AssignedBin1 || GroupingVector.GroupingVector[Index2] == attr.AssignedBin2)
+            return true;
+        } else
+          if (Index1 == attr.ItemIndex1 && Index2 == attr.ItemIndex2)// && GroupingVector.GroupingVector[Index1] == attr.AssignedBin1 && GroupingVector.GroupingVector[Index2] == attr.AssignedBin2)
+            return true;
+      }
+      return false;
+    }
+
+    public override string ToString() {
+      return "SGM(i1="+Index1 + ", i2=" + Index2  +")";
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("SwapGroupingMoveAttribute", "Specifies the tabu attributes for a Swap grouping move on a grouping vector.")]
+  [StorableClass]
+  public class SwapGroupingMoveAttribute : GroupingMoveAttribute {
+    [Storable]
+    public int ItemIndex1 { get; protected set; }
+    [Storable]
+    public int ItemIndex2 { get; protected set; }
+    [Storable]
+    public int AssignedBin1 { get; protected set; }
+    [Storable]
+    public int AssignedBin2 { get; protected set; }
+
+    [StorableConstructor]
+    protected SwapGroupingMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SwapGroupingMoveAttribute(SwapGroupingMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.ItemIndex1 = original.ItemIndex1;
+      this.ItemIndex2 = original.ItemIndex2;
+      this.AssignedBin1 = original.AssignedBin1;
+      this.AssignedBin2 = original.AssignedBin2;
+    }
+    public SwapGroupingMoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public SwapGroupingMoveAttribute(int itemIndex1, int itemIndex2, int assignedBin1, int assignedBin2, double moveQuality)
+      : base(moveQuality) {
+      ItemIndex1 = itemIndex1;
+      ItemIndex2 = itemIndex2;
+      AssignedBin1 = assignedBin1;
+      AssignedBin2 = assignedBin2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapGroupingMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/GroupingVector/Moves/SwapGrouping/SwapGroupingMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Swap Grouping Move Generator", "Base class for all Swap grouping move generators.")]
+  [StorableClass]
+  public abstract class SwapGroupingMoveGenerator : SingleSuccessorOperator, IGroupingVectorMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
+      get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove>)Parameters["PackingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected SwapGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected SwapGroupingMoveGenerator(SwapGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public SwapGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The grouping vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      GroupingVectorEncoding gv = GroupingVectorParameter.ActualValue;
+      SwapGroupingMove[] moves = GenerateMoves(gv);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract SwapGroupingMove[] GenerateMoves(GroupingVectorEncoding groupingVector);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/IPackingBin.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/IPackingBin.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/IPackingBin.cs	(revision 16100)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.BinPacking.Interfaces {
+  // a packing bin represents the container for a packing solution
+  public interface IPackingBin : IPackingShape { }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/IRegularPackingShape.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/IRegularPackingShape.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/IRegularPackingShape.cs	(revision 16100)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Problems.BinPacking.Interfaces {
+  ///A regularPackingShape has special geometric properties that allow special handling = Rectangle, Cuboid
+  public interface IRegularPackingShape : IPackingShape, IComparable {
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerBinPackingProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerBinPackingProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerBinPackingProblem.cs	(revision 16100)
@@ -0,0 +1,188 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.BinPacking.Decoders;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+
+namespace HeuristicLab.Problems.BinPacking.Problem {
+  [Item("Bin Packing Problem (3D, ISO containers) (BPP)", "Represents a three-dimensional bin-packing problem using two different bin sizes.")]
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 320)]
+  public class ISOContainerBinPackingProblem : CuboidIdenticalBinPackingProblem {
+
+
+    #region Default Instance
+    private static readonly RealBPPData DefaultInstance = new RealBPPData() {  
+      Name = "3D BPP with weigthed items Default Instance", 
+      Description = "The default instance for 3D Bin Packing Problem with weighted items.",
+      BinMeasures = new int[] {25,25,35},
+      ItemMeasures = new int[][] {
+        new int[] {12,5,10},
+        new int[] {10,18,20},
+        new int[] {9,7,7},
+        new int[] {21,12,4},
+        new int[] {8,8,12},
+        new int[] {3,6,14},
+        new int[] {20,4,9},
+        new int[] {5,9,8},
+        new int[] {7,17,3},
+        new int[] {13,20,15},
+        new int[] {9,11,9},
+        new int[] {10,18,20},
+        new int[] {9,7,7},
+        new int[] {21,12,4},
+        new int[] {8,8,12},
+        new int[] {3,6,14},
+        new int[] {20,4,9},
+        new int[] {5,9,8},
+        new int[] {7,17,3},
+        new int[] {13,20,15},
+        new int[] {9,11,9},
+        new int[] {10,18,20},
+        new int[] {9,7,7},
+        new int[] {21,12,4},
+        new int[] {8,8,12},
+        new int[] {3,6,14},
+        new int[] {20,4,9},
+        new int[] {5,9,8},
+        new int[] {7,17,3},
+        new int[] {13,20,15},
+        new int[] {9,11,9},
+        new int[] {10,18,20},
+        new int[] {9,7,7},
+        new int[] {21,12,4},
+        new int[] {8,8,12},
+        new int[] {3,6,14},
+        new int[] {20,4,9},
+        new int[] {5,9,8},
+        new int[] {7,17,3},
+        new int[] {13,20,15},
+        new int[] {9,11,9}
+      },
+      Items = 30,
+      ItemWeights = new double[] {
+        12*5*10,
+        10*18*20,
+        9*7*7,
+        21*12*4,
+        8*8*12,
+        3*6*14,
+        20*4*9,
+        5*9*8,
+        7*17*3,
+        13*20*15,
+        9*11*9,
+        10*18*20,
+        9*7*7,
+        21*12*4,
+        8*8*12,
+        3*6*14,
+        20*4*9,
+        5*9*8,
+        7*17*3,
+        13*20*15,
+        9*11*9,
+        10*18*20,
+        9*7*7,
+        21*12*4,
+        8*8*12,
+        3*6*14,
+        20*4*9,
+        5*9*8,
+        7*17*3,
+        13*20*15,
+        9*11*9
+      },
+      ItemMaterials = new int[] {
+        1,
+        0,
+        0,
+        1,
+        0,
+        0,
+        1,
+        1,
+        0,
+        1,
+        1,
+        0,
+        0,
+        1,
+        0,
+        0,
+        1,
+        1,
+        0,
+        1,
+        1,
+        0,
+        0,
+        1,
+        0,
+        0,
+        1,
+        1,
+        0,
+        1,
+        1,
+
+      } 
+    };
+    #endregion
+    
+    [StorableConstructor]
+    protected ISOContainerBinPackingProblem(bool deserializing) : base(deserializing) { }
+    protected ISOContainerBinPackingProblem(ISOContainerBinPackingProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ISOContainerBinPackingProblem(this, cloner);
+    }
+    public ISOContainerBinPackingProblem()
+      : base() {
+    }
+
+
+
+    #region Helpers
+    protected override void InitializeDecoder() {
+      // Operators.RemoveAll(op => op is I2DOperator); TODO
+
+      PackingSolutionDecoderParameter.ValidValues.Clear();
+      if (SolutionCreator is MultiComponentVectorRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.Add(new ISOContainerMultiComponentVectorDecoder3D());
+      } else {
+        string error = "The given problem does not support the selected solution-creator.";
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(error, null);
+      }
+    }
+
+    protected override void InitializeProblemData() {
+      Load(DefaultInstance);
+    }
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerMultiComponentVectorDecoder3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerMultiComponentVectorDecoder3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/ISOContainerMultiComponentVectorDecoder3D.cs	(revision 16100)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Problems.BinPacking.Dimensions;
+using HeuristicLab.Problems.BinPacking.PackingBin;
+using HeuristicLab.Problems.BinPacking.PackingItem;
+using HeuristicLab.Encodings.PackingEncoding.PackingPlan;
+using HeuristicLab.Common;
+using HeuristicLab.Collections;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+
+namespace HeuristicLab.Problems.BinPacking.Decoders {
+  [Item("ISO container decoder for the MultiComponentVector encoding.", "<Description missing...>")]
+  [StorableClass]
+  public class ISOContainerMultiComponentVectorDecoder3D : PackingSolutionDecoder<
+      ThreeDimensionalPacking,
+      CuboidPackingBin,
+      CuboidPackingItem>, I3DMCVDecoder {
+
+    public ISOContainerMultiComponentVectorDecoder3D ()
+      : base() {
+    }
+    [StorableConstructor]
+    protected ISOContainerMultiComponentVectorDecoder3D (bool deserializing) : base(deserializing) { }
+    protected ISOContainerMultiComponentVectorDecoder3D(ISOContainerMultiComponentVectorDecoder3D original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ISOContainerMultiComponentVectorDecoder3D(this, cloner);
+    }
+
+    public static PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> Decode(MultiComponentVectorEncoding solution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {
+      PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> resultPlan = new PackingPlan3D(binMeasures);
+      ObservableList<BinPacking3D> result = new ObservableList<BinPacking3D>();
+
+      var sequenceMatrix = solution.GenerateSequenceMatrix();
+      Dictionary<int, bool> rotated = solution.GenerateRotationArray();
+
+      //Fill bins according to grouping vector
+      List<int> remainingIDs = new List<int>();
+      foreach (var sequence in sequenceMatrix) {
+        remainingIDs = remainingIDs.Concat(sequence).ToList();
+        var bp = new BinPacking3D(binMeasures);
+        bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
+        if (remainingIDs.Count > 0) {
+          bp.DoubleDepth();
+          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
+        }
+        result.Add(bp);
+      }
+      result.RemoveAll(x => x.ItemPositions.Count == 0);
+      result = new ObservableList<BinPacking3D>(result.OrderByDescending(bp => bp.PackingDensity));
+
+      //Try to put remaining items in existing bins
+      var temp = new List<int>(remainingIDs);
+      foreach (int id in temp) {
+        foreach (var bp in result) {
+          var position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true);
+          if (remainingIDs.Count > 0) {
+            bp.DoubleDepth();
+            position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true);
+          }
+          if (position != null) {
+            bp.PackItem(id, itemMeasures[id], position);
+            remainingIDs.Remove(id);
+          }
+        }
+      }
+
+      //Put still remaining items in new bins
+      while (remainingIDs.Count > 0) {
+        var bp = new BinPacking3D(binMeasures);
+        bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
+        if (remainingIDs.Count > 0) {
+          bp.DoubleDepth();
+          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
+        }
+        result.Add(bp);
+      }
+      result.RemoveAll(x => x.ItemPositions.Count == 0); 
+      resultPlan.BinPackings = new ObservableList<BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>>(result.OrderByDescending(bp => bp.PackingDensity));
+      return resultPlan;
+    }
+
+    public override PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {
+      var solution = encodedSolution as MultiComponentVectorEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector");
+      return Decode(solution, binMeasures, itemMeasures);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Encoding.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Encoding.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Encoding.cs	(revision 16100)
@@ -0,0 +1,77 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [StorableClass]
+  public class Encoding : HeuristicLab.Optimization.Encoding<IPackingSolutionCreator> {
+    [StorableConstructor]
+    private Encoding(bool deserializing) : base(deserializing) { }
+    public Encoding()
+      : base("PackingSequence") {
+      SolutionCreator = new PackingSequenceRandomCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private Encoding(Encoding original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEvents();
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Encoding(this, cloner);
+    }
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      // TODO
+    }
+
+    #region Operator discovery
+    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    static Encoding() {
+      encodingSpecificOperatorTypes = new List<Type>
+      {
+        typeof(IPackingSequenceOperator),         // TODO move (also namespace)
+      };
+    }
+    private void DiscoverOperators() {
+      var assembly = typeof(IPackingSequenceCreator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+    }
+    #endregion
+
+    private void RegisterParameterEvents() {
+      // nothing to do
+    }
+
+
+  }
+
+  public static class IndividualExtensionMethods {
+    public static Permutation PackingSequence(this Individual individual) {
+      var encoding = individual.GetEncoding<Encoding>();
+      return individual.PackingSequence(encoding.Name);
+    }
+
+    public static Permutation PackingSequence(this Individual individual, string name) {
+      return (Permutation)individual[name];
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/IPackingSequenceCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/IPackingSequenceCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/IPackingSequenceCreator.cs	(revision 16100)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  interface IPackingSequenceCreator : ISolutionCreator, IPackingSequenceOperator {
+    ILookupParameter<IntValue> NumberOfPackingItemsParameter { get; }
+    ILookupParameter<Permutation> SolutionParameter { get; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveHardTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveHardTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveHardTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("SequenceMoveHardTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class SequenceMoveHardTabuCriterion : SingleSuccessorOperator, IPackingSequenceMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected SequenceMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SequenceMoveHardTabuCriterion(SequenceMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SequenceMoveHardTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The solution candidate to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SequenceMove move = PackingMoveParameter.ActualValue as SequenceMove;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, SequenceMove move, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType() == move.GetMoveAttributeType());
+
+      foreach (IItem attr in attributes) {
+        SequenceMoveAttribute gvAttr = attr as SequenceMoveAttribute;
+        if (gvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= gvAttr.MoveQuality
+              || !maximization && moveQuality >= gvAttr.MoveQuality)) {
+
+          isTabu = move.BelongsToAttribute(gvAttr, true); // only difference to soft tabu criterion
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveMaker.cs	(revision 16100)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Sequence Move Maker", "Peforms a Sequence move on a given Sequence vector and updates the quality.")]
+  [StorableClass]
+  public class SequenceMoveMaker : SingleSuccessorOperator, IMoveMaker, IPackingSequenceMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlan"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanAfterMoveParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlanAfterMove"]; }
+    }
+
+    [StorableConstructor]
+    protected SequenceMoveMaker(bool deserializing) : base(deserializing) { }
+    protected SequenceMoveMaker(SequenceMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public SequenceMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The solution as Sequence vector."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlan", "The currently best performing, decoded bin-packing solution represented as generalized packing-plan."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlanAfterMove", "The moved and decoded bin-packing solution represented as generalized packing-plan."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      PackingPlanParameter.ActualValue = PackingPlanAfterMoveParameter.ActualValue;
+
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveSoftTabuCriterion.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveSoftTabuCriterion.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/GroupingMoveSoftTabuCriterion.cs	(revision 16100)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("SequenceMoveSoftTabuCriterion", "<Missing>")]
+  [StorableClass]
+  public class SequenceMoveSoftTabuCriterion : SingleSuccessorOperator, IPackingSequenceMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    [StorableConstructor]
+    protected SequenceMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SequenceMoveSoftTabuCriterion(SequenceMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SequenceMoveSoftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The solution to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SequenceMove move = PackingMoveParameter.ActualValue as SequenceMove;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
+      bool isTabu = IsMoveTabu(tabuList, move, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private bool IsMoveTabu(ItemList<IItem> tabuList, SequenceMove move, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      var attributes = tabuList.FindAll(ta => ta.GetType() == move.GetMoveAttributeType());
+
+      foreach (IItem attr in attributes) {
+        SequenceMoveAttribute gvAttr = attr as SequenceMoveAttribute;
+        if (gvAttr != null
+          && (!useAspiration
+              || maximization && moveQuality <= gvAttr.MoveQuality
+              || !maximization && moveQuality >= gvAttr.MoveQuality)) {
+
+          isTabu = move.BelongsToAttribute(gvAttr, false); // only difference to hard tabu criterion 
+        }
+        if (isTabu) break;
+      }
+
+      return isTabu;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/ExhaustiveInsertionMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/ExhaustiveInsertionMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/ExhaustiveInsertionMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Exhaustive Insertion Move Generator", "Generates all possible Swap Sequence moves from a given PackingSequence.")]
+  [StorableClass]
+  public class ExhaustiveInsertionMoveGenerator : InsertionMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveInsertionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveInsertionMoveGenerator(ExhaustiveInsertionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveInsertionMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveInsertionMoveGenerator(this, cloner);
+    }
+    public static IEnumerable<InsertionMove> Generate(Permutation packingSequence, int nrOfBins) {
+      for (int i = 0; i < packingSequence.Length - 1; i++)
+        for (int j = i + 1; j < packingSequence.Length; j++) {
+          if (j != i)
+            yield return new InsertionMove(i, j, packingSequence);
+        }
+    }
+
+    public static InsertionMove[] Apply(Permutation packingSequence) {
+      int nrOfBins = 0;
+      foreach (int binNr in packingSequence) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+
+      int totalMoves = (packingSequence.Length * (packingSequence.Length - 1)) / 2;
+      InsertionMove[] moves = new InsertionMove[totalMoves];
+      int count = 0;
+      foreach (InsertionMove move in Generate(packingSequence, nrOfBins)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override InsertionMove[] GenerateMoves(Permutation packingSequence) {
+      return Apply(packingSequence);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMove.cs	(revision 16100)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Insertion Move", "A move on a Sequence vector that is specified by two group-assignment-indexes.")]
+  [StorableClass]
+  public class InsertionMove : SequenceMove {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+
+    [StorableConstructor]
+    protected InsertionMove(bool deserializing) : base(deserializing) { }
+    protected InsertionMove(InsertionMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+    }
+    public InsertionMove(int index1, int index2, Permutation packingSequence)
+      : base(packingSequence) {
+      Index1 = index1;
+      Index2 = index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InsertionMove(this, cloner);
+    }
+
+    public override Permutation GetSolutionAfterMove() {
+      Permutation original = PackingSequence;
+      Permutation resultingPermutation = (Permutation)PackingSequence.Clone();
+      int cutIndex, insertIndex, number;
+
+      cutIndex = Index1;
+      insertIndex = Index2;
+      number = original[cutIndex];
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < PackingSequence.Length) {
+        if (j == cutIndex) {
+          j++;
+        }
+        if (i == insertIndex) {
+          resultingPermutation[i] = number;
+          i++;
+        }
+        if ((i < original.Length) && (j < original.Length)) {
+          resultingPermutation[i] = original[j];
+          i++;
+          j++;
+        }
+      }
+
+      return resultingPermutation;
+    }
+
+    public override Type GetMoveAttributeType() {
+      return typeof(InsertionMoveAttribute);
+    }
+
+    public override SequenceMoveAttribute GetAttribute(double quality) {
+      return new InsertionMoveAttribute(Index1, Index2, PackingSequence[Index1], PackingSequence[Index2], quality);
+    }
+
+    public override bool BelongsToAttribute(SequenceMoveAttribute attribute, bool hardCriterion) {
+      var attr = attribute as InsertionMoveAttribute;
+      if (attr != null) {
+        if (hardCriterion) {
+          if (Index1 == attr.Index1 || Index2 == attr.Index2)
+            return true;
+        } else
+          if (Index1 == attr.Index1 && Index2 == attr.Index2)
+            return true;
+      }
+      return false;
+    }
+
+    public override string ToString() {
+      return "IM(i1=" + Index1 + ", i2=" + Index2 + ")";
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("InsertionMoveAttribute", "Specifies the tabu attributes for a Insertion move on a packingSequence.")]
+  [StorableClass]
+  public class InsertionMoveAttribute : SequenceMoveAttribute {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+    [Storable]
+    public int ItemID1 { get; protected set; }
+    [Storable]
+    public int ItemID2 { get; protected set; }
+
+    [StorableConstructor]
+    protected InsertionMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected InsertionMoveAttribute(InsertionMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+      this.ItemID1 = original.ItemID1;
+      this.ItemID2 = original.ItemID2;
+    }
+    public InsertionMoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public InsertionMoveAttribute(int index1, int index2, int itemID1, int itemID2, double moveQuality)
+      : base(moveQuality) {
+      Index1 = index1;
+      Index2 = index2;
+      ItemID1 = itemID1;
+      ItemID2 = itemID2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InsertionMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/InsertionMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Insertion Move Generator", "Base class for all Swap Sequence move generators.")]
+  [StorableClass]
+  public abstract class InsertionMoveGenerator : SingleSuccessorOperator, IPackingSequenceMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected InsertionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected InsertionMoveGenerator(InsertionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public InsertionMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The Sequence vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      Permutation ps = PackingSequenceParameter.ActualValue;
+      InsertionMove[] moves = GenerateMoves(ps);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract InsertionMove[] GenerateMoves(Permutation packingSequence);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/StochasticInsertionMoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/StochasticInsertionMoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Insertion/StochasticInsertionMoveGenerator.cs	(revision 16100)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Stochastic Insertion Move Generator", "Generates a number of possible Sequence moves from a given Sequence vector.")]
+  [StorableClass]
+  public class StochasticInsertionMoveGenerator : InsertionMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticInsertionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticInsertionMoveGenerator(StochasticInsertionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticInsertionMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticInsertionMoveGenerator(this, cloner);
+    }
+
+    public static InsertionMove[] Apply(Permutation packingSequence, IRandom random, int sampleSize) {
+
+      int nrOfBins = 0;
+      foreach (int binNr in packingSequence) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+      var generatedMoves = new List<InsertionMove>();
+      var moves = new List<InsertionMove>(ExhaustiveInsertionMoveGenerator.Generate(packingSequence, nrOfBins));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        generatedMoves.Add(moves[random.Next(moveCount)]);
+      }
+
+      return generatedMoves.ToArray();
+    }
+
+    protected override InsertionMove[] GenerateMoves(Permutation packingSequence) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(packingSequence, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMove.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMove.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMove.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("SequenceMove", "An abstract move for a packing sequence encoded solution.")]
+  [StorableClass]
+  public abstract class SequenceMove : Item, IPackingMove<Permutation> {
+    [Storable]
+    public Permutation PackingSequence { get; protected set; }
+
+    [StorableConstructor]
+    protected SequenceMove(bool deserializing) : base(deserializing) { }
+    protected SequenceMove(SequenceMove original, Cloner cloner)
+      : base(original, cloner) {
+        if (original.PackingSequence != null)
+          this.PackingSequence = cloner.Clone(original.PackingSequence);
+    }
+    public SequenceMove(Permutation packingSequence)
+      : base() {
+        PackingSequence = packingSequence;
+    }
+
+    public abstract Permutation GetSolutionAfterMove();
+    public abstract Type GetMoveAttributeType();
+    public abstract SequenceMoveAttribute GetAttribute(double quality);
+    public abstract bool BelongsToAttribute (SequenceMoveAttribute attribute, bool hardCriterion);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceMoveAttribute.cs	(revision 16100)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence{
+  [Item("SequenceMoveAttribute", "Base class for specifying a move attribute for sequence moves.")]
+  [StorableClass]
+  public class SequenceMoveAttribute : Item {
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected SequenceMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected SequenceMoveAttribute(SequenceMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
+    }
+    public SequenceMoveAttribute() : this(0) { }
+    public SequenceMoveAttribute( double moveQuality)
+      : base() {
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceTabuMaker.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceTabuMaker.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/SequenceTabuMaker.cs	(revision 16100)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Sequence tabu maker", "Declares a given Sequence move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class SequenceTabuMaker : TabuMaker, IPackingSequenceMoveOperator {
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+
+    [StorableConstructor]
+    protected SequenceTabuMaker(bool deserializing) : base(deserializing) { }
+    protected SequenceTabuMaker(SequenceTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public SequenceTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The solution to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequenceTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      var move = PackingMoveParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (maximization && quality > moveQuality || !maximization && quality < moveQuality)
+        baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      var sMove = move as SequenceMove;
+
+      if (sMove != null)
+        return sMove.GetAttribute(baseQuality);
+      else
+        return move.GetSolutionAfterMove();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/ExhaustiveSwap2MoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/ExhaustiveSwap2MoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/ExhaustiveSwap2MoveGenerator.cs	(revision 16100)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Exhaustive Swap2 Move Generator", "Generates all possible Swap Sequence moves from a given PackingSequence.")]
+  [StorableClass]
+  public class ExhaustiveSwap2MoveGenerator : Swap2MoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveSwap2MoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveSwap2MoveGenerator(ExhaustiveSwap2MoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveSwap2MoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveSwap2MoveGenerator(this, cloner);
+    }
+    public static IEnumerable<Swap2Move> Generate(Permutation packingSequence, int nrOfBins) {
+      for (int i = 0; i < packingSequence.Length - 1; i++)
+        for (int j = i + 1; j < packingSequence.Length; j++) {
+          if (j != i)
+            yield return new Swap2Move(i, j, packingSequence);
+        }
+    }
+
+    public static Swap2Move[] Apply(Permutation packingSequence) {
+      int nrOfBins = 0;
+      foreach (int binNr in packingSequence) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+
+      int totalMoves = (packingSequence.Length * (packingSequence.Length - 1)) / 2;
+      Swap2Move[] moves = new Swap2Move[totalMoves];
+      int count = 0;
+      foreach (Swap2Move move in Generate(packingSequence, nrOfBins)) {
+        moves[count++] = move;
+      }
+      return moves;
+    }
+
+    protected override Swap2Move[] GenerateMoves(Permutation packingSequence) {
+      return Apply(packingSequence);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/StochasticSwap2MoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/StochasticSwap2MoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/StochasticSwap2MoveGenerator.cs	(revision 16100)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Stochastic Swap2 Move Generator", "Generates a number of possible Sequence moves from a given Sequence vector.")]
+  [StorableClass]
+  public class StochasticSwap2MoveGenerator : Swap2MoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticSwap2MoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticSwap2MoveGenerator(StochasticSwap2MoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticSwap2MoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticSwap2MoveGenerator(this, cloner);
+    }
+
+    public static Swap2Move[] Apply(Permutation packingSequence, IRandom random, int sampleSize) {
+
+      int nrOfBins = 0;
+      foreach (int binNr in packingSequence) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+      var generatedMoves = new List<Swap2Move>();
+      var moves = new List<Swap2Move>(ExhaustiveSwap2MoveGenerator.Generate(packingSequence, nrOfBins));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        generatedMoves.Add(moves[random.Next(moveCount)]);
+      }
+
+      return generatedMoves.ToArray();
+    }
+
+    protected override Swap2Move[] GenerateMoves(Permutation packingSequence) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(packingSequence, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2Move.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2Move.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2Move.cs	(revision 16100)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Swap2 Move", "A move on a Sequence vector that is specified by two group-assignment-indexes.")]
+  [StorableClass]
+  public class Swap2Move : SequenceMove, IPackingMove<Permutation> {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+
+    [StorableConstructor]
+    protected Swap2Move(bool deserializing) : base(deserializing) { }
+    protected Swap2Move(Swap2Move original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+    }
+    public Swap2Move(int index1, int index2, Permutation packingSequence)
+      : base(packingSequence) {
+      Index1 = index1;
+      Index2 = index2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap2Move(this, cloner);
+    }
+
+    public override Permutation GetSolutionAfterMove() {
+      Permutation newSolution = (Permutation)PackingSequence.Clone(new Cloner());
+      newSolution[Index1] = PackingSequence[Index2];
+      newSolution[Index2] = PackingSequence[Index1];
+      return newSolution;
+    }
+
+    public override Type GetMoveAttributeType() {
+      return typeof(Swap2MoveAttribute);
+    }
+
+    public override SequenceMoveAttribute GetAttribute(double quality) {
+      return new Swap2MoveAttribute(Index1, Index2, PackingSequence[Index1], PackingSequence[Index2], quality);
+    }
+
+    public override bool BelongsToAttribute(SequenceMoveAttribute attribute, bool hardCriterion) {
+      var attr = attribute as Swap2MoveAttribute;
+      if (attr != null) {
+        if (hardCriterion) {
+          if (Index1 == attr.Index1 || Index2 == attr.Index2)// || PackingSequence.PackingSequence[Index1] == attr.AssignedBin1 || PackingSequence.PackingSequence[Index2] == attr.AssignedBin2)
+            return true;
+        } else
+          if (Index1 == attr.Index1 && Index2 == attr.Index2)// && PackingSequence.PackingSequence[Index1] == attr.AssignedBin1 && PackingSequence.PackingSequence[Index2] == attr.AssignedBin2)
+            return true;
+      }
+      return false;
+    }
+
+    public override string ToString() {
+      return "SGM(i1="+Index1 + ", i2=" + Index2  +")";
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveAttribute.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveAttribute.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveAttribute.cs	(revision 16100)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Swap2MoveAttribute", "Specifies the tabu attributes for a Swap2 move on a packingSequence.")]
+  [StorableClass]
+  public class Swap2MoveAttribute : SequenceMoveAttribute {
+    [Storable]
+    public int Index1 { get; protected set; }
+    [Storable]
+    public int Index2 { get; protected set; }
+    [Storable]
+    public int ItemID1 { get; protected set; }
+    [Storable]
+    public int ItemID2 { get; protected set; }
+
+    [StorableConstructor]
+    protected Swap2MoveAttribute(bool deserializing) : base(deserializing) { }
+    protected Swap2MoveAttribute(Swap2MoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+      this.ItemID1 = original.ItemID1;
+      this.ItemID2 = original.ItemID2;
+    }
+    public Swap2MoveAttribute() : this(-1, -1, -1, -1, -1) { }
+    public Swap2MoveAttribute(int index1, int index2, int itemID1, int itemID2, double moveQuality)
+      : base(moveQuality) {
+      Index1 = index1;
+      Index2 = index2;
+      ItemID1 = itemID1;
+      ItemID2 = itemID2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap2MoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveGenerator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveGenerator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/Moves/Swap2/Swap2MoveGenerator.cs	(revision 16100)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Swap2 Move Generator", "Base class for all Swap Sequence move generators.")]
+  [StorableClass]
+  public abstract class Swap2MoveGenerator : SingleSuccessorOperator, IPackingSequenceMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<Permutation> PackingSequenceParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+    public ILookupParameter<IPackingMove<Permutation>> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove<Permutation>>)Parameters["PackingMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected Swap2MoveGenerator(bool deserializing) : base(deserializing) { }
+    protected Swap2MoveGenerator(Swap2MoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public Swap2MoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The Sequence vector for which moves should be generated."));
+      Parameters.Add(new LookupParameter<IPackingMove<Permutation>>("PackingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      Permutation ps = PackingSequenceParameter.ActualValue;
+      Swap2Move[] moves = GenerateMoves(ps);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract Swap2Move[] GenerateMoves(Permutation packingSequence);
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequence.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequence.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequence.cs	(revision 16100)
@@ -0,0 +1,25 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequence", "Represents a packing sequence (permutation).")]
+  [StorableClass]
+  public class PackingSequence : Permutation {
+
+    [StorableConstructor]
+    private PackingSequence(bool deserializing) : base(deserializing) { }
+    private PackingSequence(PackingSequence original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequence() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequence(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceCrossover.cs	(revision 16100)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequenceCrossover", "An operator which crosses two PackingSequence representations.")]
+  [StorableClass]
+  public abstract class PackingSequenceCrossover : PackingSolutionCrossover<Permutation>, IPackingSequenceOperator {
+
+    [StorableConstructor]
+    protected PackingSequenceCrossover(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceCrossover(PackingSequenceCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequenceCrossover()
+      : base() {
+      ParentsParameter.ActualName = "PackingSequence";
+      ChildParameter.ActualName = "PackingSequence";
+    }
+
+    public abstract Permutation Cross(IRandom random, Permutation parent1, Permutation parent2);
+
+    public override IOperation Apply() {
+      var parents = ParentsParameter.ActualValue;
+
+      ChildParameter.ActualValue =
+        Cross(RandomParameter.ActualValue, parents[0], parents[1]);
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceEncoding.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceEncoding.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceEncoding.cs	(revision 16100)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("Packing Sequence Encoding", "Represents an encoding for a bin packing problem using permutation of item-indexes to define the packing sequence.")]
+  [StorableClass]
+  public class PackingSequenceEncoding : Item, IPackingSolutionEncoding {
+
+    [Storable]
+    public Permutation PackingSequence { get; set; }
+
+    [StorableConstructor]
+    protected PackingSequenceEncoding(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceEncoding(PackingSequenceEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.PackingSequence = cloner.Clone(original.PackingSequence);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequenceEncoding(this, cloner);
+    }
+
+    public PackingSequenceEncoding()
+      : base() {
+      PackingSequence = new Permutation();
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("[ ");
+      sb.Append(PackingSequence.ToString() + " \n");
+      sb.Append("]");
+      return sb.ToString();
+    }
+
+
+    public override bool Equals(object obj) {
+      if (obj.GetType() == typeof(PackingSequenceEncoding))
+        return AreEqual(this, obj as PackingSequenceEncoding);
+
+      return false;
+    }
+    public override int GetHashCode() {
+      return PackingSequence.GetHashCode();
+    }
+    private static bool AreEqual(PackingSequenceEncoding packingSequenceEncoding1, PackingSequenceEncoding packingSequenceEncoding2) {
+      return AreEqual(packingSequenceEncoding1.PackingSequence, packingSequenceEncoding2.PackingSequence);
+    }
+
+    private static bool AreEqual(Permutation p1, Permutation p2) {
+      if (p1.Length != p2.Length)
+        return false;
+      for (int i = 0; i < p1.Length; i++) {
+        if (p1[i] != p2[i])
+          return false;
+      }
+      return true;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceInversionManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceInversionManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceInversionManipulator.cs	(revision 16100)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequence Inversion Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class PackingSequenceInversionManipulator : PackingSequenceManipulator, IPackingSequenceOperator {
+    [StorableConstructor]
+    protected PackingSequenceInversionManipulator(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceInversionManipulator(PackingSequenceInversionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequenceInversionManipulator()
+      : base() {
+      EncodedSolutionParameter.ActualName = "PackingSequence";
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequenceInversionManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, Permutation individual) {
+      InversionManipulator.Apply(random, individual);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceManipulator.cs	(revision 16100)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequenceManipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public abstract class PackingSequenceManipulator : PackingSolutionManipulator<Permutation>, IPackingSequenceOperator {
+    [StorableConstructor]
+    protected PackingSequenceManipulator(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceManipulator(PackingSequenceManipulator original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequenceManipulator()
+      : base() {
+      EncodedSolutionParameter.ActualName = "PackingSequence";
+    }
+
+    protected abstract void Manipulate(IRandom random, Permutation individual);
+
+    public override IOperation Apply() {
+      var solution = EncodedSolutionParameter.ActualValue;
+      if (solution == null) throw new InvalidOperationException("PackingSolutionEncoding was not found or is not of type PackingSequenceEncoding.");
+      Manipulate(RandomParameter.ActualValue, solution);
+      return base.Apply();
+    }
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceOrderCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceOrderCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceOrderCrossover.cs	(revision 16100)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequence OX", "An operator which crosses two PackingSequence representations using the OX-strategy.")]
+  [StorableClass]
+  public class PackingSequenceOrderCrossover : PackingSequenceCrossover {
+
+    [StorableConstructor]
+    protected PackingSequenceOrderCrossover(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceOrderCrossover(PackingSequenceOrderCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequenceOrderCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequenceOrderCrossover(this, cloner);
+    }
+
+    public override Permutation Cross(IRandom random, Permutation parent1, Permutation parent2) {
+      return OrderCrossover.Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequencePartiallyMatchedCrossover.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequencePartiallyMatchedCrossover.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequencePartiallyMatchedCrossover.cs	(revision 16100)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequence PMX", "An operator which crosses two PackingSequence representations using the OX-strategy.")]
+  [StorableClass]
+  public class PackingSequencePartiallyMatchedCrossover : PackingSequenceCrossover {
+
+    [StorableConstructor]
+    protected PackingSequencePartiallyMatchedCrossover(bool deserializing) : base(deserializing) { }
+    protected PackingSequencePartiallyMatchedCrossover(PackingSequencePartiallyMatchedCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequencePartiallyMatchedCrossover()
+      : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequencePartiallyMatchedCrossover(this, cloner);
+    }
+
+    public override Permutation Cross(IRandom random, Permutation parent1, Permutation parent2) {
+      return PartiallyMatchedCrossover.Apply(random, parent1, parent2);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceRandomCreator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceRandomCreator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceRandomCreator.cs	(revision 16100)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequenceCreator", "Creator class used to create PackingSequence solutions for bin packing problems.")]
+  [StorableClass]
+  public class PackingSequenceRandomCreator : PackingSolutionCreator, IPackingSequenceCreator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<IntValue> NumberOfPackingItemsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["NumberOfItems"]; }
+    }
+
+    public ILookupParameter<Permutation> SolutionParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["PackingSequence"]; }
+    }
+
+    [StorableConstructor]
+    protected PackingSequenceRandomCreator(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceRandomCreator(PackingSequenceRandomCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequenceRandomCreator(this, cloner);
+    }
+
+    public PackingSequenceRandomCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfPackingItems", "The number of packing-items handled in this problem instance."));
+      Parameters.Add(new LookupParameter<Permutation>("PackingSequence", "The randomly created solution candidate."));
+    }
+
+    public override IOperation Apply() {
+      Apply(NumberOfPackingItemsParameter.ActualValue.Value, RandomParameter.ActualValue);
+      return base.Apply();
+    }
+
+    public static Permutation Apply(int items, IRandom random) {
+      return new Permutation(PermutationTypes.Absolute, items, random);
+    }
+    protected override IItem CreateSolution() {
+      return Apply(NumberOfPackingItemsParameter.ActualValue.Value, RandomParameter.ActualValue);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceScrambleManipulator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceScrambleManipulator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/PackingSequence/PackingSequenceScrambleManipulator.cs	(revision 16100)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Encodings.PackingEncoding.PackingSequence {
+  [Item("PackingSequence Scramble Manipulator", "An operator which manipulates a PackingSequence representation.")]
+  [StorableClass]
+  public class PackingSequenceScrambleManipulator : PackingSequenceManipulator, IPackingSequenceOperator {
+    [StorableConstructor]
+    protected PackingSequenceScrambleManipulator(bool deserializing) : base(deserializing) { }
+    protected PackingSequenceScrambleManipulator(PackingSequenceScrambleManipulator original, Cloner cloner) : base(original, cloner) { }
+    public PackingSequenceScrambleManipulator()
+      : base() {
+      EncodedSolutionParameter.ActualName = "PackingSequence";
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PackingSequenceScrambleManipulator(this, cloner);
+    }
+
+    protected override void Manipulate(IRandom random, Permutation individual) {
+      ScrambleManipulator.Apply(random, individual);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Problem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Problem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Problem.cs	(revision 16100)
@@ -0,0 +1,251 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.PluginInfrastructure;
+using System.Linq;
+using System;
+using HeuristicLab.Encodings.PackingEncoding;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [StorableClass]
+  public abstract class Problem<D, B, I> : SingleObjectiveHeuristicOptimizationProblem<IDecodingEvaluator, IPackingSolutionCreator>
+    where D : class, IPackingPosition
+    where B : PackingShape<D>, new()
+    where I : PackingShape<D>, IPackingItem, new() {
+
+
+    #region Parameter Properties
+    public OptionalValueParameter<PackingPlan<D, B, I>> BestKnownSolutionParameter {
+      get { return (OptionalValueParameter<PackingPlan<D, B, I>>)Parameters["BestKnownSolution"]; }
+    }
+    public ValueParameter<ItemList<I>> PackingItemMeasuresParameter {
+      get { return (ValueParameter<ItemList<I>>)Parameters["PackingItemMeasures"]; }
+    }
+    public IFixedValueParameter<IntValue> PackingItemsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["PackingItems"]; }
+    }
+    public IFixedValueParameter<IntValue> LowerBoundParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["LowerBound"]; }
+    }
+    public ValueParameter<IEvaluator> PackingPlanEvaluatorParameter {
+      get { return (ValueParameter<IEvaluator>)Parameters["PackingPlanEvaluator"]; }
+    }
+    public IValueParameter<B> PackingBinMeasuresParameter {
+      get { return (IValueParameter<B>)Parameters["PackingBinMeasures"]; }
+    }
+    public IConstrainedValueParameter<IPackingSolutionDecoder> PackingSolutionDecoderParameter {
+      get { return (IConstrainedValueParameter<IPackingSolutionDecoder>)Parameters["PackingSolutionDecoder"]; }
+    }
+    #endregion
+
+    #region Properties
+    public PackingPlan<D, B, I> BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+    public ItemList<I> PackingItemMeasures {
+      get { return PackingItemMeasuresParameter.Value; }
+      set { PackingItemMeasuresParameter.Value = value; }
+    }
+    public IEvaluator PackingPlanEvaluator {
+      get { return PackingPlanEvaluatorParameter.Value; }
+      set { PackingPlanEvaluatorParameter.Value = value; }
+    }
+    public B PackingBinMeasures {
+      get { return PackingBinMeasuresParameter.Value; }
+      set { PackingBinMeasuresParameter.Value = value; }
+    }
+    public PackingSolutionDecoder<D, B, I> PackingSolutionDecoder {
+      get { return PackingSolutionDecoderParameter.Value as PackingSolutionDecoder<D, B, I>; }
+      set { PackingSolutionDecoderParameter.Value = value; }
+    }
+    #endregion
+
+
+    [StorableConstructor]
+    protected Problem(bool deserializing) : base(deserializing) { }
+    protected Problem(Problem<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+      InitializeEventHandlers();
+    }
+
+    protected Problem(IDecodingEvaluator e) : this(e, new PackingSequenceRandomCreator()) { }
+
+    protected Problem(IDecodingEvaluator e, IPackingSolutionCreator c)
+      : base(e, c) {
+      Parameters.Add(new OptionalValueParameter<PackingPlan<D, B, I>>("BestKnownSolution", "The best known solution of this bin-packing instance."));
+      Parameters.Add(new ValueParameter<ItemList<I>>("PackingItemMeasures", "Packing-item data defining the measures of the different items that need to be packed.", new ItemList<I>()));
+
+      Parameters.Add(new FixedValueParameter<IntValue>("PackingItems", "The number of packing-items used in this bin packing instance.", new IntValue()));
+      Parameters.Add(new FixedValueParameter<IntValue>("LowerBound", "The lower possible number of bins needed to solve this problem (taken from Dell'Amico, Martello and Vigo; 2002)", new IntValue()));
+      Parameters.Add(new ValueParameter<B>("PackingBinMeasures", "Packing-bin data defining the measures of the used bins.", new B()));
+      Parameters.Add(new ValueParameter<IEvaluator>("PackingPlanEvaluator", "The evaluator is used to determine the quality of a solution.", CreateDefaultEvaluator()));
+      Parameters.Add(new ConstrainedValueParameter<IPackingSolutionDecoder>("PackingSolutionDecoder", "The operator that decodes the representation and creates a packing plan."));
+      this.Maximization.Value = true;
+      InitializeProblemInstance(); // TODO
+      InitializeOperators();
+      InitializeEventHandlers();
+    }
+
+    protected abstract void InitializeDecoder();
+    protected virtual void InitializeProblemInstance() {
+      InitializeProblemData();
+      ApplyHorizontalOrientation();
+      SortItems();
+      RemoveTooBigItems();
+      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+    protected virtual void InitializeOperators() {
+      Operators.Clear();
+      Operators.Add(new BestBinPackingSolutionAnalyzer<D, B, I>());
+
+      ApplyEncoding();
+      ParameterizeOperators();
+    }
+    protected virtual void InitializeEventHandlers() {
+      PackingPlanEvaluatorParameter.ValueChanged += PackingPlanEvaluatorParameter_ValueChanged;
+      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
+      SolutionCreatorParameter.ValueChanged += SolutionCreatorParameter_ValueChanged;
+      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
+      PackingSolutionDecoderParameter.ValueChanged += PackingSolutionDecoderParameter_ValueChanged;
+      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
+    }
+
+
+    protected abstract void RemoveTooBigItems();
+    protected abstract void InitializeProblemData();
+    protected abstract IEvaluator CreateDefaultEvaluator();
+    protected void ApplyHorizontalOrientation() {
+      PackingBinMeasures.ApplyHorizontalOrientation();
+      foreach (IPackingShape shape in PackingItemMeasures) {
+        shape.ApplyHorizontalOrientation();
+      }
+    }
+    protected void SortItems() {
+      PackingItemMeasures.Sort((x, y) => y.CompareTo(x));
+    }
+    protected 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 items = PackingItemMeasures.Select(x => x.Volume).Sum();
+      int bin = PackingBinMeasures.Volume;
+      return (items + bin - 1) / (bin);
+    }
+
+    private void ApplyEncoding() {
+      if (SolutionCreator.GetType() == typeof(PackingSequenceRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IPackingSequenceOperator>());
+        InitializeDecoder();
+      } /* else if (SolutionCreator.GetType() == typeof(GroupingVectorRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IGroupingVectorOperator>());
+        InitializeDecoder();
+      } else if (SolutionCreator.GetType() == typeof(MultiComponentVectorRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IMultiComponentVectorOperator>());
+        InitializeDecoder();
+      } */
+    }
+    private void ParameterizeOperators() {
+      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
+        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+      }
+
+      Evaluator.PackingSolutionDecoderParameter.ActualName = PackingSolutionDecoderParameter.Name;
+      Evaluator.PackingSolutionDecoderParameter.Hidden = true;
+      Evaluator.PackingPlanEvaluatorParameter.ActualName = PackingPlanEvaluatorParameter.Name;
+      Evaluator.PackingPlanEvaluatorParameter.Hidden = true;
+      Evaluator.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+      Evaluator.QualityParameter.Hidden = true;
+
+      if (PackingSolutionDecoder != null)
+        PackingSolutionDecoder.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+
+      if (PackingSolutionDecoder != null) {
+        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
+        PackingPlanEvaluator.PackingPlanParameter.Hidden = true;
+      } else {
+        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingPlanEvaluator.PackingPlanParameter.Name;
+        PackingPlanEvaluator.PackingPlanParameter.Hidden = false;
+      }
+      /*
+
+      foreach (var op in Operators.OfType<IPackingSolutionManipulator>()) {
+        op.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.EncodedSolutionParameter.Hidden = true;
+      }
+
+      foreach (var op in Operators.OfType<IPackingSolutionCrossover>()) {
+        op.ChildParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.ChildParameter.Hidden = true;
+        op.ParentsParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.ParentsParameter.Hidden = true;
+      }
+      */
+      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
+        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+        if (PackingSolutionDecoder != null) {
+          op.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
+          op.PackingPlanParameter.Hidden = true;
+        } else {
+          op.PackingPlanParameter.ActualName = op.PackingPlanParameter.Name;
+          op.PackingPlanParameter.Hidden = false;
+        }
+      }
+
+    }
+
+    #region Events
+    protected override void OnSolutionCreatorChanged() {
+      InitializeOperators();
+    }
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      ParameterizeOperators();
+    }
+    private void PackingPlanEvaluatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void PackingPlanEvaluator_QualityParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void SolutionCreator_EncodedSolutionParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+    private void PackingSolutionDecoderParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Problem2d.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Problem2d.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Problem2d.cs	(revision 16100)
@@ -0,0 +1,154 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  [Item("Bin Packing Problem (2D, identical rectangles) (BPP)", "Represents a two-dimensional bin-packing problem using only bins with identical measures and bins/items with rectangular shapes.")]
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 300)]
+  public class Problem : Problem<PackingPosition, PackingShape, PackingItem>, IProblemInstanceConsumer<BPPData>, IProblemInstanceExporter<BPPData> {
+
+    #region Default Instance
+    private static 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
+
+    [StorableConstructor]
+    protected Problem(bool deserializing) : base(deserializing) { }
+    protected Problem(Problem original, Cloner cloner)
+          : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Problem(this, cloner);
+    }
+    public Problem() : base(
+          new DecodingEvaluator<Permutation, PackingPosition, PackingShape, PackingItem>()) {
+    }
+
+    #region Problem instance handling
+    public void Load(BPPData data) {
+
+      BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
+
+      PackingBinMeasures = data.BinShape;
+      PackingItemMeasures = new ItemList<PackingItem>(data.Items);
+
+      ApplyHorizontalOrientation();
+      SortItems();
+      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+
+
+    public BPPData Export() {
+      return new BPPData {
+        Name = Name,
+        Description = Description,
+        BinShape = PackingBinMeasures,
+        Items = PackingItemMeasures.ToArray()
+      };
+    }
+    #endregion
+
+    #region Helpers
+    protected override void InitializeDecoder() {
+      // Operators.RemoveAll(op => op is I3DOperator); TODO
+
+      PackingSolutionDecoderParameter.ValidValues.Clear();
+      if (SolutionCreator is PackingSequenceRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I2DPSDecoder>());
+      } /*else if (SolutionCreator is GroupingVectorRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I2DGVDecoder>());
+      } else if (SolutionCreator is MultiComponentVectorRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I2DMCVDecoder>());
+      } */ else {
+        string error = "The given problem does not support the selected solution-creator.";
+        ErrorHandling.ShowErrorDialog(error, null);
+      }
+    }
+
+    protected override IEvaluator CreateDefaultEvaluator() {
+      return new PackingRatioEvaluator();
+    }
+
+    protected override void InitializeProblemData() {
+      Load(DefaultInstance);
+    }
+
+    protected override void RemoveTooBigItems() {
+      PackingItemMeasures.RemoveAll(pi =>
+        !PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, false), pi) &&
+        !PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, true), pi));
+    }
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/Problem3D.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/Problem3D.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/Problem3D.cs	(revision 16100)
@@ -0,0 +1,156 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.BinPacking;
+
+namespace HeuristicLab.Problems.BinPacking3D {
+  [Item("Bin Packing Problem (3D, identical cuboids) (BPP)", "Represents a three-dimensional bin-packing problem using only bins with identical measures and bins/items with cuboidic shapes.")]
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 310)]
+  public class Problem : Problem<PackingPosition, PackingShape, PackingItem>, IProblemInstanceConsumer<BPPData>, IProblemInstanceExporter<BPPData> {
+    #region Default Instance
+    private static 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
+
+    [StorableConstructor]
+    protected Problem(bool deserializing) : base(deserializing) { }
+    protected Problem(Problem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Problem(this, cloner);
+    }
+    public Problem() : base(
+      new DecodingEvaluator<Permutation, PackingPosition, PackingShape, PackingItem>()) {
+    }
+
+    public void Load(BPPData data) {
+
+
+      BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
+
+      PackingBinMeasures = data.BinShape;
+      PackingItemMeasures = new ItemList<PackingItem>(data.Items);
+
+      ApplyHorizontalOrientation();
+      SortItems();
+      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+
+    public BPPData Export() {
+      return new BPPData {
+        Name = Name,
+        Description = Description,
+        BinShape = PackingBinMeasures,
+        Items = PackingItemMeasures.ToArray()
+      };
+    }
+
+    #region Helpers
+    protected override void InitializeDecoder() {
+      // Operators.RemoveAll(op => op is I2DOperator); TODO
+
+      PackingSolutionDecoderParameter.ValidValues.Clear();
+      if (SolutionCreator is PackingSequenceRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I3DPSDecoder>());
+      } /* else if (SolutionCreator is GroupingVectorRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I3DGVDecoder>());
+      } else if (SolutionCreator is MultiComponentVectorRandomCreator) {
+        PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances<I3DMCVDecoder>());
+      } */ else {
+        string error = "The given problem does not support the selected solution-creator.";
+        ErrorHandling.ShowErrorDialog(error, null);
+      }
+    }
+
+    protected override IEvaluator CreateDefaultEvaluator() {
+      return new PackingRatioEvaluator();
+    }
+
+    protected override void InitializeProblemData() {
+      Load(DefaultInstance);
+    }
+
+    protected override void RemoveTooBigItems() {
+      PackingItemMeasures.RemoveAll(pi =>
+        !PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, 0, false), pi) &&
+        !PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, 0, true), pi));
+    }
+    #endregion
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/RealBPPData.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/RealBPPData.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/RealBPPData.cs	(revision 16100)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+
+namespace HeuristicLab.Problems.BinPacking2D {
+  /// <summary>
+  /// Describes instances of the regular two dimensional bin packing problem (2DBPP).
+  /// </summary>
+  public class RealBPPData : BPPData {
+    /// <summary>
+    /// The weight of the items.
+    /// </summary>
+    public double[] ItemWeights { get; set; }
+    /// <summary>
+    /// The category of packing material for each item.
+    /// </summary>
+    public int[] ItemMaterials { get; set; }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/RectangularPackingBin.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/RectangularPackingBin.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/RectangularPackingBin.cs	(revision 16100)
@@ -0,0 +1,44 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Problems.BinPacking.Shapes;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.BinPacking.PackingBin {
+  [Item("RectangularPackingBin", "Represents a rectangular bin for a two-dimensional bin-packing problem.")]
+  [StorableClass]
+  public class RectangularPackingBin : RectangularPackingShape, IPackingBin {
+    public RectangularPackingBin(int width, int height) : base(width, height) { }
+    public RectangularPackingBin() : base() { }
+
+    [StorableConstructor]
+    protected RectangularPackingBin(bool deserializing) : base(deserializing) { }
+    protected RectangularPackingBin(RectangularPackingBin original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RectangularPackingBin(this, cloner);
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/RegularIdenticalBinPackingProblem.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/RegularIdenticalBinPackingProblem.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/RegularIdenticalBinPackingProblem.cs	(revision 16100)
@@ -0,0 +1,221 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using System;
+using System.Linq;
+using HeuristicLab.Problems.BinPacking.Interfaces;
+using HeuristicLab.Problems.BinPacking.Shapes;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.BinPacking.Decoders;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.BinPacking.Analyzers;
+using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
+using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
+
+namespace HeuristicLab.Problems.BinPacking.Problem {
+  [Item("RegularIdenticalBinPackingProblem", "Represents a bin-packing problem-instance using only bins with identical measures and bins/items with regular shapes (e.g. rectangle, cuboid).")]
+  [StorableClass]
+  public abstract class RegularIdenticalBinPackingProblem<D, B, I> : BinPackingProblem<D, B, I>, IProblemInstanceConsumer<BPPData>, IProblemInstanceExporter<BPPData>
+    where D : class, IPackingDimensions
+    where B : PackingShape<D>, IPackingBin, IRegularPackingShape, new()
+    where I : PackingShape<D>, IPackingItem, IRegularPackingShape, new() {
+
+    #region Parameter Properties
+
+    #endregion
+
+    #region Properties
+
+    #endregion
+
+
+    [StorableConstructor]
+    protected RegularIdenticalBinPackingProblem(bool deserializing) : base(deserializing) { }
+    protected RegularIdenticalBinPackingProblem(RegularIdenticalBinPackingProblem<D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+      InitializeEventHandlers();
+    }
+
+    protected RegularIdenticalBinPackingProblem(IPackingPlanEvaluationAlgorithm e) : this(e, new MultiComponentVectorRandomCreator()) { }
+    protected RegularIdenticalBinPackingProblem(IPackingPlanEvaluationAlgorithm e, IPackingSolutionCreator c)
+      : base(e, c) {
+      Parameters.Add(new ValueParameter<B>("PackingBinMeasures", "Packing-bin data defining the measures of the used bins.", new B()));
+      Parameters.Add(new ValueParameter<IPackingPlanEvaluator>("PackingPlanEvaluator", "The evaluator is used to determine the quality of a solution.", CreateDefaultEvaluator()));
+      Parameters.Add(new ConstrainedValueParameter<IPackingSolutionDecoder>("PackingSolutionDecoder", "The operator that decodes the representation and creates a packing plan."));
+      this.Maximization.Value = true;
+      InitializeProblemInstance();
+      InitializeOperators();
+      InitializeEventHandlers();
+    }
+
+
+
+
+    #region Helpers
+    protected override void InitializeProblemInstance() {
+      InitializeProblemData();
+      ApplyHorizontalOrientation();
+      SortItems();
+      RemoveTooBigItems();
+      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
+      LowerBoundParameter.Value.Value = CalculateLowerBound();
+    }
+    protected abstract void RemoveTooBigItems();
+    protected abstract void InitializeProblemData();
+    protected abstract IPackingPlanEvaluator CreateDefaultEvaluator();
+    protected void ApplyHorizontalOrientation() {
+      PackingBinMeasures.ApplyHorizontalOrientation();
+      foreach (IRegularPackingShape shape in PackingItemMeasures) {
+        shape.ApplyHorizontalOrientation();
+      }
+    }
+    protected void SortItems() {
+      PackingItemMeasures.Sort((x, y) => y.CompareTo(x));
+    }
+    protected 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 items = PackingItemMeasures.Select(x => x.Volume).Sum();
+      int bin = PackingBinMeasures.Volume;
+      return (items + bin - 1) / (bin);
+    }
+
+    protected override void InitializeOperators() {
+      Operators.Clear();
+      Operators.Add(new BestBinPackingSolutionAnalyzer<D, B, I>());
+
+      ApplyEncoding();
+      ParameterizeOperators();
+    }
+    private void ApplyEncoding() {
+      if (SolutionCreator.GetType() == typeof(PackingSequenceRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IPackingSequenceOperator>());
+        InitializeDecoder();
+      } else if (SolutionCreator.GetType() == typeof(GroupingVectorRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IGroupingVectorOperator>());
+        InitializeDecoder();
+      } else if (SolutionCreator.GetType() == typeof(MultiComponentVectorRandomCreator)) {
+        Operators.AddRange(ApplicationManager.Manager.GetInstances<IMultiComponentVectorOperator>());
+        InitializeDecoder();
+      }
+    }
+    private void ParameterizeOperators() {
+      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
+        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+      }
+
+      Evaluator.PackingSolutionDecoderParameter.ActualName = PackingSolutionDecoderParameter.Name;
+      Evaluator.PackingSolutionDecoderParameter.Hidden = true;
+      Evaluator.PackingPlanEvaluatorParameter.ActualName = PackingPlanEvaluatorParameter.Name;
+      Evaluator.PackingPlanEvaluatorParameter.Hidden = true;
+      Evaluator.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+      Evaluator.QualityParameter.Hidden = true;
+
+      if (PackingSolutionDecoder != null)
+        PackingSolutionDecoder.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+
+      if (PackingSolutionDecoder != null) {
+        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
+        PackingPlanEvaluator.PackingPlanParameter.Hidden = true;
+      } else {
+        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingPlanEvaluator.PackingPlanParameter.Name;
+        PackingPlanEvaluator.PackingPlanParameter.Hidden = false;
+      }
+
+      foreach (var op in Operators.OfType<IPackingSolutionManipulator>()) {
+        op.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.EncodedSolutionParameter.Hidden = true;
+      }
+
+      foreach (var op in Operators.OfType<IPackingSolutionCrossover>()) {
+        op.ChildParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.ChildParameter.Hidden = true;
+        op.ParentsParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
+        op.ParentsParameter.Hidden = true;
+      }
+
+      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
+        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
+        if (PackingSolutionDecoder != null) {
+          op.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
+          op.PackingPlanParameter.Hidden = true;
+        } else {
+          op.PackingPlanParameter.ActualName = op.PackingPlanParameter.Name;
+          op.PackingPlanParameter.Hidden = false;
+        }
+      }
+
+    }
+
+    protected override void InitializeEventHandlers() {
+      PackingPlanEvaluatorParameter.ValueChanged += PackingPlanEvaluatorParameter_ValueChanged;
+      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
+      SolutionCreatorParameter.ValueChanged += SolutionCreatorParameter_ValueChanged;
+      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
+      PackingSolutionDecoderParameter.ValueChanged += PackingSolutionDecoderParameter_ValueChanged;
+      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
+    }
+
+    #endregion
+
+    #region Events
+    protected override void OnSolutionCreatorChanged() {
+      InitializeOperators();
+    }
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      ParameterizeOperators();
+    }
+    private void PackingPlanEvaluatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void PackingPlanEvaluator_QualityParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void SolutionCreator_EncodedSolutionParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+    private void PackingSolutionDecoderParameter_ValueChanged(object sender, EventArgs eventArgs) {
+      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
+      ParameterizeOperators();
+    }
+    private void PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
+      ParameterizeOperators();
+    }
+
+    public abstract void Load(BPPData data);
+
+    public abstract BPPData Export();
+    #endregion
+
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/evaluators/DecodingEvaluator.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/evaluators/DecodingEvaluator.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/evaluators/DecodingEvaluator.cs	(revision 16100)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Operators;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("Bin Packing Evaluator (with decoder)", "Represents a composition of a decoder and an evaluator for bin-packing problems.")]
+  [StorableClass]
+  public class DecodingEvaluator<E, D, B, I> : SingleSuccessorOperator, IDecodingEvaluator
+    where E : Item //E defines the used Encoding
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    public IValueLookupParameter<IPackingSolutionDecoder> PackingSolutionDecoderParameter {
+      get { return (IValueLookupParameter<IPackingSolutionDecoder>)Parameters["PackingSolutionDecoder"]; }
+    }
+    ILookupParameter<IPackingSolutionDecoder> IDecodingEvaluator.PackingSolutionDecoderParameter {
+      get { return PackingSolutionDecoderParameter; }
+    }
+    public IValueLookupParameter<IEvaluator> PackingPlanEvaluatorParameter {
+      get { return (IValueLookupParameter<IEvaluator>)Parameters["PackingPlanEvaluator"]; }
+    }
+    ILookupParameter<IEvaluator> IDecodingEvaluator.PackingPlanEvaluatorParameter {
+      get { return PackingPlanEvaluatorParameter; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    [StorableConstructor]
+    protected DecodingEvaluator(bool deserializing) : base(deserializing) { }
+    protected DecodingEvaluator(DecodingEvaluator<E, D, B, I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public DecodingEvaluator ()
+      : base() {
+        Parameters.Add(new ValueLookupParameter<IPackingSolutionDecoder>("PackingSolutionDecoder", "The decoding operator that is used to calculate a packing plan from the used representation."));
+        Parameters.Add(new ValueLookupParameter<IEvaluator>("PackingPlanEvaluator", "The actual packing plan evaluation operator."));
+        Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
+        QualityParameter.Hidden = true;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DecodingEvaluator<E, D, B, I>(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var decoder = PackingSolutionDecoderParameter.ActualValue;
+      var evaluator = PackingPlanEvaluatorParameter.ActualValue;
+      if (evaluator == null) throw new InvalidOperationException("A PackingPlanEvaluator could not be found.");
+
+      var operations = new OperationCollection(base.Apply());
+      operations.Insert(0, ExecutionContext.CreateChildOperation(evaluator));
+      if (decoder != null) // decode before evaluating
+        operations.Insert(0, ExecutionContext.CreateChildOperation(decoder));
+      return operations;
+    }
+  }
+}
Index: /branches/1966_HeuristicLab.BinPacking/old files/evaluators/EvaluatorBase.cs
===================================================================
--- /branches/1966_HeuristicLab.BinPacking/old files/evaluators/EvaluatorBase.cs	(revision 16100)
+++ /branches/1966_HeuristicLab.BinPacking/old files/evaluators/EvaluatorBase.cs	(revision 16100)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Problems.BinPacking {
+  [Item("Packingplan Evaluator", "Represents a evaluator class for standard bin-packing problems.")]
+  [StorableClass]
+  public abstract class EvaluatorBase<D,B,I> : SingleSuccessorOperator, IEvaluator
+    where D : class, IPackingPosition
+    where B : PackingShape<D>
+    where I : PackingShape<D>, IPackingItem {
+
+    #region Parameters
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get {
+        if (Parameters.ContainsKey("Quality"))
+          return (ILookupParameter<DoubleValue>)Parameters["Quality"];
+        else
+          return null;
+      }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlan"]; }
+    }
+    public ILookupParameter<ItemList<I>> PackingItemMeasuresParameter {
+      get { return (ILookupParameter<ItemList<I>>)Parameters["PackingItemMeasures"]; }
+    }
+    public ILookupParameter<B> PackingBinMeasuresParameter {
+      get { return (ILookupParameter<B>)Parameters["PackingBinMeasures"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected EvaluatorBase(bool deserializing) : base(deserializing) { }
+    protected EvaluatorBase(EvaluatorBase<D,B,I> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public EvaluatorBase()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value of the solution."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlan", "The decoded bin-packing solution represented as generalized packing-plan."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new LookupParameter<ItemList<I>>("PackingItemMeasures", "Packing-item data taken from the bin-packing problem-instance."));
+      Parameters.Add(new LookupParameter<B>("PackingBinMeasures", "Packing-bin data taken from the bin-packing problem-instance."));
+
+    }
+
+    protected abstract double Evaluate();                                                                        
+    public override IOperation Apply() {
+      QualityParameter.ActualValue = new DoubleValue(Evaluate());
+      return base.Apply();
+    }
+  }
+}
