Index: /branches/2605_StackingProblems/Build.cmd
===================================================================
--- /branches/2605_StackingProblems/Build.cmd	(revision 16114)
+++ /branches/2605_StackingProblems/Build.cmd	(revision 16114)
@@ -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/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/HeuristicLab.Data.MoveVectorData.Views-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/HeuristicLab.Data.MoveVectorData.Views-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/HeuristicLab.Data.MoveVectorData.Views-3.3.csproj	(revision 16114)
@@ -0,0 +1,137 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{7F410472-F5B5-4FFF-BA3B-07CF01813572}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Data.MoveVectorData.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Data.MoveVectorData.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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </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">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StackingAreaView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StackingAreaView.Designer.cs">
+      <DependentUpon>StackingAreaView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StackView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StackView.Designer.cs">
+      <DependentUpon>StackView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj">
+      <Project>{471e9356-0eb6-426b-ae34-988e0c7632c2}</Project>
+      <Name>HeuristicLab.Data.MoveVectorData-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="StackingAreaView.resx">
+      <DependentUpon>StackingAreaView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StackView.resx">
+      <DependentUpon>StackView.cs</DependentUpon>
+    </EmbeddedResource>
+  </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/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,27 @@
+﻿using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Data.MoveVectorData.Views
+{
+
+    [Plugin("HeuristicLab.Data.MoveVectorData.Views", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Data.MoveVectorData.Views-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Data.MoveVectorData", "3.3")]
+    [PluginDependency("HeuristicLab.MainForm", "3.3")]
+    [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+
+    public class HeuristicLabDataMoveVectorDataViewsPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.Data.MoveVectorData.Views-3.3")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Data.MoveVectorData.Views")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[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("7f410472-f5b5-4fff-ba3b-07cf01813572")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.Designer.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.Designer.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.Designer.cs	(revision 16114)
@@ -0,0 +1,96 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StackView {
+    /// <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) {
+        if (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.components = new System.ComponentModel.Container();
+            this.dataGridView = new System.Windows.Forms.DataGridView();
+            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dataGridView
+            // 
+            this.dataGridView.AllowUserToAddRows = false;
+            this.dataGridView.AllowUserToDeleteRows = false;
+            this.dataGridView.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.dataGridView.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
+            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView.ColumnHeadersVisible = false;
+            this.dataGridView.Location = new System.Drawing.Point(0, 0);
+            this.dataGridView.Name = "dataGridView";
+            this.dataGridView.Size = new System.Drawing.Size(424, 404);
+            this.dataGridView.TabIndex = 2;
+            this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+            this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
+            this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+            this.dataGridView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView_KeyDown);
+            // 
+            // errorProvider
+            // 
+            this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+            this.errorProvider.ContainerControl = this;
+            // 
+            // StackView
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+            this.Controls.Add(this.dataGridView);
+            this.Name = "StackView";
+            this.Size = new System.Drawing.Size(424, 404);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+            this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.DataGridView dataGridView;
+    protected System.Windows.Forms.ErrorProvider errorProvider;
+
+  }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.cs	(revision 16114)
@@ -0,0 +1,242 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Data.MoveVectorData;
+using System.Linq;
+
+namespace HeuristicLab.Data.Views
+{
+    [View("Stack View")]
+    [Content(typeof(Stack), true)]
+    public partial class StackView : AsynchronousContentView
+    {
+        protected int[] virtualRowIndices;
+
+        public new IStringConvertibleArray Content
+        {
+            get { return (IStringConvertibleArray)base.Content; }
+            set { base.Content = value; }
+        }
+
+        public override bool ReadOnly
+        {
+            get
+            {
+                if ((Content != null) && Content.ReadOnly) return true;
+                return base.ReadOnly;
+            }
+            set { base.ReadOnly = value; }
+        }
+
+        public StackView()
+        {
+            InitializeComponent();
+        }
+
+        protected override void DeregisterContentEvents()
+        {
+            Content.ElementNamesChanged -= new EventHandler(Content_ElementNamesChanged);
+            Content.ItemChanged -= new EventHandler<EventArgs<int>>(Content_ItemChanged);
+            Content.Reset -= new EventHandler(Content_Reset);
+            base.DeregisterContentEvents();
+        }
+
+        protected override void RegisterContentEvents()
+        {
+            base.RegisterContentEvents();
+            Content.ItemChanged += new EventHandler<EventArgs<int>>(Content_ItemChanged);
+            Content.Reset += new EventHandler(Content_Reset);
+            Content.ElementNamesChanged += new EventHandler(Content_ElementNamesChanged);
+        }
+
+        protected override void OnContentChanged()
+        {
+            base.OnContentChanged();
+            if (Content == null)
+            {
+                dataGridView.Rows.Clear();
+                dataGridView.Columns.Clear();
+                virtualRowIndices = new int[0];
+            }
+            else
+                UpdateData();
+        }
+
+        protected override void SetEnabledStateOfControls()
+        {
+            base.SetEnabledStateOfControls();
+            dataGridView.Enabled = Content != null;
+            dataGridView.ReadOnly = ReadOnly;
+        }
+
+        private void UpdateData()
+        {
+            virtualRowIndices = Enumerable.Range(0, Content.Length).Reverse().ToArray();
+
+            dataGridView.Rows.Clear();
+            dataGridView.Columns.Clear();
+            if (Content.Length > 0)
+            {
+                dataGridView.ColumnCount++;
+                dataGridView.Columns[0].FillWeight = float.Epsilon;  // sum of all fill weights must not be larger than 65535
+                dataGridView.RowCount = Content.Length;
+                for (int i = 0; i < Content.Length; i++)
+                {
+                    int rowIndex = this.virtualRowIndices[i];
+                    dataGridView.Rows[i].Cells[0].Value = Content.GetValue(rowIndex);
+                }
+                dataGridView.Columns[0].Width = dataGridView.Columns[0].GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
+            }
+            UpdateRowHeaders();
+            dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+            dataGridView.Enabled = true;
+        }
+
+        public virtual void UpdateRowHeaders()
+        {
+            int i = 0;
+            int count = dataGridView.RowCount;
+            foreach (string elementName in Content.ElementNames)
+            {
+                dataGridView.Rows[i].HeaderCell.Value = elementName;
+                i++;
+            }
+            for (; i < dataGridView.RowCount; i++)
+            {
+                dataGridView.Rows[i].HeaderCell.Value = "Tier " + (count - i - 1);
+            }
+        }
+
+        private void Content_ElementNamesChanged(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler(Content_ElementNamesChanged), sender, e);
+            else
+                UpdateRowHeaders();
+        }
+
+        private void Content_ItemChanged(object sender, EventArgs<int> e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler<EventArgs<int>>(Content_ItemChanged), sender, e);
+            else {
+                // if a resize of the array occurs and some other class handles the event and provides default values
+                //then the itemChanged will occur before the reset event. hence the check was added
+                if (dataGridView.RowCount <= e.Value) return;
+                int rowIndex = this.virtualRowIndices[e.Value];
+                dataGridView.Rows[e.Value].Cells[0].Value = Content.GetValue(rowIndex);
+                Size size = dataGridView.Rows[e.Value].Cells[0].PreferredSize;
+                dataGridView.Columns[0].Width = Math.Max(dataGridView.Columns[0].Width, size.Width);
+            }
+        }
+        private void Content_Reset(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler(Content_Reset), sender, e);
+            else
+                UpdateData();
+        }
+
+        #region DataGridView Events
+        private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
+        {
+            string errorMessage;
+            if (Content != null && !Content.Validate(e.FormattedValue.ToString(), out errorMessage))
+            {
+                e.Cancel = true;
+                dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+            }
+        }
+        private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
+        {
+            string value = e.Value.ToString();
+            int rowIndex = virtualRowIndices[e.RowIndex];
+            e.ParsingApplied = Content.SetValue(value, rowIndex);
+            if (e.ParsingApplied) e.Value = Content.GetValue(rowIndex);
+        }
+        private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
+        {
+            dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+        }
+        private void dataGridView_KeyDown(object sender, KeyEventArgs e)
+        {
+            if (!ReadOnly && e.Control && e.KeyCode == Keys.V)
+                PasteValuesToDataGridView();
+            else if (e.Control && e.KeyCode == Keys.C)
+                CopyValuesFromDataGridView();
+            else if (e.Control && e.KeyCode == Keys.A)
+                dataGridView.SelectAll();
+        }
+        private void CopyValuesFromDataGridView()
+        {
+            if (dataGridView.SelectedCells.Count == 0) return;
+            StringBuilder s = new StringBuilder();
+            int minRowIndex = dataGridView.SelectedCells[0].RowIndex;
+            int maxRowIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].RowIndex;
+
+            if (minRowIndex > maxRowIndex)
+            {
+                int temp = minRowIndex;
+                minRowIndex = maxRowIndex;
+                maxRowIndex = temp;
+            }
+
+            for (int i = minRowIndex; i <= maxRowIndex; i++)
+            {
+                int rowIndex = this.virtualRowIndices[i];
+
+                DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+                DataGridViewCell cell = dataGridView[column.Index, i];
+                if (cell.Selected)
+                {
+                    s.Append(Content.GetValue(rowIndex));
+                    s.Append(Environment.NewLine);
+                }
+            }
+            Clipboard.SetText(s.ToString());
+        }
+        private void PasteValuesToDataGridView()
+        {
+            string[] values = SplitClipboardString(Clipboard.GetText());
+            int rowIndex = 0;
+            if (dataGridView.CurrentCell != null)
+                rowIndex = dataGridView.CurrentCell.RowIndex;
+
+            if (Content.Length < rowIndex + values.Length) Content.Length = rowIndex + values.Length;
+            for (int row = 0; row < values.Length; row++)
+                Content.SetValue(values[row], row + rowIndex);
+        }
+        private string[] SplitClipboardString(string clipboardText)
+        {
+            if (clipboardText.EndsWith(Environment.NewLine))
+                clipboardText = clipboardText.Remove(clipboardText.Length - Environment.NewLine.Length);  //remove last newline constant
+            return clipboardText.Split(new string[] { Environment.NewLine, "\t" }, StringSplitOptions.None);
+        }
+        #endregion
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.resx
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.resx	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackView.resx	(revision 16114)
@@ -0,0 +1,123 @@
+﻿<?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>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.Designer.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.Designer.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.Designer.cs	(revision 16114)
@@ -0,0 +1,102 @@
+﻿namespace HeuristicLab.Data.MoveVectorData.Views
+{
+    partial class StackingAreaView
+    {
+        /// <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)
+            {
+                if (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.components = new System.ComponentModel.Container();
+            this.dataGridView = new System.Windows.Forms.DataGridView();
+            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.ShowHideColumns = new System.Windows.Forms.ToolStripMenuItem();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+            this.contextMenu.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // dataGridView
+            // 
+            this.dataGridView.AllowUserToAddRows = false;
+            this.dataGridView.AllowUserToDeleteRows = false;
+            this.dataGridView.AllowUserToOrderColumns = true;
+            this.dataGridView.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.dataGridView.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.Disable;
+            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
+            this.dataGridView.Location = new System.Drawing.Point(0, 0);
+            this.dataGridView.Name = "dataGridView";
+            this.dataGridView.RowHeadersWidth = 160;
+            this.dataGridView.Size = new System.Drawing.Size(424, 401);
+            this.dataGridView.TabIndex = 4;
+            this.dataGridView.VirtualMode = true;
+            this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+            this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
+            this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+            this.dataGridView.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.dataGridView_CellValueNeeded);
+            this.dataGridView.Scroll += new System.Windows.Forms.ScrollEventHandler(this.dataGridView_Scroll);
+            this.dataGridView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView_KeyDown);
+            this.dataGridView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.dataGridView_MouseClick);
+            this.dataGridView.Resize += new System.EventHandler(this.dataGridView_Resize);
+            // 
+            // errorProvider
+            // 
+            this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+            this.errorProvider.ContainerControl = this;
+            // 
+            // contextMenu
+            // 
+            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.ShowHideColumns});
+            this.contextMenu.Name = "contextMenu";
+            this.contextMenu.Size = new System.Drawing.Size(68, 26);
+            // 
+            // ShowHideColumns
+            // 
+            this.ShowHideColumns.Name = "ShowHideColumns";
+            this.ShowHideColumns.Size = new System.Drawing.Size(67, 22);
+            // 
+            // StackingAreaView
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+            this.Controls.Add(this.dataGridView);
+            this.Name = "StackingAreaView";
+            this.Size = new System.Drawing.Size(424, 404);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+            this.contextMenu.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+        #endregion
+        protected System.Windows.Forms.ErrorProvider errorProvider;
+        protected System.Windows.Forms.ContextMenuStrip contextMenu;
+        protected System.Windows.Forms.ToolStripMenuItem ShowHideColumns;
+        protected System.Windows.Forms.DataGridView dataGridView;
+
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.cs	(revision 16114)
@@ -0,0 +1,349 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Data.MoveVectorData.Views
+{
+    [View("Stacking Area View")]
+    [Content(typeof(StackingArea), IsDefaultView = true)]
+    public partial class StackingAreaView : AsynchronousContentView
+    {
+        protected int[] virtualRowIndices;
+
+        public new IStringConvertibleMatrix Content
+        {
+            get { return (IStringConvertibleMatrix)base.Content; }
+            set { base.Content = value; }
+        }
+
+        public DataGridView DataGridView
+        {
+            get { return dataGridView; }
+        }
+
+        public override bool ReadOnly
+        {
+            get
+            {
+                if ((Content != null) && Content.ReadOnly) return true;
+                return base.ReadOnly;
+            }
+            set { base.ReadOnly = value; }
+        }
+
+        public StackingAreaView()
+        {
+            InitializeComponent();
+        }
+
+        protected override void DeregisterContentEvents()
+        {
+            Content.ItemChanged -= new EventHandler<EventArgs<int, int>>(Content_ItemChanged);
+            Content.Reset -= new EventHandler(Content_Reset);
+            Content.ColumnNamesChanged -= new EventHandler(Content_ColumnNamesChanged);
+            Content.RowNamesChanged -= new EventHandler(Content_RowNamesChanged);
+            base.DeregisterContentEvents();
+        }
+        protected override void RegisterContentEvents()
+        {
+            base.RegisterContentEvents();
+            Content.ItemChanged += new EventHandler<EventArgs<int, int>>(Content_ItemChanged);
+            Content.Reset += new EventHandler(Content_Reset);
+            Content.ColumnNamesChanged += new EventHandler(Content_ColumnNamesChanged);
+            Content.RowNamesChanged += new EventHandler(Content_RowNamesChanged);
+        }
+
+        protected override void OnContentChanged()
+        {
+            base.OnContentChanged();
+            if (Content == null)
+            {
+                dataGridView.Rows.Clear();
+                dataGridView.Columns.Clear();
+                virtualRowIndices = new int[0];
+            }
+            else if (!dataGridView.IsCurrentCellInEditMode)
+            {
+                UpdateData();
+            }
+        }
+
+        protected override void SetEnabledStateOfControls()
+        {
+            base.SetEnabledStateOfControls();
+            dataGridView.Enabled = Content != null;
+            dataGridView.ReadOnly = ReadOnly;
+        }
+
+        protected virtual void UpdateData()
+        {
+            virtualRowIndices = Enumerable.Range(0, Content.Rows).Reverse().ToArray();
+
+            if (Content.Columns == 0 && dataGridView.ColumnCount != Content.Columns && !Content.ReadOnly)
+                Content.Columns = dataGridView.ColumnCount;
+            else {
+                DataGridViewColumn[] columns = new DataGridViewColumn[Content.Columns];
+                for (int i = 0; i < columns.Length; ++i)
+                {
+                    var column = new DataGridViewTextBoxColumn();
+                    column.FillWeight = 1;
+                    columns[i] = column;
+                }
+                dataGridView.Columns.Clear();
+                dataGridView.Columns.AddRange(columns);
+            }
+
+            //DataGridViews with rows but no columns are not allowed !
+            if (Content.Rows == 0 && dataGridView.RowCount != Content.Rows && !Content.ReadOnly)
+                Content.Rows = dataGridView.RowCount;
+            else
+                dataGridView.RowCount = Content.Rows;
+
+            UpdateColumnHeaders();
+            UpdateRowHeaders();
+
+            dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader);
+            dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+            dataGridView.Enabled = true;
+        }
+
+        public virtual void UpdateColumnHeaders()
+        {
+            HashSet<string> invisibleColumnNames = new HashSet<string>(dataGridView.Columns.OfType<DataGridViewColumn>()
+            .Where(c => !c.Visible && !string.IsNullOrEmpty(c.HeaderText)).Select(c => c.HeaderText));
+
+            for (int i = 0; i < dataGridView.ColumnCount; i++)
+            {
+                if (i < Content.ColumnNames.Count())
+                    dataGridView.Columns[i].HeaderText = Content.ColumnNames.ElementAt(i);
+                else
+                    dataGridView.Columns[i].HeaderText = "Stack " + (i + 1 - 1);
+                dataGridView.Columns[i].Visible = !invisibleColumnNames.Contains(dataGridView.Columns[i].HeaderText);
+            }
+        }
+        public virtual void UpdateRowHeaders()
+        {
+            int index = dataGridView.FirstDisplayedScrollingRowIndex;
+            if (index == -1) index = 0;
+            int updatedRows = 0;
+            int count = dataGridView.DisplayedRowCount(true);
+
+            while (updatedRows < count)
+            {
+                if (virtualRowIndices[index] < Content.RowNames.Count())
+                    dataGridView.Rows[index].HeaderCell.Value = Content.RowNames.ElementAt(virtualRowIndices[index]);
+                else
+                    dataGridView.Rows[index].HeaderCell.Value = "Tier " + (count - index - 1);
+                if (dataGridView.Rows[index].Visible)
+                    updatedRows++;
+                index++;
+            }
+        }
+
+        private void Content_RowNamesChanged(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler(Content_RowNamesChanged), sender, e);
+            else
+                UpdateRowHeaders();
+        }
+        private void Content_ColumnNamesChanged(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler(Content_ColumnNamesChanged), sender, e);
+            else
+                UpdateColumnHeaders();
+        }
+        private void Content_ItemChanged(object sender, EventArgs<int, int> e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler<EventArgs<int, int>>(Content_ItemChanged), sender, e);
+            else
+                dataGridView.InvalidateCell(e.Value2, e.Value);
+        }
+        private void Content_Reset(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+                Invoke(new EventHandler(Content_Reset), sender, e);
+            else
+                UpdateData();
+        }
+
+        #region DataGridView Events
+        protected virtual void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
+        {
+            if (!dataGridView.ReadOnly)
+            {
+                string errorMessage;
+                if (Content != null && !Content.Validate(e.FormattedValue.ToString(), out errorMessage))
+                {
+                    e.Cancel = true;
+                    dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+                }
+            }
+        }
+        protected virtual void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
+        {
+            if (!dataGridView.ReadOnly)
+            {
+                string value = e.Value.ToString();
+                int rowIndex = virtualRowIndices[e.RowIndex];
+                e.ParsingApplied = Content != null && Content.SetValue(value, rowIndex, e.ColumnIndex);
+                if (e.ParsingApplied) e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
+            }
+        }
+        private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
+        {
+            dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+        }
+        protected virtual void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
+        {
+            if (Content != null && e.RowIndex < Content.Rows && e.ColumnIndex < Content.Columns)
+            {
+                int rowIndex = virtualRowIndices[e.RowIndex];
+                e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
+            }
+        }
+
+        private void dataGridView_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
+        {
+            this.UpdateRowHeaders();
+        }
+        private void dataGridView_Resize(object sender, EventArgs e)
+        {
+            this.UpdateRowHeaders();
+        }
+
+        protected virtual void dataGridView_KeyDown(object sender, KeyEventArgs e)
+        {
+            if (!ReadOnly && e.Control && e.KeyCode == Keys.V)
+                PasteValuesToDataGridView();
+            else if (e.Control && e.KeyCode == Keys.C)
+                CopyValuesFromDataGridView();
+        }
+
+        private void CopyValuesFromDataGridView()
+        {
+            if (dataGridView.SelectedCells.Count == 0) return;
+            StringBuilder s = new StringBuilder();
+            int minRowIndex = dataGridView.SelectedCells[0].RowIndex;
+            int maxRowIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].RowIndex;
+            int minColIndex = dataGridView.SelectedCells[0].ColumnIndex;
+            int maxColIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].ColumnIndex;
+
+            if (minRowIndex > maxRowIndex)
+            {
+                int temp = minRowIndex;
+                minRowIndex = maxRowIndex;
+                maxRowIndex = temp;
+            }
+            if (minColIndex > maxColIndex)
+            {
+                int temp = minColIndex;
+                minColIndex = maxColIndex;
+                maxColIndex = temp;
+            }
+
+            bool addRowNames = dataGridView.AreAllCellsSelected(false) && Content.RowNames.Count() > 0;
+            bool addColumnNames = dataGridView.AreAllCellsSelected(false) && Content.ColumnNames.Count() > 0;
+
+            //add colum names
+            if (addColumnNames)
+            {
+                if (addRowNames)
+                    s.Append('\t');
+
+                DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+                while (column != null)
+                {
+                    s.Append(column.HeaderText);
+                    s.Append('\t');
+                    column = dataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+                }
+                s.Remove(s.Length - 1, 1); //remove last tab
+                s.Append(Environment.NewLine);
+            }
+
+            for (int i = minRowIndex; i <= maxRowIndex; i++)
+            {
+                if (!dataGridView.Rows[i].Visible) continue;
+
+                int rowIndex = this.virtualRowIndices[i];
+                if (addRowNames)
+                {
+                    s.Append(Content.RowNames.ElementAt(rowIndex));
+                    s.Append('\t');
+                }
+
+                DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+                while (column != null)
+                {
+                    DataGridViewCell cell = dataGridView[column.Index, i];
+                    if (cell.Selected)
+                    {
+                        s.Append(Content.GetValue(rowIndex, column.Index));
+                        s.Append('\t');
+                    }
+
+                    column = dataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+                }
+                s.Remove(s.Length - 1, 1); //remove last tab
+                s.Append(Environment.NewLine);
+            }
+            Clipboard.SetText(s.ToString());
+        }
+
+        protected virtual void PasteValuesToDataGridView()
+        {
+            string[,] values = SplitClipboardString(Clipboard.GetText());
+            int rowIndex = 0;
+            int columnIndex = 0;
+            if (dataGridView.CurrentCell != null)
+            {
+                rowIndex = virtualRowIndices[dataGridView.CurrentCell.RowIndex];
+                columnIndex = dataGridView.CurrentCell.ColumnIndex;
+            }
+            if (Content.Rows < values.GetLength(1) + rowIndex) Content.Rows = values.GetLength(1) + rowIndex;
+            if (Content.Columns < values.GetLength(0) + columnIndex) Content.Columns = values.GetLength(0) + columnIndex;
+
+            for (int row = 0; row < values.GetLength(1); row++)
+            {
+                for (int col = 0; col < values.GetLength(0); col++)
+                {
+                    Content.SetValue(values[col, values.GetLength(1) - 1 - row], row + rowIndex, col + columnIndex);
+                }
+            }
+        }
+        protected string[,] SplitClipboardString(string clipboardText)
+        {
+            if (clipboardText.EndsWith(Environment.NewLine))
+                clipboardText = clipboardText.Remove(clipboardText.Length - Environment.NewLine.Length);  //remove last newline constant
+            string[,] values = null;
+            string[] lines = clipboardText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
+            string[] cells;
+            for (int i = 0; i < lines.Length; i++)
+            {
+                cells = lines[i].Split('\t');
+                if (values == null)
+                    values = new string[cells.Length, lines.Length];
+                for (int j = 0; j < cells.Length; j++)
+                    values[j, i] = string.IsNullOrEmpty(cells[j]) ? string.Empty : cells[j];
+            }
+            return values;
+        }
+
+        protected virtual void dataGridView_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
+        {
+            if (Content == null) return;
+            if (e.Button == MouseButtons.Right && Content.ColumnNames.Count() != 0)
+                contextMenu.Show(MousePosition);
+        }
+    }
+    #endregion
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.resx
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.resx	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData.Views/3.3/StackingAreaView.resx	(revision 16114)
@@ -0,0 +1,126 @@
+﻿<?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>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="contextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>134, 17</value>
+  </metadata>
+</root>
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/HeuristicLab.Data.MoveVectorData-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/HeuristicLab.Data.MoveVectorData-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/HeuristicLab.Data.MoveVectorData-3.3.csproj	(revision 16114)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{471E9356-0EB6-426B-AE34-988E0C7632C2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Data.MoveVectorData</RootNamespace>
+    <AssemblyName>HeuristicLab.Data.MoveVectorData-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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </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">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Interfaces\IMove.cs" />
+    <Compile Include="Moves\IngoingMove.cs" />
+    <Compile Include="Moves\OutgoingMove.cs" />
+    <Compile Include="Moves\TwoPointMove.cs" />
+    <Compile Include="MoveValue.cs" />
+    <Compile Include="MoveVector.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Stack.cs" />
+    <Compile Include="StackingArea.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </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/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Interfaces/IMove.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Interfaces/IMove.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Interfaces/IMove.cs	(revision 16114)
@@ -0,0 +1,14 @@
+﻿using HeuristicLab.Core;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Data.MoveVectorData.Interfaces
+{
+    public interface IMove
+    {
+        bool Enabled { get; set; }
+        bool TryParse(string s);
+        void Randomize(IRandom random, int min, int max, int step = 1);
+        IEnumerable<IMove> GenerateNeighbours(IRandom random, int min, int max, int step = 1);
+        int Apply(ref StackingArea area, ref Stack inputStack, out int realMoves);
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveValue.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveValue.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveValue.cs	(revision 16114)
@@ -0,0 +1,71 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data.MoveVectorData
+{
+    [Item("MoveValue", "Represents a move value.")]
+    [StorableClass]
+    public class MoveValue<T> : ValueTypeValue<T>, IStringConvertibleValue where T : struct, IMove
+    {
+
+        #region Cloning
+        [StorableConstructor]
+        protected MoveValue(bool deserializing) : base(deserializing) { }
+        protected MoveValue(MoveValue<T> original, Cloner cloner) : base(original, cloner) { }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new MoveValue<T>(this, cloner);
+        }
+        #endregion
+
+        public MoveValue() : base() { }
+        public MoveValue(T value) : base(value) { }
+
+        protected virtual bool Validate(string value, out string errorMessage)
+        {
+            T val = new T();
+            bool valid = val.TryParse(value);
+            errorMessage = string.Empty;
+            if (!valid)
+            {
+                errorMessage = "Invalid TwoPointMove Format";
+            }
+            return valid;
+        }
+
+        protected virtual string GetValue()
+        {
+            return Value.ToString();
+        }
+
+        protected virtual bool SetValue(string value)
+        {
+            T val = new T();
+            if (val.TryParse(value))
+            {
+                Value = val;
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        #region IStringConvertibleValue Members
+        bool IStringConvertibleValue.Validate(string value, out string errorMessage)
+        {
+            return Validate(value, out errorMessage);
+        }
+        string IStringConvertibleValue.GetValue()
+        {
+            return GetValue();
+        }
+        bool IStringConvertibleValue.SetValue(string value)
+        {
+            return SetValue(value);
+        }
+        #endregion
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveVector.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveVector.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/MoveVector.cs	(revision 16114)
@@ -0,0 +1,306 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Data.MoveVectorData
+{
+    [Item("MoveVector", "Represents a vector of moves.")]
+    [StorableClass]
+    public class MoveVector : Item, IEnumerable<IMove>, IStringConvertibleArray
+    {
+        private const int maximumToStringLength = 100;
+
+        public static new Image StaticItemImage
+        {
+            get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+        }
+
+        [Storable]
+        protected IMove[] array;
+
+        #region Parameters
+        [Storable]
+        protected List<string> elementNames;
+        public virtual IEnumerable<string> ElementNames
+        {
+            get { return this.elementNames; }
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("ElementNames cannot be set. ValueTypeArray is read-only.");
+                if (value == null || !value.Any())
+                    elementNames = new List<string>();
+                else if (value.Count() > Length)
+                    throw new ArgumentException("The number of element names must not exceed the array length.");
+                else
+                    elementNames = new List<string>(value);
+                OnElementNamesChanged();
+            }
+        }
+
+        public virtual int Length
+        {
+            get { return array.Length; }
+            protected set
+            {
+                if (ReadOnly) throw new NotSupportedException("Length cannot be set. StringArray is read-only.");
+                if (value != Length)
+                {
+                    Array.Resize<IMove>(ref array, value);
+                    while (elementNames.Count > value)
+                        elementNames.RemoveAt(elementNames.Count - 1);
+                    OnElementNamesChanged();
+                    OnReset();
+                }
+            }
+        }
+
+        [Storable]
+        protected bool readOnly;
+        public virtual bool ReadOnly
+        {
+            get { return readOnly; }
+        }
+
+        private IList<Type> moveTypes;
+        public IList<Type> MoveTypes
+        {
+            get
+            {
+                if (moveTypes == null) throw new NullReferenceException("MoveTypes must not be null");
+                return moveTypes;
+            }
+            set
+            {
+                moveTypes = value;
+            }
+        }
+
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        protected MoveVector(bool deserializing) : base(deserializing) { }
+        protected MoveVector(MoveVector original, Cloner cloner) : base(original, cloner)
+        {
+            this.array = (IMove[])original.array.Clone();
+            this.readOnly = original.readOnly;
+            this.elementNames = new List<string>(original.elementNames);
+            this.moveTypes = new List<Type>(original.moveTypes);
+        }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new MoveVector(this, cloner);
+        }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            if (elementNames == null) { elementNames = new List<string>(); }
+        }
+        public virtual MoveVector AsReadOnly()
+        {
+            MoveVector readOnlyStringArray = (MoveVector)this.Clone();
+            readOnlyStringArray.readOnly = true;
+            return readOnlyStringArray;
+        }
+        #endregion
+
+        public MoveVector(IList<Type> moveTypes) : this(0, moveTypes) { }
+        public MoveVector(int length, IList<Type> moveTypes)
+        {
+            if (moveTypes == null) throw new NullReferenceException("MoveTypes must not be null");
+            array = new IMove[length];
+            readOnly = false;
+            elementNames = new List<string>();
+            MoveTypes = moveTypes;
+        }
+        public MoveVector(int length, IRandom random, IList<Type> moveTypes, int min, int max) : this(length, moveTypes)
+        {
+            Randomize(random, min, max);
+        }
+        public MoveVector(IMove[] elements, IList<Type> moveTypes) : this(elements.Length, moveTypes)
+        {
+            for (int i = 0; i < array.Length; i++)
+                array[i] = elements[i];
+        }
+
+        public override string ToString()
+        {
+            if (array.Length == 0) return "[]";
+
+            StringBuilder sb = new StringBuilder();
+            sb.Append("[");
+            sb.Append(array[0]);
+            for (int i = 1; i < array.Length; i++)
+            {
+                sb.Append(";").Append(array[i]);
+                if (sb.Length > maximumToStringLength)
+                {
+                    sb.Append("...");
+                    break;
+                }
+            }
+            sb.Append("]");
+            return sb.ToString();
+        }
+
+        public virtual IEnumerator<IMove> GetEnumerator()
+        {
+            return array.Cast<IMove>().GetEnumerator();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+
+        protected virtual bool Validate(string value, out string errorMessage)
+        {
+            if (value == null) //TODO
+            {
+                errorMessage = "Invalid Value (string must not be null)";
+                return false;
+            }
+            else {
+                errorMessage = string.Empty;
+                return true;
+            }
+        }
+
+        public virtual IMove this[int index]
+        {
+            get { return array[index]; }
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringArray is read-only.");
+                if (value != array[index])
+                {
+                    if (value != null)
+                    {
+                        array[index] = value;
+                        OnItemChanged(index);
+                    }
+                }
+            }
+        }
+
+        protected virtual string GetValue(int index)
+        {
+            return this[index].ToString();
+        }
+
+        protected virtual bool SetValue(string value, int index)
+        {
+            if (value != null)
+            {
+                this[index] = null; //TODO
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        public virtual void Randomize(IRandom random, int startIndex, int length, int min, int max, int step = 1)
+        {
+            if (length > 0)
+            {
+                for (int i = startIndex; i < startIndex + length; i++)
+                {
+                    Type type = MoveTypes[random.Next(0, MoveTypes.Count)];
+                    IMove move = (IMove)Activator.CreateInstance(type);
+                    move.Randomize(random, min, max, step);
+                    array[i] = move;
+                }
+                OnReset();
+            }
+        }
+
+        public virtual void Randomize(IRandom random, int startIndex, int length, IntMatrix bounds)
+        {
+            if (length > 0)
+            {
+                int min = bounds[0, 0], max = bounds[0, 1], step = 1;
+                if (bounds.Columns > 2) step = bounds[0, 2];
+                Randomize(random, startIndex, length, min, max, step);
+            }
+        }
+
+        public void Randomize(IRandom random, int min, int max, int step = 1)
+        {
+            Randomize(random, 0, Length, min, max, step);
+        }
+
+        public void Randomize(IRandom random, IntMatrix bounds)
+        {
+            Randomize(random, 0, Length, bounds);
+        }
+
+        #region Events
+        public event EventHandler ElementNamesChanged;
+        protected virtual void OnElementNamesChanged()
+        {
+            EventHandler handler = ElementNamesChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler<EventArgs<int>> ItemChanged;
+        protected virtual void OnItemChanged(int index)
+        {
+            if (ItemChanged != null)
+                ItemChanged(this, new EventArgs<int>(index));
+            if (index < maximumToStringLength)
+                OnToStringChanged();
+        }
+
+        public event EventHandler Reset;
+        public event EventHandler ResizableChanged;
+
+        protected virtual void OnReset()
+        {
+            if (Reset != null)
+                Reset(this, EventArgs.Empty);
+            OnToStringChanged();
+        }
+        #endregion
+
+        #region IStringConvertibleArray Members
+        int IValueTypeArray.Length
+        {
+            get { return Length; }
+            set { Length = value; }
+        }
+
+        public bool Resizable
+        {
+            get { return false; }
+            set { }
+        }
+
+        bool IStringConvertibleArray.Validate(string value, out string errorMessage)
+        {
+            return Validate(value, out errorMessage);
+        }
+        string IStringConvertibleArray.GetValue(int index)
+        {
+            return GetValue(index);
+        }
+        bool IStringConvertibleArray.SetValue(string value, int index)
+        {
+            return SetValue(value, index);
+        }
+
+        IValueTypeArray IValueTypeArray.AsReadOnly()
+        {
+            throw new NotImplementedException();
+        }
+        #endregion
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/IngoingMove.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/IngoingMove.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/IngoingMove.cs	(revision 16114)
@@ -0,0 +1,82 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using System;
+using System.Text;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Data.MoveVectorData.Moves
+{
+    public struct IngoingMove : IMove
+    {
+        public bool Enabled { get; set; }
+        public int putdown;
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            if (Enabled) sb.Append("(i"); else sb.Append("<i");
+            sb.Append(putdown.ToString());
+            if (Enabled) sb.Append(")"); else sb.Append(">");
+            return sb.ToString();
+        }
+
+        public bool TryParse(string s)
+        {
+            bool enable = false;
+            if (s.StartsWith("(i") && s.EndsWith(")"))
+            {
+                enable = true;
+            }
+            else if (s.StartsWith("<i") && s.EndsWith(">"))
+            {
+                enable = false;
+            }
+            else {
+                return false;
+            }
+            string[] valueStrings = s.Substring(2, s.Length - 1).Split(' ');  
+            int val;
+            if (!int.TryParse(valueStrings[0], out val))
+            {
+                return false;
+            }
+            putdown = val;
+            if (!int.TryParse(valueStrings[1], out val))
+            {
+                return false;
+            }
+            Enabled = enable;
+            return true;
+        }
+
+        public void Randomize(IRandom random, int min, int max, int step = 1)
+        {
+            int numbers = (int)Math.Floor((max - min) / (double)step);
+            putdown = random.Next(numbers) * step + min;
+            Enabled = true;
+        }
+
+        public int Apply(ref StackingArea area, ref Stack inputStack, out int realMoves)
+        {
+            if (Enabled && area[putdown].CurrentHeight < area[putdown].Length)
+            {
+                area[putdown].Push(inputStack.Pop());
+                realMoves = 1;
+                return 1;
+            }
+            realMoves = 0;
+            return 0;
+        }
+
+        public IEnumerable<IMove> GenerateNeighbours(IRandom random, int min, int max, int step = 1)
+        {
+            var moves = new List<IMove>();
+            moves.Add(new IngoingMove() { Enabled = !this.Enabled, putdown = this.putdown });
+            if(putdown + step <= max)
+                moves.Add(new IngoingMove() { Enabled = true, putdown = this.putdown + step });
+            if (putdown - step >= min)
+                moves.Add(new IngoingMove() { Enabled = true, putdown = this.putdown - step });
+            return moves;
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/OutgoingMove.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/OutgoingMove.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/OutgoingMove.cs	(revision 16114)
@@ -0,0 +1,106 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Data.MoveVectorData.Moves
+{
+    public struct OutgoingMove : IMove
+    {
+        public bool Enabled { get; set; }
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            if (Enabled) sb.Append("(o"); else sb.Append("<o");
+            if (Enabled) sb.Append(")"); else sb.Append(">");
+            return sb.ToString();
+        }
+
+        public bool TryParse(string s)
+        {
+            bool enable = false;
+            if (s.StartsWith("(o") && s.EndsWith(")"))
+            {
+                enable = true;
+            }
+            else if (s.StartsWith("<o") && s.EndsWith(">"))
+            {
+                enable = false;
+            }
+            else {
+                return false;
+            }
+            Enabled = enable;
+            return true;
+        }
+
+        public void Randomize(IRandom random, int min, int max, int step = 1)
+        {
+            Enabled = true;
+        }
+
+        public int Apply(ref StackingArea area, ref Stack inputStack, out int realMoves)
+        {
+            if (Enabled)
+            {
+                var minValue = Int32.MaxValue;
+                var minStack = Int32.MaxValue;
+                var minRow = Int32.MaxValue;
+                for (int stack = 0; stack < area.Size; stack++)
+                {
+                    for (int row = area.MaxHeight - 1; row >= 0; row--)
+                    {
+                        if(area[row, stack] != 0 && area[row, stack] < minValue)
+                        {
+                            minValue = area[row, stack];
+                            minStack = stack;
+                            minRow = row;
+                        }
+                    }
+                }
+
+                for (int stack = 0; stack < inputStack.Capacity; stack++)
+                {
+                    if (inputStack[stack] != 0 && inputStack[stack] < minValue)
+                    {
+                        realMoves = 0;
+                        return 1;
+                    }
+                }
+
+                if (minValue == Int32.MaxValue)
+                {
+                    realMoves = 0;
+                    return 1;
+                }
+
+                area[minRow, minStack] = 0;
+                int atop = 0;
+                for (int row = minRow; row < area.MaxHeight; row++)
+                {
+                    if (row < area.MaxHeight - 1)
+                    {
+                        area[row, minStack] = area[row + 1, minStack];
+                    } else
+                    {
+                        area[row, minStack] = 0;
+                    }
+                    atop = atop + 1;
+                }
+                realMoves = atop * 2 + 1;
+                return atop * 2 + 1;
+            }
+            realMoves = 0;
+            return 0;
+        }
+
+        public IEnumerable<IMove> GenerateNeighbours(IRandom random, int min, int max, int step = 1)
+        {
+            var moves = new List<IMove>();
+            moves.Add(new OutgoingMove() { Enabled = !this.Enabled, });
+            return moves;
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/TwoPointMove.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/TwoPointMove.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Moves/TwoPointMove.cs	(revision 16114)
@@ -0,0 +1,132 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Data.MoveVectorData.Moves
+{
+    public struct TwoPointMove : IMove
+    {
+        public bool Enabled { get; set; }
+        public int pickup;
+        public int putdown;
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            if (Enabled) sb.Append("("); else sb.Append("<");
+            sb.Append(pickup.ToString() + "," + putdown.ToString());
+            if (Enabled) sb.Append(")"); else sb.Append(">");
+            return sb.ToString();
+        }
+
+        public bool TryParse(string s)
+        {
+            bool enable = false;
+            if (s.StartsWith("(") && s.EndsWith(")"))
+            {
+                enable = true;
+            }
+            else if (s.StartsWith("<") && s.EndsWith(">"))
+            {
+                enable = false;
+            }
+            else {
+                return false;
+            }
+            string s1 = s.Substring(1, s.Length - 1);
+            string[] valueStrings = s1.Split(',');
+            if (valueStrings.Length != 2)
+            {
+                return false;
+            }
+            int valPickup;
+            if (!int.TryParse(valueStrings[0], out valPickup))
+            {
+                return false;
+            }
+            int valPutdown;
+            if (!int.TryParse(valueStrings[1], out valPutdown))
+            {
+                return false;
+            }
+            this.Enabled = enable;
+            this.pickup = valPickup;
+            this.putdown = valPutdown;
+            return true;
+        }
+
+        public void Randomize(IRandom random, int min, int max, int step = 1)
+        {
+            int numbers = (int)Math.Floor((max - min) / (double)step);
+            do
+            {
+                pickup = random.Next(numbers) * step + min;
+                putdown = random.Next(numbers) * step + min;
+            } while (pickup == putdown);
+            Enabled = true;
+        }
+
+        public int Apply(ref StackingArea area, ref Stack inputStack, out int realMoves)
+        {
+            if (!Enabled)
+            {
+                realMoves = 0;
+                return 0;
+            }
+            if (area[putdown].CurrentHeight < area[putdown].Length &&
+                area[pickup].CurrentHeight > 0)
+            {
+                int pick = area[pickup].Pop();
+                area[putdown].Push(pick);
+                realMoves = 1;
+                return 2;
+            }
+            realMoves = 0;
+            return 1;
+        }
+
+        public IEnumerable<IMove> GenerateNeighbours(IRandom random, int min, int max, int step = 1)
+        {
+            var moves = new List<IMove>();
+            moves.Add(new TwoPointMove() { Enabled = !this.Enabled, putdown = this.putdown, pickup = this.pickup });
+
+            /* 
+            int numbers = (int)Math.Floor((max - min) / (double)step);
+            int newPickup;
+            int newPutdown;
+            do
+            {
+                newPickup = random.Next(numbers) * step + min;
+                putdown = random.Next(numbers) * step + min;
+            } while (newPickup == putdown);
+            do
+            {
+                pickup = random.Next(numbers) * step + min;
+                newPutdown = random.Next(numbers) * step + min;
+            } while (pickup == newPutdown);
+
+            moves.Add(new TwoPointMove() { Enabled = true, putdown = newPutdown, pickup = this.pickup });
+            moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown, pickup = newPickup });
+            */
+
+            for(int i = min; i < max; i++)
+            {
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = i, pickup = this.pickup });
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown, pickup = i });
+            }
+
+            /*
+            if (putdown + step <= max)
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown + step, pickup = this.pickup });
+            if (putdown - step >= min)
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown - step, pickup = this.pickup });
+            if (pickup + step <= max)
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown, pickup = this.pickup + step });
+            if (pickup - step >= min)
+                moves.Add(new TwoPointMove() { Enabled = true, putdown = this.putdown, pickup = this.pickup - step  });*/
+            return moves;
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Data.MoveVectorData
+{
+    /// <summary>
+    /// Plugin class for HeuristicLab.Problems.Stacking plugin
+    /// </summary>
+    [Plugin("HeuristicLab.Data.MoveVectorData", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Data.MoveVectorData-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Parameters", "3.3")]
+    [PluginDependency("HeuristicLab.Persistence", "3.3")]
+    public class HeuristicLabDataMoveVectorDataPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.Data.MoveVectorData")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[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("471e9356-0eb6-426b-ae34-988e0c7632c2")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Stack.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Stack.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/Stack.cs	(revision 16114)
@@ -0,0 +1,144 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace HeuristicLab.Data.MoveVectorData
+{
+    [Item("Stack", "Represents a stack of containers.")]
+    [StorableClass]
+    public class Stack : IntArray
+    {
+        public static new Image StaticItemImage
+        {
+            get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+        }
+
+        public int Id { get; set; }
+        public int CurrentHeight
+        {
+            get
+            {
+                int ch = 0;
+                for(int i = 0; i < Length; i++)
+                {
+                    if(array[i] > 0)
+                    {
+                        ch = i + 1;
+                    } 
+                }
+                return ch;
+            }
+        }
+
+        public virtual int Capacity
+        {
+            get
+            {
+                return array.Length;
+            }
+        }
+
+        public Stack(int id) : base() { Id = id;  }
+        public Stack(int id, int length) : base(length) { Id = id; }
+        public Stack(int id, int[] elements) : base(elements) { Id = id; }
+        public Stack(int id, IntArray elements) : this(elements.Length) {
+            Id = id;
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = elements[i];
+            }
+                
+        }
+
+        [StorableConstructor]
+        protected Stack(bool deserializing) : base(deserializing) { }
+        protected Stack(Stack original, Cloner cloner) : base(original, cloner) { }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new Stack(this, cloner);
+        }
+
+        protected override bool Validate(string value, out string errorMessage)
+        {
+            if (value == null) //TODO
+            {
+                errorMessage = "Invalid Value (string must not be null)";
+                return false;
+            }
+            else {
+                errorMessage = string.Empty;
+                return true;
+            }
+        }
+
+        protected override string GetValue(int index)
+        {
+            return this[index].ToString();
+        }
+
+        protected override bool SetValue(string value, int index)
+        {
+            int result;
+            if (Int32.TryParse(value, out result))
+            {
+                this[index] = result;
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        public void Push(int value)
+        {
+            if (CurrentHeight < Length)
+            {
+                //currentHeight++;
+                array[CurrentHeight] = value;
+            }
+        }
+
+        public int Pop()
+        {
+            if (CurrentHeight > 0)
+            {
+                //currentHeight--;
+                int val = array[CurrentHeight - 1];
+                array[CurrentHeight - 1] = 0;
+                return val;
+            } else {
+                return 0;
+            }
+        }
+
+        public void Clear()
+        {
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = 0;
+            }
+        }
+
+        public void Randomize(double fillRate, int seed)
+        {
+            Random random = new Random(seed);
+            Clear();
+            int containerCount = Capacity;
+            var range = new List<int>(containerCount + 1);
+            for (int i = 0; i < containerCount; i++)
+            {
+                range.Add(i + 1);
+            }
+            range.Shuffle(random);
+
+            for (int i = 0; i < containerCount; i++)
+            {
+                Push(range[i]);
+            }
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/StackingArea.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/StackingArea.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Data.MoveVectorData/3.3/StackingArea.cs	(revision 16114)
@@ -0,0 +1,519 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Data.MoveVectorData
+{
+    [Item("StackingArea", "Represents multiple stacks of containers.")]
+    [StorableClass]
+    public class StackingArea : Item, IEnumerable<Stack>, IStringConvertibleMatrix, IStringConvertibleArray
+    {
+        private const int maximumToStringLength = 100;
+
+        public static new Image StaticItemImage
+        {
+            get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+        }
+
+        [Storable]
+        protected Stack[] array;
+
+        #region Parameters
+        [Storable]
+        protected List<string> elementNames;
+        public virtual IEnumerable<string> ElementNames
+        {
+            get { return this.elementNames; }
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("ElementNames cannot be set. ValueTypeArray is read-only.");
+                if (value == null || !value.Any())
+                    elementNames = new List<string>();
+                else if (value.Count() > Size)
+                    throw new ArgumentException("The number of element names must not exceed the array length.");
+                else
+                    elementNames = new List<string>(value);
+                OnElementNamesChanged();
+            }
+        }
+
+        [Storable]
+        protected List<string> rowNames;
+        public IEnumerable<string> RowNames
+        {
+            get { return this.rowNames; }
+
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("RowNames cannot be set. ValueTypeArray is read-only.");
+                if (value == null || !value.Any())
+                    rowNames = new List<string>();
+                else if (value.Count() > Size)
+                    throw new ArgumentException("The number of row names must not exceed the array length.");
+                else
+                    rowNames = new List<string>(value);
+                OnRowNamesChanged();
+            }
+        }
+
+        public virtual int Size
+        {
+            get { return array.Length; }
+            protected set
+            {
+                if (ReadOnly) throw new NotSupportedException("Size cannot be set. StringArray is read-only.");
+                if (value != Size)
+                {
+                    Array.Resize<Stack>(ref array, value);
+                    while (elementNames.Count > value)
+                        elementNames.RemoveAt(elementNames.Count - 1);
+                    OnElementNamesChanged();
+                    OnReset();
+                }
+            }
+        }
+
+        public virtual int MaxHeight
+        {
+            get { return this.Max(x => x.Length); }
+            set
+            {
+                array = new Stack[Size];
+                for (int i = 0; i < array.Length; i++)
+                {
+                    array[i] = new Stack(i, value);
+                    array[i].ItemChanged += StackingArea_ItemChanged;
+                }
+                readOnly = false;
+                elementNames = new List<string>();
+                rowNames = new List<string>();
+            }
+        }
+
+        public virtual int Capacity
+        {
+            get
+            {
+                return array.Sum(stack => stack.Length);
+            }
+        }
+        #endregion
+
+        #region ReadOnly
+        [Storable]
+        protected bool readOnly;
+        public virtual bool ReadOnly
+        {
+            get { return readOnly; }
+        }
+        public virtual StackingArea AsReadOnly()
+        {
+            StackingArea readOnlyStringArray = (StackingArea)this.Clone();
+            readOnlyStringArray.readOnly = true;
+            return readOnlyStringArray;
+        }
+        #endregion
+
+        #region Cloning
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            if (elementNames == null) { elementNames = new List<string>(); }
+            if (rowNames == null) { rowNames = new List<string>(); }
+        }
+
+        [StorableConstructor]
+        protected StackingArea(bool deserializing) : base(deserializing) { }
+        protected StackingArea(StackingArea original, Cloner cloner) : base(original, cloner)
+        {
+            //this.array = (Stack[])original.array.Clone();
+            this.array = new Stack[original.Size];
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = (Stack)original.array[i].Clone();
+            }
+            this.readOnly = original.readOnly;
+            this.elementNames = new List<string>(original.elementNames);
+            this.rowNames = new List<string>(original.rowNames);
+        }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new StackingArea(this, cloner);
+        }
+        #endregion
+
+        public StackingArea() : this(0) { }
+        public StackingArea(int size)
+        {
+            array = new Stack[size];
+            readOnly = false;
+            elementNames = new List<string>();
+            rowNames = new List<string>();
+       }
+        public StackingArea(int size, int maxHeight) : this(size)
+        {
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = new Stack(i, maxHeight);
+                array[i].ItemChanged += StackingArea_ItemChanged;
+            }
+        }
+
+        public StackingArea(Stack[] elements) : this(elements.Length)
+        {
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = elements[i];
+            }
+        }
+
+        public void Clear()
+        {
+            foreach(var stack in array)
+            {
+                stack.Clear();
+            }
+        }
+
+        public void Randomize(double fillRate, int seed)
+        {
+            if (fillRate > 1 || fillRate < 0)
+            {
+                throw new ArgumentOutOfRangeException("Fill Rate must be between 0 and 1, but is " + fillRate);
+            }
+            Random random = new Random(seed);
+            Clear();
+            int containerCount = Convert.ToInt32(Capacity * fillRate);
+            var range = new List<int>(containerCount + 1);
+            for(int i = 0; i < containerCount; i++)
+            {
+                range.Add(i + 1);
+            }
+            range.Shuffle(random);
+
+            for(int i = 0; i < containerCount; i++)
+            {
+                Stack stack;
+                do
+                {
+                    var stackNr = random.Next(0, Size);
+                    stack = array[stackNr];
+                } while (stack.CurrentHeight >= stack.Length);
+                stack.Push(range[i]);
+            }
+        }
+
+        public override string ToString()
+        {
+            if (array.Length == 0) return "[]";
+
+            StringBuilder sb = new StringBuilder();
+            sb.Append("[");
+            sb.Append(array[0]);
+            for (int i = 1; i < array.Length; i++)
+            {
+                sb.Append(";").Append(array[i]);
+                if (sb.Length > maximumToStringLength)
+                {
+                    sb.Append("...");
+                    break;
+                }
+            }
+            sb.Append("]");
+            return sb.ToString();
+        }
+
+        public virtual IEnumerator<Stack> GetEnumerator()
+        {
+            return array.Cast<Stack>().GetEnumerator();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+
+        public static int ApplyMoves(ref StackingArea startArea, ref Stack inputStack, MoveVector moves, out int realMoves)
+        {
+            int quality = 0;
+            int nrMoves = 0;
+            foreach (IMove move in moves)
+            {
+                int real = 0;
+                quality = quality + move.Apply(ref startArea, ref inputStack, out real);
+                nrMoves = nrMoves + real;
+            }
+            realMoves = nrMoves;
+            return quality;
+        }
+
+        public static int ApplyMoves(ref StackingArea startArea, MoveVector moves, out int realMoves)
+        {
+            Stack inputStack = null;
+            return ApplyMoves(ref startArea, ref inputStack, moves, out realMoves);
+        }
+
+        public virtual bool Validate(string value, out string errorMessage)
+        {
+            if (value == null) //TODO
+            {
+                errorMessage = "Invalid Value (string must not be null)";
+                return false;
+            }
+            else {
+                errorMessage = string.Empty;
+                return true;
+            }
+        }
+
+        public virtual Stack this[int index]
+        {
+            get { return array[index]; }
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringArray is read-only.");
+                if (value != array[index])
+                {
+                    if (value != null)
+                    {
+                        array[index] = value;
+                        OnItemChanged(index);
+                    }
+                }
+            }
+        }
+
+        public virtual int this[int row, int stack]
+        {
+            get { return array[stack][row]; }
+            set
+            {
+                if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringArray is read-only.");
+                array[stack][row] = value;
+                OnItemInStackChanged(row, stack);
+            }
+        }
+
+        public virtual string GetValue(int index)
+        {
+            return this[index].ToString();
+        }
+
+        public virtual string GetValue(int row, int stack)
+        {
+            return this[row, stack].ToString();
+        }
+
+        public virtual bool SetValue(string value, int index)
+        {
+            if (value != null && value.StartsWith("[") && value.EndsWith("]"))
+            {
+                string[] strings = value.Substring(1, value.Length - 2).Split(';');
+                for (int i = 0; i < Size; i++)
+                {
+                    int result;
+                    if (Int32.TryParse(strings[i], out result))
+                    {
+                        this[index][i] = result;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+        public virtual bool SetValue(string value, int row, int stack)
+        {
+            int result;
+            if (value != null && Int32.TryParse(value, out result))
+            {
+                this[row, stack] = result;
+                return true;
+            }
+            return false;
+        }
+
+        #region Events
+        private void StackingArea_ItemChanged(object sender, EventArgs<int> e)
+        {
+            Stack s = (Stack)sender;
+            OnItemInStackChanged(e.Value, s.Id);
+        }
+        public event EventHandler ElementNamesChanged;
+        protected virtual void OnElementNamesChanged()
+        {
+            EventHandler handler = ElementNamesChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler RowNamesChanged;
+        protected virtual void OnRowNamesChanged()
+        {
+            EventHandler handler = RowNamesChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler<EventArgs<int>> ItemChanged;
+        protected virtual void OnItemChanged(int index)
+        {
+            if (ItemChanged != null)
+                ItemChanged(this, new EventArgs<int>(index));
+            if (index < maximumToStringLength)
+                OnToStringChanged();
+        }
+
+        public event EventHandler<EventArgs<int, int>> ItemInStackChanged;
+        protected virtual void OnItemInStackChanged(int row, int stack)
+        {
+            if (ItemInStackChanged != null)
+                ItemInStackChanged(this, new EventArgs<int, int>(row, stack));
+            if (stack < maximumToStringLength && row < maximumToStringLength)
+                OnToStringChanged();
+        }
+
+        public event EventHandler Reset;
+        protected virtual void OnReset()
+        {
+            if (Reset != null)
+                Reset(this, EventArgs.Empty);
+            OnToStringChanged();
+        }
+
+        public event EventHandler ColumnsChanged;
+        protected virtual void OnColumnsChanged()
+        {
+            if (ColumnsChanged != null)
+                ColumnsChanged(this, EventArgs.Empty);
+            throw new NotImplementedException();
+        }
+
+        public event EventHandler RowsChanged;
+        protected virtual void OnRowsChanged()
+        {
+            if (RowsChanged != null)
+                RowsChanged(this, EventArgs.Empty);
+            throw new NotImplementedException();
+        }
+
+        public event EventHandler ColumnNamesChanged;
+        protected virtual void OnColumnNamesChanged()
+        {
+            if (ColumnNamesChanged != null)
+                ColumnNamesChanged(this, EventArgs.Empty);
+            throw new NotImplementedException();
+        }
+
+        public event EventHandler SortableViewChanged;
+        public event EventHandler ResizableChanged;
+
+        protected virtual void OnSortableViewChanged()
+        {
+            if (SortableViewChanged != null)
+                SortableViewChanged(this, EventArgs.Empty);
+            throw new NotImplementedException();
+        }
+        #endregion
+
+        #region IStringConvertibleMatrix Members
+        event EventHandler<EventArgs<int, int>> IStringConvertibleMatrix.ItemChanged
+        {
+            add { ItemInStackChanged += value; }
+            remove { ItemInStackChanged -= value; }
+        }
+        int IStringConvertibleMatrix.Rows
+        {
+            get { return MaxHeight; }
+            set { MaxHeight = value; }
+        }
+        int IStringConvertibleMatrix.Columns
+        {
+            get { return Size; }
+            set { Size = value; }
+        }
+        public IEnumerable<string> ColumnNames
+        {
+            get { return ElementNames; }
+            set { ElementNames = value; }
+        }
+        public bool SortableView
+        {
+            get { return false; }
+            set { throw new NotImplementedException(); }
+        }
+
+        bool IStringConvertibleMatrix.Validate(string value, out string errorMessage)
+        {
+            return Validate(value, out errorMessage);
+        }
+        string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex)
+        {
+            return GetValue(rowIndex, columIndex);
+        }
+        bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex)
+        {
+            return SetValue(value, rowIndex, columnIndex);
+        }
+        #endregion
+
+        #region IStringConvertibleArray Members
+        int IValueTypeArray.Length
+        {
+            get { return Size; }
+            set { Size = value; }
+        }
+        bool IValueTypeArray.Resizable
+        {
+            get { return false; }
+            set { }
+        }
+        IValueTypeArray IValueTypeArray.AsReadOnly()
+        {
+            throw new NotImplementedException();
+        }
+        bool IStringConvertibleArray.Validate(string value, out string errorMessage)
+        {
+            return Validate(value, out errorMessage);
+        }
+        string IStringConvertibleArray.GetValue(int index)
+        {
+            return GetValue(index);
+        }
+        bool IStringConvertibleArray.SetValue(string value, int index)
+        {
+            return SetValue(value, index);
+        }
+        #endregion
+
+    }
+
+    static class ListExtentions
+    {
+        public static void Shuffle<T>(this IList<T> list, Random random)
+        {
+            int n = list.Count;
+            while (n > 1)
+            {
+                n--;
+                int k = random.Next(n + 1);
+                T value = list[k];
+                list[k] = list[n];
+                list[n] = value;
+            }
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/BoundedMoveVectorManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/BoundedMoveVectorManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/BoundedMoveVectorManipulator.cs	(revision 16114)
@@ -0,0 +1,37 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("BoundedMoveVectorManipulator", "A base class for operators that manipulate bounded move vectors.")]
+    [StorableClass]
+    public abstract class BoundedMoveVectorManipulator : MoveVectorManipulator, IBoundedMoveVectorOperator
+    {
+        public IValueLookupParameter<IntMatrix> BoundsParameter
+        {
+            get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
+        }
+
+        [StorableConstructor]
+        protected BoundedMoveVectorManipulator(bool deserializing) : base(deserializing) { }
+        protected BoundedMoveVectorManipulator(BoundedMoveVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+        protected BoundedMoveVectorManipulator() : base()
+        {
+           Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "The bounds matrix can contain one row for each dimension with three columns specifying minimum (inclusive), maximum (exclusive), and step size. If less rows are given the matrix is cycled."));
+        }
+
+        protected sealed override void Manipulate(IRandom random, MoveVector moveVector)
+        {
+            if (BoundsParameter.ActualValue == null) throw new InvalidOperationException("BoundedIntegerVectorManipulator: Parameter " + BoundsParameter.ActualName + " could not be found.");
+            ManipulateBounded(random, moveVector, BoundsParameter.ActualValue);
+        }
+
+        protected abstract void ManipulateBounded(IRandom random, MoveVector moveVector, IntMatrix bounds);
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Creators/RandomMoveVectorCreator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Creators/RandomMoveVectorCreator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Creators/RandomMoveVectorCreator.cs	(revision 16114)
@@ -0,0 +1,46 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using System.Linq;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Creators
+{
+    [NonDiscoverableType]
+    [StorableClass]
+    [Item("RandomMoveVectorCreator", "An operator that creates new MoveVectors using random methods")]
+    public class RandomMoveVectorCreator : MoveVectorCreator
+    {
+
+        #region Cloning
+        [StorableConstructor]
+        protected RandomMoveVectorCreator(bool deserializing) : base(deserializing) { }
+        protected RandomMoveVectorCreator(RandomMoveVectorCreator original, Cloner cloner) : base(original, cloner) { }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            var ret = new RandomMoveVectorCreator(this, cloner);
+            ret.MoveTypes = this.MoveTypes;
+            return ret;
+        }
+        #endregion
+
+        public RandomMoveVectorCreator() : base() { }
+
+        public static MoveVector Apply(IRandom random, IList<Type> moveTypes, int length, IntMatrix bounds)
+        {
+            var result = new MoveVector(length, moveTypes);
+            result.Randomize(random, bounds);
+            return result;
+        }
+
+        public override MoveVector Create(IRandom random, IntValue length, IntMatrix bounds)
+        {
+            return Apply(random, MoveTypes, length.Value, bounds);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/NPointCrossover.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/NPointCrossover.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/NPointCrossover.cs	(revision 16114)
@@ -0,0 +1,124 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.MoveVectorEncoding;
+using HeuristicLab.Data.MoveVectorData;
+
+namespace HeuristicLab.Encodings.BinaryVectorEncoding {
+  /// <summary>
+  /// N point crossover for move vectors.
+  /// </summary>
+  /// <remarks>
+  /// It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, Springer-Verlag Berlin Heidelberg..
+  /// </remarks>
+  [Item("NPointCrossover", "N point crossover for move vectors. It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, Springer-Verlag Berlin Heidelberg.")]
+  [StorableClass]
+  public sealed class NPointCrossover : MoveVectorCrossover
+    {
+    /// <summary>
+    /// Number of crossover points.
+    /// </summary>
+    public IValueLookupParameter<IntValue> NParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["N"]; }
+    }
+
+    [StorableConstructor]
+    private NPointCrossover(bool deserializing) : base(deserializing) { }
+    private NPointCrossover(NPointCrossover original, Cloner cloner) : base(original, cloner) { }
+    /// <summary>
+    /// Initializes a new instance of <see cref="NPointCrossover"/>
+    /// </summary>
+    public NPointCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("N", "Number of crossover points", new IntValue(2)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NPointCrossover(this, cloner);
+    }
+
+    public static MoveVector Apply(IRandom random, MoveVector parent1, MoveVector parent2, IntValue n) {
+      if (parent1.Length != parent2.Length)
+        throw new ArgumentException("NPointCrossover: The parents are of different length.");
+
+      if (n.Value > parent1.Length)
+        throw new ArgumentException("NPointCrossover: There cannot be more breakpoints than the size of the parents.");
+
+      if (n.Value < 1)
+        throw new ArgumentException("NPointCrossover: N cannot be < 1.");
+
+      int length = parent1.Length;
+      MoveVector result = new MoveVector(length, parent1.MoveTypes);
+      int[] breakpoints = new int[n.Value];
+
+      //choose break points
+      List<int> breakpointPool = new List<int>();
+
+      for (int i = 0; i < length; i++)
+        breakpointPool.Add(i);
+
+      for (int i = 0; i < n.Value; i++) {
+        int index = random.Next(breakpointPool.Count);
+        breakpoints[i] = breakpointPool[index];
+        breakpointPool.RemoveAt(index);
+      }
+
+      Array.Sort(breakpoints);
+
+      //perform crossover
+      int arrayIndex = 0;
+      int breakPointIndex = 0;
+      bool firstParent = true;
+
+      while (arrayIndex < length) {
+        if (breakPointIndex < breakpoints.Length &&
+          arrayIndex == breakpoints[breakPointIndex]) {
+          breakPointIndex++;
+          firstParent = !firstParent;
+        }
+
+        if (firstParent)
+          result[arrayIndex] = parent1[arrayIndex];
+        else
+          result[arrayIndex] = parent2[arrayIndex];
+
+        arrayIndex++;
+      }
+
+      return result;
+    }
+
+    protected override MoveVector Cross(IRandom random, ItemArray<MoveVector> parents) {
+      if (parents.Length != 2) throw new ArgumentException("ERROR in NPointCrossover: The number of parents is not equal to 2");
+
+      if (NParameter.ActualValue == null) throw new InvalidOperationException("NPointCrossover: Parameter " + NParameter.ActualName + " could not be found.");
+
+      return Apply(random, parents[0], parents[1], NParameter.ActualValue);
+    }
+  }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/SinglePointCrossover.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/SinglePointCrossover.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/SinglePointCrossover.cs	(revision 16114)
@@ -0,0 +1,46 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Crossovers
+{
+    [Item("SinglePointCrossover", "Single point crossover for move vectors.")]
+    [StorableClass]
+    public class SinglePointCrossover : MoveVectorCrossover
+    {
+        [StorableConstructor]
+        protected SinglePointCrossover(bool deserializing) : base(deserializing) { }
+        protected SinglePointCrossover(SinglePointCrossover original, Cloner cloner) : base(original, cloner) { }
+        public SinglePointCrossover() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new SinglePointCrossover(this, cloner);
+        }
+
+        public static MoveVector Apply(IRandom random, MoveVector parent1, MoveVector parent2)
+        {
+            if (parent1.Length != parent2.Length)
+                throw new ArgumentException("SinglePointCrossover: The parents are of different length.");
+
+            int length = parent1.Length;
+            MoveVector result = new MoveVector(length, parent1.MoveTypes);
+            int breakPoint = random.Next(1, length);
+
+            for (int i = 0; i < breakPoint; i++)
+                result[i] = parent1[i];
+            for (int i = breakPoint; i < length; i++)
+                result[i] = parent2[i];
+
+            return result;
+        }
+
+        protected override MoveVector Cross(IRandom random, ItemArray<MoveVector> parents)
+        {
+            if (parents.Length != 2) throw new ArgumentException("ERROR in SinglePointCrossover: The number of parents is not equal to 2");
+            return Apply(random, parents[0], parents[1]);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/UniformCrossover.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/UniformCrossover.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Crossovers/UniformCrossover.cs	(revision 16114)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Encodings.MoveVectorEncoding;
+
+namespace HeuristicLab.Encodings.BinaryVectorEncoding {
+  /// <summary>
+  /// Uniform crossover for move vectors.
+  /// </summary>
+  /// <remarks>
+  /// It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, Springer-Verlag Berlin Heidelberg.
+  /// </remarks>
+  [Item("UniformCrossover", "Uniform crossover for move vectors. It is implemented as described in Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, Springer-Verlag Berlin Heidelberg.")]
+  [StorableClass]
+  public sealed class UniformCrossover : MoveVectorCrossover
+    {
+
+    [StorableConstructor]
+    private UniformCrossover(bool deserializing) : base(deserializing) { }
+    private UniformCrossover(UniformCrossover original, Cloner cloner) : base(original, cloner) { }
+    public UniformCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformCrossover(this, cloner);
+    }
+
+    /// <summary>
+    /// Performs a uniform crossover between two binary vectors.
+    /// </summary>
+    /// <param name="random">A random number generator.</param>
+    /// <param name="parent1">The first parent for crossover.</param>
+    /// <param name="parent2">The second parent for crossover.</param>
+    /// <returns>The newly created binary vector, resulting from the uniform crossover.</returns>
+    public static MoveVector Apply(IRandom random, MoveVector parent1, MoveVector parent2) {
+      if (parent1.Length != parent2.Length)
+        throw new ArgumentException("UniformCrossover: The parents are of different length.");
+
+      int length = parent1.Length;
+      MoveVector result = new MoveVector(length, parent1.MoveTypes);
+
+      for (int i = 0; i < length; i++) {
+        if (random.NextDouble() < 0.5)
+          result[i] = parent1[i];
+        else
+          result[i] = parent2[i];
+      }
+
+      return result;
+    }
+
+    protected override MoveVector Cross(IRandom random, ItemArray<MoveVector> parents) {
+      if (parents.Length != 2) throw new ArgumentException("ERROR in UniformCrossover: The number of parents is not equal to 2");
+
+      return Apply(random, parents[0], parents[1]);
+    }
+  }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj	(revision 16114)
@@ -0,0 +1,142 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Encodings.MoveVectorEncoding</RootNamespace>
+    <AssemblyName>HeuristicLab.Encodings.MoveVectorEncoding-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>
+	<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </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">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </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">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Creators\RandomMoveVectorCreator.cs" />
+    <Compile Include="Crossovers\NPointCrossover.cs" />
+    <Compile Include="Crossovers\UniformCrossover.cs" />
+    <Compile Include="Interfaces\IMoveVectorMultiNeighborhoodShakingOperator.cs" />
+    <Compile Include="Manipulators\MultiMoveManipulator.cs" />
+    <Compile Include="Manipulators\SingleMoveChangeManipulator.cs" />
+    <Compile Include="Manipulators\SingleMoveEnableManipulator.cs" />
+    <Compile Include="Manipulators\SingleMoveShiftManipulator.cs" />
+    <Compile Include="MoveVectorCrossover.cs" />
+    <Compile Include="Crossovers\SinglePointCrossover.cs" />
+    <Compile Include="MoveVectorCreator.cs" />
+    <Compile Include="Interfaces\IBoundedMoveVectorOperator.cs" />
+    <Compile Include="Interfaces\IMoveVectorCreator.cs" />
+    <Compile Include="Interfaces\IMoveVectorCrossover.cs" />
+    <Compile Include="Interfaces\IMoveVectorManipulator.cs" />
+    <Compile Include="Interfaces\IMoveVectorOperator.cs" />
+    <Compile Include="BoundedMoveVectorManipulator.cs" />
+    <Compile Include="Manipulators\SingleMoveManipulator.cs" />
+    <Compile Include="MoveVectorManipulator.cs" />
+    <Compile Include="MoveVectorOperator.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="MoveVectorEncoding.cs" />
+    <Compile Include="ShakingOperators\MoveVectorShakingOperator.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj">
+      <Project>{471e9356-0eb6-426b-ae34-988e0c7632c2}</Project>
+      <Name>HeuristicLab.Data.MoveVectorData-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </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)
+</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/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IBoundedMoveVectorOperator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IBoundedMoveVectorOperator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IBoundedMoveVectorOperator.cs	(revision 16114)
@@ -0,0 +1,18 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IBoundedMoveVectorOperator : IMoveVectorOperator
+    {
+        /// <summary>
+        /// The bounds parameter must contain at least one row and at least two columns. The first two columns specify min and max values, the last column specifies the step size, but is optional (1 is assumed if omitted).
+        /// </summary>
+        IValueLookupParameter<IntMatrix> BoundsParameter { get; }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCreator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCreator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCreator.cs	(revision 16114)
@@ -0,0 +1,17 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Optimization;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IMoveVectorCreator : IBoundedMoveVectorOperator, ISolutionCreator
+    {
+        IValueLookupParameter<IntValue> LengthParameter { get; }
+        ILookupParameter<MoveVector> MoveVectorParameter { get; }
+
+        IList<Type> MoveTypes { get; set; }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCrossover.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCrossover.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorCrossover.cs	(revision 16114)
@@ -0,0 +1,12 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IMoveVectorCrossover : IMoveVectorOperator, ICrossover
+    {
+        ILookupParameter<ItemArray<MoveVector>> ParentsParameter { get; }
+        ILookupParameter<MoveVector> ChildParameter { get; }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorManipulator.cs	(revision 16114)
@@ -0,0 +1,10 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IMoveVectorManipulator : IMoveVectorOperator, IManipulator {
+        ILookupParameter<MoveVector> MoveVectorParameter { get; }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorMultiNeighborhoodShakingOperator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorMultiNeighborhoodShakingOperator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorMultiNeighborhoodShakingOperator.cs	(revision 16114)
@@ -0,0 +1,10 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IMoveVectorMultiNeighborhoodShakingOperator : IMoveVectorOperator
+    {
+        ILookupParameter<MoveVector> MoveVectorParameter { get; }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorOperator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorOperator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Interfaces/IMoveVectorOperator.cs	(revision 16114)
@@ -0,0 +1,13 @@
+﻿using HeuristicLab.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Interfaces
+{
+    public interface IMoveVectorOperator : IOperator
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/MultiMoveManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/MultiMoveManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/MultiMoveManipulator.cs	(revision 16114)
@@ -0,0 +1,93 @@
+﻿using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Manipulators
+{
+    [Item("Multi Move Manipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
+    [StorableClass]
+    public class MultiMoveManipulator : StochasticMultiBranch<IMoveVectorManipulator>, IMoveVectorManipulator, IBoundedMoveVectorOperator, IStochasticOperator
+    {
+        public override bool CanChangeName
+        {
+            get { return false; }
+        }
+        protected override bool CreateChildOperation
+        {
+            get { return true; }
+        }
+
+        public ILookupParameter<MoveVector> MoveVectorParameter
+        {
+            get { return (ILookupParameter<MoveVector>)Parameters["MoveVector"]; }
+        }
+
+        public IValueLookupParameter<IntMatrix> BoundsParameter
+        {
+            get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
+        }
+
+        [StorableConstructor]
+        protected MultiMoveManipulator(bool deserializing) : base(deserializing) { }
+        protected MultiMoveManipulator(MultiMoveManipulator original, Cloner cloner) : base(original, cloner) { }
+        public MultiMoveManipulator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<MoveVector>("MoveVector", "The encoding vector that is to be manipulated."));
+            Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "The bounds matrix can contain one row for each dimension with three columns specifying minimum (inclusive), maximum (exclusive), and step size. If less rows are given the matrix is cycled."));
+            foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IMoveVectorManipulator), typeof(MoveVectorEncoding).Assembly))
+            {
+                if (!typeof(MultiOperator<IMoveVectorManipulator>).IsAssignableFrom(type))
+                    Operators.Add((IMoveVectorManipulator)Activator.CreateInstance(type), true);
+            }
+            SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
+        }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new MultiMoveManipulator(this, cloner);
+        }
+
+        protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMoveVectorManipulator>> e)
+        {
+            base.Operators_ItemsReplaced(sender, e);
+            ParameterizeManipulators(e.Items);
+        }
+
+        protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMoveVectorManipulator>> e)
+        {
+            base.Operators_ItemsAdded(sender, e);
+            ParameterizeManipulators(e.Items);
+        }
+
+        private void ParameterizeManipulators(IEnumerable<IndexedItem<IMoveVectorManipulator>> manipulators)
+        {
+            foreach (var m in manipulators.Select(x => x.Value))
+            {
+                m.MoveVectorParameter.ActualName = MoveVectorParameter.Name;
+                var stOp = m as IStochasticOperator;
+                if (stOp != null) stOp.RandomParameter.ActualName = RandomParameter.Name;
+
+                var bounded = m as IBoundedMoveVectorOperator;
+                if (bounded != null) bounded.BoundsParameter.ActualName = MoveVectorParameter.Name + "." + BoundsParameter.Name;
+            }
+        }
+
+        public override IOperation InstrumentedApply()
+        {
+            if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one move manipulator to choose from.");
+            return base.InstrumentedApply();
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveChangeManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveChangeManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveChangeManipulator.cs	(revision 16114)
@@ -0,0 +1,53 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using HeuristicLab.Data.MoveVectorData.Moves;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Manipulators
+{
+    [Item("SingleMoveChangeManipulator", " Uniformly distributed change of a single position of a move.")]
+    [StorableClass]
+    public class SingleMoveChangeManipulator : BoundedMoveVectorManipulator
+    {
+        [StorableConstructor]
+        protected SingleMoveChangeManipulator(bool deserializing) : base(deserializing) { }
+        protected SingleMoveChangeManipulator(SingleMoveChangeManipulator original, Cloner cloner) : base(original, cloner) { }
+
+        public SingleMoveChangeManipulator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new SingleMoveChangeManipulator(this, cloner);
+        }
+
+        public static void Apply(IRandom random, MoveVector moves, IntMatrix bounds)
+        {
+            Manipulate(random, moves, bounds, random.Next(moves.Length));
+        }
+
+        public static void Manipulate(IRandom random, MoveVector moves, IntMatrix bounds, int index)
+        {
+            if (bounds == null || bounds.Rows == 0 || bounds.Columns < 2) throw new ArgumentException("SingleMoveChangeManipulator: Invalid bounds specified", "bounds");
+            int min = bounds[index % bounds.Rows, 0], max = bounds[index % bounds.Rows, 1], step = 1;
+            if (bounds.Columns > 2) step = bounds[index % bounds.Rows, 2];
+
+            Type type = moves.MoveTypes[random.Next(0, moves.MoveTypes.Count)];
+            IMove move = (IMove)Activator.CreateInstance(type);
+            move.Randomize(random, min, max, step);
+            moves[index] = move;
+        }
+
+        protected override void ManipulateBounded(IRandom random, MoveVector moves, IntMatrix bounds)
+        {
+            if (BoundsParameter.ActualValue == null) throw new InvalidOperationException("SingleMoveChangeManipulator: Parameter " + BoundsParameter.ActualName + " could not be found.");
+            Apply(random, moves, bounds);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveEnableManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveEnableManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveEnableManipulator.cs	(revision 16114)
@@ -0,0 +1,39 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Manipulators
+{
+    [Item("SingleMoveEnableManipulator", " Enable or disable a move.")]
+    [StorableClass]
+    public class SingleMoveEnableManipulator : MoveVectorManipulator
+    {
+
+        [StorableConstructor]
+        protected SingleMoveEnableManipulator(bool deserializing) : base(deserializing) { }
+        protected SingleMoveEnableManipulator(SingleMoveEnableManipulator original, Cloner cloner) : base(original, cloner) { }
+        
+        public SingleMoveEnableManipulator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new SingleMoveEnableManipulator(this, cloner);
+        }
+
+        public static void Apply(IRandom random, MoveVector moves)
+        {
+            Manipulate(random, moves, random.Next(moves.Length));
+        }
+
+        public static void Manipulate(IRandom random, MoveVector moves, int index)
+        {
+            moves[index].Enabled = !moves[index].Enabled;
+        }
+
+        protected override void Manipulate(IRandom random, MoveVector moves)
+        {
+            Apply(random, moves);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveManipulator.cs	(revision 16114)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Moves;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Manipulators
+{
+    [Item("SingleMoveManipulator", " Uniformly distributed change of a single position of a move.")]
+    [StorableClass]
+    public class SingleMoveManipulator : BoundedMoveVectorManipulator
+    {
+
+        [StorableConstructor]
+        protected SingleMoveManipulator(bool deserializing) : base(deserializing) { }
+        protected SingleMoveManipulator(SingleMoveManipulator original, Cloner cloner) : base(original, cloner) { }
+        
+        public SingleMoveManipulator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new SingleMoveManipulator(this, cloner);
+        }
+
+        public static void Apply(IRandom random, MoveVector moves, IntMatrix bounds)
+        {
+            Manipulate(random, moves, bounds, random.Next(moves.Length));
+        }
+
+        public static void Manipulate(IRandom random, MoveVector moves, IntMatrix bounds, int index)
+        {
+            if (bounds == null || bounds.Rows == 0 || bounds.Columns < 2) throw new ArgumentException("SingleMoveManipulator: Invalid bounds specified", "bounds");
+            int min = bounds[index % bounds.Rows, 0], max = bounds[index % bounds.Rows, 1], step = 1;
+            if (bounds.Columns > 2) step = bounds[index % bounds.Rows, 2];
+
+            moves[index].Randomize(random, min, max, step);
+        }
+
+        protected override void ManipulateBounded(IRandom random, MoveVector moves, IntMatrix bounds)
+        {
+            if (BoundsParameter.ActualValue == null) throw new InvalidOperationException("SingleMoveManipulator: Parameter " + BoundsParameter.ActualName + " could not be found.");
+            Apply(random, moves, bounds);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveShiftManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveShiftManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Manipulators/SingleMoveShiftManipulator.cs	(revision 16114)
@@ -0,0 +1,60 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding.Manipulators
+{
+    [Item("SingleMoveShiftManipulator", " Shifts one move to a different position.")]
+    [StorableClass]
+    public class SingleMoveShiftManipulator : MoveVectorManipulator
+    {
+
+        [StorableConstructor]
+        protected SingleMoveShiftManipulator(bool deserializing) : base(deserializing) { }
+        protected SingleMoveShiftManipulator(SingleMoveShiftManipulator original, Cloner cloner) : base(original, cloner) { }
+        
+        public SingleMoveShiftManipulator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new SingleMoveShiftManipulator(this, cloner);
+        }
+
+        public static void Apply(IRandom random, MoveVector moves)
+        {
+            Manipulate(random, moves, random.Next(moves.Length));
+        }
+
+        public static void Manipulate(IRandom random, MoveVector moves, int index)
+        {
+            moves[index].Enabled = true;
+            int shift = 0;
+            do
+            {
+                shift = random.Next(-index, moves.Length - index + 1);
+            } while (shift == 0);
+
+            var save = moves[index];
+            if (shift > 0)
+            {
+                for(int i = index; i < index + shift; i++)
+                {
+                    if (i + 1 == index + shift) moves[index] = save;
+                    else moves[i] = moves[i + 1];
+                } 
+            } else {
+                for (int i = index; i >= index + shift; i--)
+                {
+                    if (i == index + shift) moves[index] = save;
+                    else moves[i] = moves[i - 1];
+                }
+            }
+        }
+
+        protected override void Manipulate(IRandom random, MoveVector moves)
+        {
+            Apply(random, moves);
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCreator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCreator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCreator.cs	(revision 16114)
@@ -0,0 +1,83 @@
+﻿using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data.MoveVectorData;
+using System.Collections.Generic;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using System;
+using HeuristicLab.PluginInfrastructure;
+using System.Linq;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("MoveVectorCreator", "A base class for operators creating Move Vectors.")]
+    [StorableClass]
+    public abstract class MoveVectorCreator : InstrumentedOperator, IMoveVectorCreator, IStochasticOperator
+    {
+        #region Parameter Properties
+        public ILookupParameter<IRandom> RandomParameter
+        {
+            get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+        }
+        public ILookupParameter<MoveVector> MoveVectorParameter
+        {
+            get { return (ILookupParameter<MoveVector>)Parameters["MoveVector"]; }
+        }
+        public IValueLookupParameter<IntValue> LengthParameter
+        {
+            get { return (IValueLookupParameter<IntValue>)Parameters["Length"]; }
+        }
+        public IValueLookupParameter<IntMatrix> BoundsParameter
+        {
+            get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
+        }
+        #endregion
+
+        #region Properties
+        [Storable]
+        private IList<Type> moveTypes;
+        public IList<Type> MoveTypes
+        {
+            get
+            {
+                if(moveTypes == null) moveTypes = ApplicationManager.Manager.GetTypes(typeof(IMove)).ToList();
+                return moveTypes;
+            }
+            set
+            {
+                moveTypes = value;
+            }
+        }
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        protected MoveVectorCreator(bool deserializing) : base(deserializing) { }
+        protected MoveVectorCreator(MoveVectorCreator original, Cloner cloner) : base(original, cloner) { }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+        }
+        #endregion
+
+        protected MoveVectorCreator(): base() {
+            Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+            Parameters.Add(new LookupParameter<MoveVector>("MoveVector", "The move vector which should be manipulated."));
+            Parameters.Add(new ValueLookupParameter<IntValue>("Length", "The length of the vector."));
+            Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "The bounds matrix can contain one row for each dimension with three columns specifying minimum (inclusive), maximum (exclusive), and step size. If less rows are given the matrix is cycled."));
+        }
+
+        public override IOperation InstrumentedApply()
+        {
+            MoveVectorParameter.ActualValue = Create(RandomParameter.ActualValue, LengthParameter.ActualValue, BoundsParameter.ActualValue);
+            return base.InstrumentedApply();
+        }
+
+        public abstract MoveVector Create(IRandom random, IntValue length, IntMatrix bounds);
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCrossover.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCrossover.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorCrossover.cs	(revision 16114)
@@ -0,0 +1,52 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("MoveVectorCrossover", "A base class for operators that perform a crossover of int-valued vectors.")]
+    [StorableClass]
+    public abstract class MoveVectorCrossover : MoveVectorOperator, IMoveVectorCrossover, IStochasticOperator
+    {
+        public override bool CanChangeName
+        {
+            get { return false; }
+        }
+        public ILookupParameter<IRandom> RandomParameter
+        {
+            get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+        }
+        public ILookupParameter<ItemArray<MoveVector>> ParentsParameter
+        {
+            get { return (ScopeTreeLookupParameter<MoveVector>)Parameters["Parents"]; }
+        }
+        public ILookupParameter<MoveVector> ChildParameter
+        {
+            get { return (ILookupParameter<MoveVector>)Parameters["Child"]; }
+        }
+
+        [StorableConstructor]
+        protected MoveVectorCrossover(bool deserializing) : base(deserializing) { }
+        protected MoveVectorCrossover(MoveVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+        protected MoveVectorCrossover() : base()
+        {
+            Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+            Parameters.Add(new ScopeTreeLookupParameter<MoveVector>("Parents", "The parent vectors which should be crossed."));
+            ParentsParameter.ActualName = "IntegerVector";
+            Parameters.Add(new LookupParameter<MoveVector>("Child", "The child vector resulting from the crossover."));
+            ChildParameter.ActualName = "IntegerVector";
+        }
+
+        public sealed override IOperation InstrumentedApply()
+        {
+            ChildParameter.ActualValue = Cross(RandomParameter.ActualValue, ParentsParameter.ActualValue);
+            return base.InstrumentedApply();
+        }
+
+        protected abstract MoveVector Cross(IRandom random, ItemArray<MoveVector> parents);
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorEncoding.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorEncoding.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorEncoding.cs	(revision 16114)
@@ -0,0 +1,241 @@
+﻿using HeuristicLab.Optimization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Parameters;
+using HeuristicLab.Encodings.MoveVectorEncoding.Creators;
+using HeuristicLab.Data.MoveVectorData;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("MoveVectorEncoding", "Describes a Move Vector encoding.")]
+    [StorableClass]
+    public sealed class MoveVectorEncoding : Encoding<IMoveVectorCreator>
+    {
+        #region Parameter Properties
+        [Storable]
+        private IFixedValueParameter<IntValue> lengthParameter;
+        public IFixedValueParameter<IntValue> LengthParameter
+        {
+            get { return lengthParameter; }
+            set
+            {
+                if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
+                if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
+                if (lengthParameter == value) return;
+
+                if (lengthParameter != null) Parameters.Remove(lengthParameter);
+                lengthParameter = value;
+                Parameters.Add(lengthParameter);
+                OnLengthParameterChanged();
+            }
+        }
+        [Storable]
+        private IValueParameter<IntMatrix> boundsParameter;
+        public IValueParameter<IntMatrix> BoundsParameter
+        {
+            get { return boundsParameter; }
+            set
+            {
+                if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
+                if (boundsParameter == value) return;
+
+                if (boundsParameter != null) Parameters.Remove(boundsParameter);
+                boundsParameter = value;
+                Parameters.Add(boundsParameter);
+                OnBoundsParameterChanged();
+            }
+        }
+        #endregion
+
+        #region Properties
+        public int Length
+        {
+            get { return LengthParameter.Value.Value; }
+            set { LengthParameter.Value.Value = value; }
+        }
+        public IntMatrix Bounds
+        {
+            get { return BoundsParameter.Value; }
+            set { BoundsParameter.Value = value; }
+        }
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        private MoveVectorEncoding(bool deserializing) : base(deserializing) { }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterParameterEvents();
+            DiscoverOperators();
+        }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new MoveVectorEncoding(this, cloner);
+        }
+        private MoveVectorEncoding(MoveVectorEncoding original, Cloner cloner) : base(original, cloner) {
+            lengthParameter = cloner.Clone(original.lengthParameter);
+            boundsParameter = cloner.Clone(original.boundsParameter);
+            RegisterParameterEvents();
+        }
+
+        #endregion
+
+        public MoveVectorEncoding() : this("MoveVector", 10) { }
+        public MoveVectorEncoding(string name) : this(name, 10) { }
+        public MoveVectorEncoding(int length, int min, int max) : this("MoveVector", length, min, max) { }
+        public MoveVectorEncoding(string name, int length, int min = int.MinValue, int max = int.MaxValue, int? step = null) 
+            : base(name)
+        {
+            if (min >= max) throw new ArgumentException("min must be less than max", "min");
+            if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step");
+
+            var bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
+            bounds[0, 0] = min;
+            bounds[0, 1] = max;
+            if (step.HasValue) bounds[0, 2] = step.Value;
+
+            lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+            boundsParameter = new ValueParameter<IntMatrix>(Name + ".Bounds", bounds);
+            Parameters.Add(lengthParameter);
+            Parameters.Add(boundsParameter);
+
+            SolutionCreator = new RandomMoveVectorCreator();
+            RegisterParameterEvents();
+            DiscoverOperators();
+        }
+
+        #region Operators
+        private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+        static MoveVectorEncoding()
+        {
+            encodingSpecificOperatorTypes = new List<Type>() {
+                typeof(IMoveVectorOperator),
+                typeof(IMoveVectorCreator),
+                typeof(IMoveVectorCrossover),
+                typeof(IMoveVectorManipulator)
+            };
+        }
+        private void DiscoverOperators()
+        {
+            var assembly = typeof(IMoveVectorOperator).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);
+        }
+        public override void ConfigureOperators(IEnumerable<IOperator> operators)
+        {
+            ConfigureBoundedOperators(operators.OfType<IBoundedMoveVectorOperator>());
+            ConfigureCreators(operators.OfType<IMoveVectorCreator>());
+            ConfigureCrossovers(operators.OfType<IMoveVectorCrossover>());
+            ConfigureManipulators(operators.OfType<IMoveVectorManipulator>());
+            ConfigureShakingOperators(operators.OfType<IMoveVectorMultiNeighborhoodShakingOperator>());
+        }
+
+        private void ConfigureBoundedOperators(IEnumerable<IBoundedMoveVectorOperator> boundedOperators)
+        {
+            foreach (var boundedOperator in boundedOperators)
+            {
+                boundedOperator.BoundsParameter.ActualName = BoundsParameter.Name;
+            }
+        }
+        private void ConfigureCreators(IEnumerable<IMoveVectorCreator> creators)
+        {
+            foreach (var creator in creators)
+            {
+                creator.MoveVectorParameter.ActualName = Name;
+                creator.BoundsParameter.ActualName = BoundsParameter.Name;
+                creator.LengthParameter.ActualName = LengthParameter.Name;
+            }
+        }
+        private void ConfigureCrossovers(IEnumerable<IMoveVectorCrossover> crossovers)
+        {
+            foreach (var crossover in crossovers)
+            {
+                crossover.ChildParameter.ActualName = Name;
+                crossover.ParentsParameter.ActualName = Name;
+            }
+        }
+
+        private void ConfigureManipulators(IEnumerable<IMoveVectorManipulator> manipulators)
+        {
+            foreach (var manipulator in manipulators)
+            {
+                manipulator.MoveVectorParameter.ActualName = Name;
+                manipulator.MoveVectorParameter.Hidden = true;
+                var sm = manipulator as ISelfAdaptiveManipulator;
+                if (sm != null)
+                {
+                    var p = sm.StrategyParameterParameter as ILookupParameter;
+                    if (p != null)
+                    {
+                        p.ActualName = Name + "Strategy";
+                    }
+                }
+            }
+        }
+
+        private void ConfigureShakingOperators(IEnumerable<IMoveVectorMultiNeighborhoodShakingOperator> shakingOperators)
+        {
+            foreach (var shakingOperator in shakingOperators)
+            {
+                shakingOperator.MoveVectorParameter.ActualName = Name;
+            }
+        }
+        #endregion
+
+        #region Events
+        private void RegisterParameterEvents()
+        {
+            RegisterLengthParameterEvents();
+            RegisterBoundsParameterEvents();
+        }
+        private void OnLengthParameterChanged()
+        {
+            RegisterLengthParameterEvents();
+            ConfigureOperators(Operators);
+        }
+        private void OnBoundsParameterChanged()
+        {
+            RegisterBoundsParameterEvents();
+            ConfigureOperators(Operators);
+        }
+        private void RegisterLengthParameterEvents()
+        {
+            LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+            LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+        }
+        private void RegisterBoundsParameterEvents()
+        {
+            BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+            boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators);
+        }
+        #endregion
+    }
+
+    public static class IndividualExtensionMethods
+    {
+        public static MoveVector MoveVector(this Individual individual)
+        {
+            var encoding = individual.GetEncoding<MoveVectorEncoding>();
+            return individual.MoveVector(encoding.Name);
+        }
+
+        public static MoveVector MoveVector(this Individual individual, string name)
+        {
+            return (MoveVector)individual[name];
+        }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorManipulator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorManipulator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorManipulator.cs	(revision 16114)
@@ -0,0 +1,45 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("MoveVectorManipulator", "A base class for operators that manipulate move vectors.")]
+    [StorableClass]
+    public abstract class MoveVectorManipulator : MoveVectorOperator, IMoveVectorManipulator, IStochasticOperator
+    {
+        public override bool CanChangeName
+        {
+            get { return false; }
+        }
+        public ILookupParameter<IRandom> RandomParameter
+        {
+            get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+        }
+        public ILookupParameter<MoveVector> MoveVectorParameter
+        {
+            get { return (ILookupParameter<MoveVector>)Parameters["MoveVector"]; }
+        }
+
+        [StorableConstructor]
+        protected MoveVectorManipulator(bool deserializing) : base(deserializing) { }
+        protected MoveVectorManipulator(MoveVectorManipulator original, Cloner cloner) : base(original, cloner) { }
+        protected MoveVectorManipulator() : base()
+        {
+            Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+            Parameters.Add(new LookupParameter<MoveVector>("MoveVector", "The vector which should be manipulated."));
+        }
+
+        public sealed override IOperation InstrumentedApply()
+        {
+            Manipulate(RandomParameter.ActualValue, MoveVectorParameter.ActualValue);
+            return base.InstrumentedApply();
+        }
+
+        protected abstract void Manipulate(IRandom random, MoveVector moveVector);
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorOperator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorOperator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/MoveVectorOperator.cs	(revision 16114)
@@ -0,0 +1,24 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Item("MoveVectorOperator", "Base class for move vector operators.")]
+    [StorableClass]
+    public abstract class MoveVectorOperator : InstrumentedOperator, IMoveVectorOperator
+    {
+        [StorableConstructor]
+        protected MoveVectorOperator(bool deserializing) : base(deserializing) { }
+        protected MoveVectorOperator(MoveVectorOperator original, Cloner cloner) : base(original, cloner) { }
+        public MoveVectorOperator() : base() { }
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,20 @@
+﻿using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.MoveVectorEncoding
+{
+    [Plugin("HeuristicLab.Encodings.MoveVectorEncoding", "Provides operators and related classes for the MoveVector encoding.", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Encodings.MoveVectorEncoding-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Data.MoveVectorData", "3.3")]
+    [PluginDependency("HeuristicLab.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Parameters", "3.3")]
+    [PluginDependency("HeuristicLab.Persistence", "3.3")]
+    public class HeuristicLabEncodingsMoveVectorEncodingPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.Encodings.MoveVectorEncoding")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Encodings.MoveVectorEncoding")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("e77aa79e-efff-4038-a2d0-dd9be070705c")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/ShakingOperators/MoveVectorShakingOperator.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/ShakingOperators/MoveVectorShakingOperator.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Encodings.MoveVectorEncoding/3.3/ShakingOperators/MoveVectorShakingOperator.cs	(revision 16114)
@@ -0,0 +1,94 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Encodings.MoveVectorEncoding.Interfaces;
+using HeuristicLab.Data.MoveVectorData;
+
+namespace HeuristicLab.Encodings.IntegerVectorEncoding
+{
+    /// <summary>
+    /// A shaking operator for VNS.
+    /// </summary>
+    [Item("MoveVectorShakingOperator", "A shaking operator for VNS which uses available manipulation operators to perform the shaking.")]
+    [StorableClass]
+    public class MoveVectorShakingOperator : ShakingOperator<IMoveVectorManipulator>, IMoveVectorMultiNeighborhoodShakingOperator, IStochasticOperator, IBoundedMoveVectorOperator
+    {
+
+        public ILookupParameter<MoveVector> MoveVectorParameter
+        {
+            get { return (ILookupParameter<MoveVector>)Parameters["MoveVector"]; }
+        }
+
+        public ILookupParameter<IRandom> RandomParameter
+        {
+            get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+        }
+
+        public IValueLookupParameter<IntMatrix> BoundsParameter
+        {
+            get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
+        }
+
+        [StorableConstructor]
+        protected MoveVectorShakingOperator(bool deserializing) : base(deserializing) { }
+        protected MoveVectorShakingOperator(MoveVectorShakingOperator original, Cloner cloner) : base(original, cloner) { }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new MoveVectorShakingOperator(this, cloner);
+        }
+        public MoveVectorShakingOperator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<MoveVector>("MoveVector", "The move vector to shake."));
+            Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator that will be used for stochastic shaking operators."));
+            Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "A 2 column matrix specifying the lower and upper bound for each dimension. If there are less rows than dimension the bounds vector is cycled."));
+
+            foreach (IMoveVectorManipulator shaker in ApplicationManager.Manager.GetInstances<IMoveVectorManipulator>().OrderBy(x => x.Name))
+                if (!(shaker is ISelfAdaptiveManipulator)) Operators.Add(shaker);
+        }
+
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            #region Backwards compatible code, remove with 3.4
+            if (!Parameters.ContainsKey("Bounds"))
+                Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "A 2 column matrix specifying the lower and upper bound for each dimension. If there are less rows than dimension the bounds vector is cycled."));
+            #endregion
+        }
+
+        #region Wiring of some parameters
+        protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMoveVectorManipulator>> e)
+        {
+            base.Operators_ItemsAdded(sender, e);
+            ParameterizeOperators(e.Items);
+        }
+
+        protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMoveVectorManipulator>> e)
+        {
+            base.Operators_ItemsReplaced(sender, e);
+            ParameterizeOperators(e.Items);
+        }
+
+        private void ParameterizeOperators(IEnumerable<IndexedItem<IMoveVectorManipulator>> items)
+        {
+            if (items.Any())
+            {
+                foreach (IStochasticOperator op in items.Select(x => x.Value).OfType<IStochasticOperator>())
+                    op.RandomParameter.ActualName = RandomParameter.Name;
+                foreach (IMoveVectorManipulator op in items.Select(x => x.Value).OfType<IMoveVectorManipulator>())
+                    op.MoveVectorParameter.ActualName = MoveVectorParameter.Name;
+                foreach (IBoundedMoveVectorOperator op in items.Select(x => x.Value).OfType<IBoundedMoveVectorOperator>())
+                    op.BoundsParameter.ActualName = "MoveVector." + BoundsParameter.Name;
+            }
+        }
+        #endregion
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/BlocksRelocationProblem.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/BlocksRelocationProblem.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/BlocksRelocationProblem.cs	(revision 16114)
@@ -0,0 +1,421 @@
+﻿using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Moves;
+using HeuristicLab.Encodings.MoveVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.BlocksRelocationProblem
+{
+
+    [Item("Blocks Relocation Problem (BRP)", "Represents a Blocks Relocation Problem.")]
+    [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 111)]
+    [StorableClass]
+    public class BlocksRelocationProblem : SingleObjectiveBasicProblem<MoveVectorEncoding>
+    {
+        private const int INITIAL_WIDTH = 6;
+        private const int INITIAL_HEIGHT = 7;
+        private const double INITIAL_FILL_RATE = 0.5;
+
+        #region Parameter Properties
+        protected IValueParameter<IntValue> StackAreaWidthParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaWidth"]; }
+        }
+        protected IValueParameter<IntValue> StackAreaHeightParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaHeight"]; }
+        }
+        protected IValueParameter<IntValue> MaximumMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["MaximumMoves"]; }
+        }
+        protected IValueParameter<IntValue> InitSeedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["InitSeed"]; }
+        }
+        protected IValueParameter<DoubleValue> FillRateParameter
+        {
+            get { return (IValueParameter<DoubleValue>)Parameters["FillRate"]; }
+        }
+        protected IValueParameter<StackingArea> StartStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["StartStackArea"]; }
+        }
+        protected IValueParameter<MoveVector> BestKnownSolutionParameter
+        {
+            get { return (IValueParameter<MoveVector>)Parameters["BestKnownSolution"]; }
+        }
+        protected IValueParameter<StackingArea> BestKnownStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["BestKnownStackArea"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownDislocatedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownDislocated"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownMoves"]; }
+        }
+        #endregion
+
+        #region Properties
+        public int StackAreaWidth
+        {
+            get { return StackAreaWidthParameter.Value.Value; }
+            set
+            {
+                StackAreaWidthParameter.Value.Value = value;
+                Encoding.Length = value;
+            }
+        }
+        public int StackAreaHeight
+        {
+            get { return StackAreaHeightParameter.Value.Value; }
+            set {
+                StackAreaHeightParameter.Value.Value = value;
+                Encoding.Bounds[0, 0] = 0;
+                Encoding.Bounds[0, 1] = value;
+            }
+        }
+        public int MaximumMoves
+        {
+            get { return MaximumMovesParameter.Value.Value; }
+            set
+            {
+                MaximumMovesParameter.Value.Value = value;
+                Encoding.Length = value;
+            }
+        }
+        public int InitSeed
+        {
+            get { return InitSeedParameter.Value.Value; }
+            set { InitSeedParameter.Value.Value = value; }
+        }
+        public double FillRate
+        {
+            get { return FillRateParameter.Value.Value; }
+            set { FillRateParameter.Value.Value = value; }
+        }
+        public StackingArea StartStackArea
+        {
+            get { return StartStackAreaParameter.Value; }
+            set { StartStackAreaParameter.Value = value; }
+        }
+        public MoveVector BestKnownSolution
+        {
+            get { return BestKnownSolutionParameter.Value; }
+            set { BestKnownSolutionParameter.Value = value; }
+        }
+        public StackingArea BestKnownStackArea
+        {
+            get { return BestKnownStackAreaParameter.Value; }
+            set { BestKnownStackAreaParameter.Value = value; }
+        }
+        public IntValue BestKnownDislocated
+        {
+            get { return BestKnownDislocatedParameter.Value; }
+            set { BestKnownDislocatedParameter.Value = value; }
+        }
+        public IntValue BestKnownMoves
+        {
+            get { return BestKnownMovesParameter.Value; }
+            set { BestKnownMovesParameter.Value = value; }
+        }
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        protected BlocksRelocationProblem(bool deserializing) : base(deserializing) { }
+        public BlocksRelocationProblem(BlocksRelocationProblem alg, Cloner cloner) : base(alg, cloner)
+        {
+            RegisterEventHandlers();
+        }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new BlocksRelocationProblem(this, cloner);
+        }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterEventHandlers();
+        }
+        #endregion
+
+        public BlocksRelocationProblem() {
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaWidth", "Defines the width of the stacking arew.", new IntValue(INITIAL_WIDTH)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaHeight", "Defines the maximum height of the stacking area.", new IntValue(INITIAL_HEIGHT)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("MaximumMoves", "Defines the maximum ammount of move actions.", new IntValue(2 * INITIAL_WIDTH * INITIAL_HEIGHT)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("InitSeed", "Seed for the random stacking area number generator.", new IntValue(Convert.ToInt32(DateTime.Now.Ticks % 10000))));
+            Parameters.Add(new OptionalValueParameter<DoubleValue>("FillRate", "How much containers are randomly generated in the stacking area.", new DoubleValue(INITIAL_FILL_RATE)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("StartStackArea", "Defines the status of the stacking area at the start of the computation.", new StackingArea(StackAreaWidth, StackAreaHeight)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("BestKnownStackArea", "Best known StackArea solution."));
+            Parameters.Add(new OptionalValueParameter<MoveVector>("BestKnownSolution", "Best Solution found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownDislocated", "Best amount of dislocated containers found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownMoves", "Best amount of moves found."));
+            Encoding = new MoveVectorEncoding(MaximumMoves, 0, StackAreaWidth);
+            Encoding.SolutionCreator.MoveTypes = new List<Type>() { typeof(TwoPointMove) };
+            RandomizeStackingAreas();
+            RegisterEventHandlers();
+        }
+
+        private void RandomizeStackingAreas()
+        {
+            StartStackArea.Randomize(FillRate, InitSeed);
+        }
+
+        public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random)
+        {
+            var neighbours = new List<Individual>();
+            var currentSolution = individual.MoveVector();
+
+            for (int i = 0; i < currentSolution.Length; i++)
+            {
+                //change moves
+                var move = currentSolution[i];
+                foreach (var newMove in move.GenerateNeighbours(random, 0, StackAreaWidth - 1))
+                {
+                    var copy1 = individual.Copy();
+                    copy1.MoveVector()[i] = newMove;
+                    neighbours.Add(copy1);
+                }
+
+                //change position
+                if (currentSolution.Length > 1)
+                {
+                    var len = currentSolution.Length - 1;
+                    var right = individual.Copy();
+                    var r = right.MoveVector();
+                    var left = individual.Copy();
+                    var l = left.MoveVector();
+                    if (i == 0)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, len);
+                    }
+                    else if (i == len)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, 0);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    else
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    neighbours.Add(right);
+                    neighbours.Add(left);
+                }
+            }
+
+            neighbours.AddRange(base.GetNeighbors(individual, random));
+            return neighbours;
+        }
+
+        private static void Swap(MoveVector c, int index1, int index2)
+        {
+            var save = c[index1];
+            c[index1] = c[index2];
+            c[index2] = save;
+        }
+
+        #region EventHandlers
+        private void RegisterEventHandlers()
+        {
+            //this.Reset += StackingProblem_Reset;
+            StackAreaWidthParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            StackAreaHeightParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            MaximumMovesParameter.Value.ValueChanged += MaxiumumMoves_Changed;
+            InitSeedParameter.Value.ValueChanged += InitSeed_Changed;
+            FillRateParameter.Value.ValueChanged += FillRate_Changed;
+        }
+
+        private void FillRate_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        private void InitSeed_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        private void MaxiumumMoves_Changed(object sender, EventArgs e)
+        {
+            Encoding.Length = MaximumMoves;
+        }
+
+        private void StackAreaDimensions_Changed(object sender, EventArgs e)
+        {
+            StartStackArea = new StackingArea(StackAreaWidth, StackAreaHeight);
+            RandomizeStackingAreas();
+            Encoding.Bounds[0, 0] = 0;
+            Encoding.Bounds[0, 1] = StackAreaWidth;
+            MaximumMoves = 2 * StackAreaWidth * StackAreaHeight;
+            Encoding.Length = MaximumMoves;
+        }
+        #endregion
+
+        public override bool Maximization { get { return false; } }
+
+        public static double Evaluate(MoveVector moveVector, ref StackingArea area, ref EvaluationResult result)
+        {
+            int height = area.MaxHeight;
+            int width = area.Size;
+            int score = 0, dislocated = 0;
+            int realMoves = 0;
+            int moves = StackingArea.ApplyMoves(ref area, moveVector, out realMoves);
+            
+            for (int stack = 0; stack < width; stack++)
+            {
+                int containerCount = height;
+                
+                for (int row = height - 1; row >= 0; row--)
+                {
+                    if (area[row, stack] == 0)
+                    {
+                        containerCount--;
+                    } else
+                    {
+                        int diff = 0;
+                        if (row != height - 1 && area[row + 1, stack] != 0)
+                        {
+                            diff = area[row, stack] - area[row + 1, stack] - 1;
+                        }
+                        int atop = containerCount - row;
+                        int rowScore = 0;
+                        if (diff < 0)
+                        {
+                            dislocated++;
+                            rowScore = Convert.ToInt32(Math.Pow(diff, 2) + 20) * atop;
+                        } else
+                        {
+                            rowScore = diff * atop;
+                        }
+                        score = score + rowScore;
+                    }
+                }
+            }
+            result.moves = realMoves;
+            result.dislocated = dislocated;
+            return score * dislocated + moves;
+        }
+
+        public override double Evaluate(Individual individual, IRandom random)
+        {
+            MoveVector moveVector = individual.MoveVector();
+            StackingArea newStackingArea = (StackingArea)StartStackArea.Clone();
+            EvaluationResult result = new EvaluationResult();
+            double quality = Evaluate(moveVector, ref newStackingArea, ref result);
+            if (BestKnownQuality.Equals(double.NaN) || quality < BestKnownQuality)
+            {
+                BestKnownQuality = quality;
+                BestKnownSolution = moveVector;
+                BestKnownStackArea = newStackingArea;
+                BestKnownDislocated = new IntValue(result.dislocated);
+                BestKnownMoves = new IntValue(result.moves);
+            }
+            return quality;
+        }
+
+        public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random)
+        {
+            base.Analyze(individuals, qualities, results, random);
+
+            /*
+            var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+            var best = orderedIndividuals.First().Individual;
+
+            MoveVector moveVector = best.MoveVector();
+            StackingArea newStackingArea = (StackingArea)StartStackArea.Clone();
+            EvaluationResult result = new EvaluationResult();
+            double quality = Evaluate(moveVector, ref newStackingArea, ref result);
+            if (!results.ContainsKey("BestKnownQuality"))
+            {
+                results.Add(new Result("BestKnownQuality", typeof(DoubleValue)));
+            }
+            if (!results.ContainsKey("BestKnownSolution"))
+            {
+                results.Add(new Result("BestKnownSolution", typeof(MoveVector)));
+            }
+            if (!results.ContainsKey("BestKnownMoves"))
+            {
+                results.Add(new Result("BestKnownMoves", typeof(IntValue)));
+            }
+            if (!results.ContainsKey("BestKnownDislocated"))
+            {
+                results.Add(new Result("BestKnownDislocated", typeof(IntValue)));
+            }
+            if (!results.ContainsKey("BestKnownStackingArea"))
+            {
+                results.Add(new Result("BestKnownStackingArea", typeof(StackingArea)));
+            }
+
+            if (results["BestKnownQuality"].Value == null || ((DoubleValue)results["BestKnownQuality"].Value).Value > BestKnownQuality)
+            {
+                results["BestKnownQuality"].Value = new DoubleValue(BestKnownQuality);
+                results["BestKnownSolution"].Value = (IItem)BestKnownSolution.Clone();
+                results["BestKnownMoves"].Value = new IntValue(BestKnownMoves.Value);
+                results["BestKnownDislocated"].Value = new IntValue(BestKnownDislocated.Value);
+                results["BestKnownStackingArea"].Value = (IItem)BestKnownStackArea.Clone();
+            }*/
+
+            if (!results.ContainsKey("Move History"))
+            {
+                string description = "Shows move amount.";
+                Analysis.DataTable add;
+                add = new Analysis.DataTable("Amount of Moves", description);
+                add.VisualProperties.XAxisTitle = "Iteration";
+                add.VisualProperties.YAxisTitle = "Moves";
+                results.Add(new Result("Move History", description, add));
+            }
+
+            if (!results.ContainsKey("Dislocated History"))
+            {
+                string description = "Shows move amount.";
+                Analysis.DataTable add;
+                add = new Analysis.DataTable("Dislocated Containers", description);
+                add.VisualProperties.XAxisTitle = "Iteration";
+                add.VisualProperties.YAxisTitle = "Dislocated Containers";
+                results.Add(new Result("Dislocated History", description, add));
+            }
+
+            Analysis.DataTable moveHistory = (Analysis.DataTable)results["Move History"].Value;
+            Analysis.DataRow row;
+            if (!moveHistory.Rows.TryGetValue("MoveDistribution", out row))
+            {
+                row = new Analysis.DataRow("MoveDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                moveHistory.Rows.Add(row);
+            }
+            row.Values.Add(BestKnownMoves.Value);
+
+            Analysis.DataTable dislocatedHistory = (Analysis.DataTable)results["Dislocated History"].Value;
+            if (!dislocatedHistory.Rows.TryGetValue("DislocatedDistribution", out row))
+            {
+                row = new Analysis.DataRow("DislocatedDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                dislocatedHistory.Rows.Add(row);
+            }
+            row.Values.Add(BestKnownDislocated.Value);
+        }
+    }
+    public class EvaluationResult
+    {
+        public int moves;
+        public int dislocated;
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/HeuristicLab.Problems.BlocksRelocationProblem-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/HeuristicLab.Problems.BlocksRelocationProblem-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/HeuristicLab.Problems.BlocksRelocationProblem-3.3.csproj	(revision 16114)
@@ -0,0 +1,131 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{794963E4-7348-4D4C-B4C8-44E580B98FBA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BlocksRelocationProblem</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BlocksRelocationProblem-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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BlocksRelocationProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj">
+      <Project>{471e9356-0eb6-426b-ae34-988e0c7632c2}</Project>
+      <Name>HeuristicLab.Data.MoveVectorData-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.MoveVectorEncoding\3.3\HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj">
+      <Project>{e77aa79e-efff-4038-a2d0-dd9be070705c}</Project>
+      <Name>HeuristicLab.Encodings.MoveVectorEncoding-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/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BlocksRelocationProblem
+{
+    /// <summary>
+    /// Plugin class for HeuristicLab.Problems.Stacking plugin
+    /// </summary>
+    [Plugin("HeuristicLab.Problems.BlocksRelocationProblem", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Problems.BlocksRelocationProblem-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Analysis", "3.3")]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Data.MoveVectorData", "3.3")]
+    [PluginDependency("HeuristicLab.Encodings.MoveVectorEncoding", "3.3")]
+    [PluginDependency("HeuristicLab.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization", "3.3")]
+    [PluginDependency("HeuristicLab.Parameters", "3.3")]
+    [PluginDependency("HeuristicLab.Persistence", "3.3")]
+    public class HeuristicLabProblemsBlocksRelocationProblemPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksRelocationProblem/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.BlocksRelocationProblem")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[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("794963e4-7348-4d4c-b4c8-44e580b98fba")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/BlocksWorldProblem.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/BlocksWorldProblem.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/BlocksWorldProblem.cs	(revision 16114)
@@ -0,0 +1,436 @@
+﻿using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Moves;
+using HeuristicLab.Encodings.MoveVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.BlocksWorldProblem
+{
+
+    [Item("Blocks World Problem (BWP)", "Represents a Blocks World Problem.")]
+    [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 111)]
+    [StorableClass]
+    public class BlocksWorldProblem : SingleObjectiveBasicProblem<MoveVectorEncoding>
+    {
+        private const int INITIAL_WIDTH = 6;
+        private const int INITIAL_HEIGHT = 7;
+        private const double INITIAL_FILL_RATE = 0.5;
+
+        #region Parameter Properties
+        protected IValueParameter<IntValue> StackAreaWidthParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaWidth"]; }
+        }
+        protected IValueParameter<IntValue> StackAreaHeightParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaHeight"]; }
+        }
+        protected IValueParameter<IntValue> MaximumMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["MaximumMoves"]; }
+        }
+        protected IValueParameter<IntValue> InitSeedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["InitSeed"]; }
+        }
+        protected IValueParameter<DoubleValue> FillRateParameter
+        {
+            get { return (IValueParameter<DoubleValue>)Parameters["FillRate"]; }
+        }
+        protected IValueParameter<StackingArea> StartStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["StartStackArea"]; }
+        }
+        protected IValueParameter<StackingArea> FinalStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["FinalStackArea"]; }
+        }
+        protected IValueParameter<MoveVector> BestKnownSolutionParameter
+        {
+            get { return (IValueParameter<MoveVector>)Parameters["BestKnownSolution"]; }
+        }
+        protected IValueParameter<StackingArea> BestKnownStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["BestKnownStackArea"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownDislocatedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownDislocated"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownMoves"]; }
+        }
+        #endregion
+
+        #region Properties
+        public int StackAreaWidth
+        {
+            get { return StackAreaWidthParameter.Value.Value; }
+            set
+            {
+                StackAreaWidthParameter.Value.Value = value;
+                Encoding.Bounds[0, 0] = 0;
+                Encoding.Bounds[0, 1] = value;
+            }
+        }
+        public int StackAreaHeight
+        {
+            get { return StackAreaHeightParameter.Value.Value; }
+            set {
+                StackAreaHeightParameter.Value.Value = value;
+            }
+        }
+        public int MaximumMoves
+        {
+            get { return MaximumMovesParameter.Value.Value; }
+            set
+            {
+                MaximumMovesParameter.Value.Value = value;
+                Encoding.Length = value;
+            }
+        }
+        public int InitSeed
+        {
+            get { return InitSeedParameter.Value.Value; }
+            set { InitSeedParameter.Value.Value = value; }
+        }
+        public double FillRate
+        {
+            get { return FillRateParameter.Value.Value; }
+            set { FillRateParameter.Value.Value = value; }
+        }
+        public StackingArea StartStackArea
+        {
+            get { return StartStackAreaParameter.Value; }
+            set { StartStackAreaParameter.Value = value; }
+        }
+        public StackingArea FinalStackArea
+        {
+            get { return FinalStackAreaParameter.Value; }
+            set { FinalStackAreaParameter.Value = value; }
+        }
+        public MoveVector BestKnownSolution
+        {
+            get { return BestKnownSolutionParameter.Value; }
+            set { BestKnownSolutionParameter.Value = value; }
+        }
+        public StackingArea BestKnownStackArea
+        {
+            get { return BestKnownStackAreaParameter.Value; }
+            set { BestKnownStackAreaParameter.Value = value; }
+        }
+        public IntValue BestKnownDislocated
+        {
+            get { return BestKnownDislocatedParameter.Value; }
+            set { BestKnownDislocatedParameter.Value = value; }
+        }
+        public IntValue BestKnownMoves
+        {
+            get { return BestKnownMovesParameter.Value; }
+            set { BestKnownMovesParameter.Value = value; }
+        }
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        protected BlocksWorldProblem(bool deserializing) : base(deserializing) { }
+        public BlocksWorldProblem(BlocksWorldProblem alg, Cloner cloner) : base(alg, cloner)
+        {
+            RegisterEventHandlers();
+        }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new BlocksWorldProblem(this, cloner);
+        }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterEventHandlers();
+        }
+        #endregion
+
+        private Dictionary<int, Tuple<int, int>> targetPositions;
+
+        public BlocksWorldProblem() {
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaWidth", "Defines the width of the stacking arew.", new IntValue(INITIAL_WIDTH)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaHeight", "Defines the maximum height of the stacking area.", new IntValue(INITIAL_HEIGHT)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("MaximumMoves", "Defines the maximum ammount of move actions.", new IntValue(2 * INITIAL_WIDTH * INITIAL_HEIGHT)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("InitSeed", "Seed for the random stacking area number generator.", new IntValue(Convert.ToInt32(DateTime.Now.Ticks % 10000))));
+            Parameters.Add(new OptionalValueParameter<DoubleValue>("FillRate", "How much containers are randomly generated in the stacking area.", new DoubleValue(INITIAL_FILL_RATE)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("StartStackArea", "Defines the status of the stacking area at the start of the computation.", new StackingArea(StackAreaWidth, StackAreaHeight)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("FinalStackArea", "Defines the should be status of the stacking area at the end of the computation.", new StackingArea(StackAreaWidth, StackAreaHeight)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("BestKnownStackArea", "Best known StackArea solution."));
+            Parameters.Add(new OptionalValueParameter<MoveVector>("BestKnownSolution", "Best Solution found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownDislocated", "Best amount of dislocated containers found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownMoves", "Best amount of moves found."));
+            Encoding = new MoveVectorEncoding(MaximumMoves, 0, StackAreaWidth);
+            Encoding.SolutionCreator.MoveTypes = new List<Type>() { typeof(TwoPointMove) };
+            RandomizeStackingAreas();
+            RegisterEventHandlers();
+        }
+
+        private void RandomizeStackingAreas()
+        {
+            StartStackArea.Randomize(FillRate, InitSeed);
+            FinalStackArea.Randomize(FillRate, InitSeed * 2);
+        }
+
+        public override bool Maximization { get { return false; } }
+
+        public override double Evaluate(Individual individual, IRandom random)
+        {
+            MoveVector moveVector = individual.MoveVector();
+            StackingArea copy = (StackingArea)StartStackArea.Clone();
+            int realMoves = 0;
+            int dislocated = 0;
+            int moves = StackingArea.ApplyMoves(ref copy, moveVector, out realMoves);
+
+            if(targetPositions == null)
+            {
+                targetPositions = new Dictionary<int, Tuple<int, int>>(StackAreaWidth * StackAreaHeight);
+                for (int i = 0; i < StackAreaWidth; i++)
+                {
+                    for (int j = 0; j < StackAreaHeight; j++)
+                    {
+                        if (FinalStackArea[j, i] != 0)
+                        {
+                            targetPositions.Add(FinalStackArea[j, i], new Tuple<int, int>(j, i));
+                        }
+                    }
+                }
+            }
+
+            int distances = 0;
+            for (int stack = 0; stack < StackAreaWidth; stack++)
+            {
+                int currentStackContainerCount = StackAreaHeight;
+
+                for (int row = StackAreaHeight - 1; row >= 0; row--)
+                {
+                    int currentValue = copy[row, stack];
+                    if (currentValue == 0)
+                    {
+                        currentStackContainerCount--;
+                    }
+                    else
+                    {
+                        if (FinalStackArea[row, stack] - currentValue != 0)
+                        {
+                            dislocated++;
+                            var targetPos = new Tuple<int, int>(row, stack);
+                            if (targetPositions.TryGetValue(currentValue, out targetPos))
+                            {
+                                int distanceBetweenStacks = Math.Abs(targetPos.Item2 - stack);
+                                int distanceAtopSource = currentStackContainerCount - row - 1; // -1 because current container doesn't count
+                                int distanceAtopTarget = Math.Abs(copy[targetPos.Item2].CurrentHeight - targetPos.Item1);
+                                int distance = 0;
+                                if (distanceBetweenStacks == 0)
+                                {
+                                    distance = distanceAtopSource + 1; // +1 because dislocated
+                                }
+                                else {
+                                    distance = distanceAtopSource + distanceAtopTarget + distanceBetweenStacks + 1;
+                                }
+                                distances = distances + distance;
+                            } else
+                            {
+                                throw new AccessViolationException("TryGetValue failed.");
+                            }
+                        }
+                    }
+                }
+
+                /*
+                for (int j = 0; j < StackAreaHeight; j++)
+                {
+                    if (FinalStackArea[j, i] - copy[j, i] != 0)
+                    {
+                        dislocated++;
+                        var near = new Tuple<int, int>(j, i);
+                        if(positions.TryGetValue(copy[j, i], out near))
+                        {
+                            int distanceAtopSource = StackAreaHeight - j;
+                            int distanceAtopTarget = StackAreaHeight - near.Item1;
+                            int distanceBetweenStacks = Math.Abs(near.Item2 - i);
+                            int distance = distanceAtopSource + distanceAtopTarget + distanceBetweenStacks + 1;
+                            distances = distances + distance;
+                        }
+                    }
+                }
+                */
+            }
+
+            double quality = moves + 10 * distances; //distances are 10 times more important than the ammount of moves
+
+            if (BestKnownQuality.Equals(double.NaN) || quality < BestKnownQuality)
+            {
+                BestKnownQuality = quality;
+                BestKnownSolution = moveVector;
+                BestKnownStackArea = copy;
+                BestKnownDislocated = new IntValue(dislocated);
+                BestKnownMoves = new IntValue(realMoves);
+            }
+            return quality;
+        }
+
+        public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random)
+        {
+            var neighbours = new List<Individual>();
+            var currentSolution = individual.MoveVector();
+
+            for (int i = 0; i < currentSolution.Length; i++)
+            {
+                //change moves
+                var move = currentSolution[i];
+                foreach (var newMove in move.GenerateNeighbours(random, 0, StackAreaWidth - 1))
+                {
+                    var copy1 = individual.Copy();
+                    copy1.MoveVector()[i] = newMove;
+                    neighbours.Add(copy1);
+                }
+
+                //change position
+                if (currentSolution.Length > 1)
+                {
+                    var len = currentSolution.Length - 1;
+                    var right = individual.Copy();
+                    var r = right.MoveVector();
+                    var left = individual.Copy();
+                    var l = left.MoveVector();
+                    if (i == 0)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, len);
+                    }
+                    else if (i == len)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, 0);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    else
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    neighbours.Add(right);
+                    neighbours.Add(left);
+                }
+            }
+
+            neighbours.AddRange(base.GetNeighbors(individual, random));
+            return neighbours;
+        }
+
+        private static void Swap(MoveVector c, int index1, int index2)
+        {
+            var save = c[index1];
+            c[index1] = c[index2];
+            c[index2] = save;
+        }
+
+        public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random)
+        {
+            base.Analyze(individuals, qualities, results, random);
+
+            if (!results.ContainsKey("Move History"))
+            {
+                string description = "Shows move amount.";
+                Analysis.DataTable add;
+                add = new Analysis.DataTable("Amount of Moves", description);
+                add.VisualProperties.XAxisTitle = "Iteration";
+                add.VisualProperties.YAxisTitle = "Moves";
+                results.Add(new Result("Move History", description, add));
+            }
+
+            if (!results.ContainsKey("Dislocated History"))
+            {
+                string description = "Shows move amount.";
+                Analysis.DataTable add;
+                add = new Analysis.DataTable("Dislocated Containers", description);
+                add.VisualProperties.XAxisTitle = "Iteration";
+                add.VisualProperties.YAxisTitle = "Dislocated Containers";
+                results.Add(new Result("Dislocated History", description, add));
+            }
+
+            Analysis.DataTable moveHistory = (Analysis.DataTable)results["Move History"].Value;
+            Analysis.DataRow row;
+            if (!moveHistory.Rows.TryGetValue("MoveDistribution", out row))
+            {
+                row = new Analysis.DataRow("MoveDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                moveHistory.Rows.Add(row);
+            }
+            row.Values.Add(BestKnownMoves.Value);
+
+            Analysis.DataTable dislocatedHistory = (Analysis.DataTable)results["Dislocated History"].Value;
+            if (!dislocatedHistory.Rows.TryGetValue("DislocatedDistribution", out row))
+            {
+                row = new Analysis.DataRow("DislocatedDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                dislocatedHistory.Rows.Add(row);
+            }
+            row.Values.Add(BestKnownDislocated.Value);
+        }
+
+        #region EventHandlers
+        private void RegisterEventHandlers()
+        {
+            //this.Reset += StackingProblem_Reset;
+            StackAreaWidthParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            StackAreaHeightParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            MaximumMovesParameter.Value.ValueChanged += MaxiumumMoves_Changed;
+            InitSeedParameter.Value.ValueChanged += InitSeed_Changed;
+            FillRateParameter.Value.ValueChanged += FillRate_Changed;
+        }
+
+        private void FillRate_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        private void InitSeed_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        /*private void StackingProblem_Reset(object sender, EventArgs e)
+        {
+            positions = null;
+            BestKnownQualityParameter.Value = null;
+            BestKnownSolutionParameter.Value = null;
+            BestKnownStackAreaParameter.Value = null;
+        }*/
+
+        private void MaxiumumMoves_Changed(object sender, EventArgs e)
+        {
+            Encoding.Length = MaximumMoves;
+        }
+
+        private void StackAreaDimensions_Changed(object sender, EventArgs e)
+        {
+            StartStackArea = new StackingArea(StackAreaWidth, StackAreaHeight);
+            FinalStackArea = new StackingArea(StackAreaWidth, StackAreaHeight);
+            RandomizeStackingAreas();
+            Encoding.Bounds[0, 0] = 0;
+            Encoding.Bounds[0, 1] = StackAreaWidth;
+            MaximumMoves = StackAreaWidth * StackAreaHeight * 4;
+            Encoding.Length = MaximumMoves;
+        }
+        #endregion
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/HeuristicLab.Problems.BlocksWorldProblem-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/HeuristicLab.Problems.BlocksWorldProblem-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/HeuristicLab.Problems.BlocksWorldProblem-3.3.csproj	(revision 16114)
@@ -0,0 +1,134 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.BlocksWorldProblem</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.BlocksWorldProblem-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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </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">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="BlocksWorldProblem.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj">
+      <Project>{471e9356-0eb6-426b-ae34-988e0c7632c2}</Project>
+      <Name>HeuristicLab.Data.MoveVectorData-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.MoveVectorEncoding\3.3\HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj">
+      <Project>{e77aa79e-efff-4038-a2d0-dd9be070705c}</Project>
+      <Name>HeuristicLab.Encodings.MoveVectorEncoding-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/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.BlocksWorldProblem
+{
+    /// <summary>
+    /// Plugin class for HeuristicLab.Problems.Stacking plugin
+    /// </summary>
+    [Plugin("HeuristicLab.Problems.BlocksWorldProblem", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Problems.BlocksWorldProblem-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Analysis", "3.3")]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Data.MoveVectorData", "3.3")]
+    [PluginDependency("HeuristicLab.Encodings.MoveVectorEncoding", "3.3")]
+    [PluginDependency("HeuristicLab.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Parameters", "3.3")]
+    [PluginDependency("HeuristicLab.Persistence", "3.3")]
+    public class HeuristicLabProblemsBlocksWorldProblemPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.BlocksWorldProblem/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.BlocksWorldProblem")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[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("867a16b8-9a80-4ec8-9f23-802d1ee7bff2")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/HeuristicLab.Problems.Stacking-3.3.csproj
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/HeuristicLab.Problems.Stacking-3.3.csproj	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/HeuristicLab.Problems.Stacking-3.3.csproj	(revision 16114)
@@ -0,0 +1,129 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{13F68501-D586-42A6-BEA1-5F5FDF158600}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Stacking</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Stacking-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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StackingProblem.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj">
+      <Project>{471e9356-0eb6-426b-ae34-988e0c7632c2}</Project>
+      <Name>HeuristicLab.Data.MoveVectorData-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.MoveVectorEncoding\3.3\HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj">
+      <Project>{e77aa79e-efff-4038-a2d0-dd9be070705c}</Project>
+      <Name>HeuristicLab.Encodings.MoveVectorEncoding-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </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/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Plugin.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Plugin.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Plugin.cs	(revision 16114)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Stacking
+{
+    /// <summary>
+    /// Plugin class for HeuristicLab.Problems.Stacking plugin
+    /// </summary>
+    [Plugin("HeuristicLab.Problems.Stacking", "3.3.1.1")]
+    [PluginFile("HeuristicLab.Problems.Stacking-3.3.dll", PluginFileType.Assembly)]
+    [PluginDependency("HeuristicLab.Analysis", "3.3")]
+    [PluginDependency("HeuristicLab.Collections", "3.3")]
+    [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+    [PluginDependency("HeuristicLab.Core", "3.3")]
+    [PluginDependency("HeuristicLab.Data", "3.3")]
+    [PluginDependency("HeuristicLab.Data.MoveVectorData", "3.3")]
+    [PluginDependency("HeuristicLab.Encodings.MoveVectorEncoding", "3.3")]
+    [PluginDependency("HeuristicLab.Operators", "3.3")]
+    [PluginDependency("HeuristicLab.Optimization", "3.3")]
+    [PluginDependency("HeuristicLab.Parameters", "3.3")]
+    [PluginDependency("HeuristicLab.Persistence", "3.3")]
+    public class HeuristicLabProblemsStackingPlugin : PluginBase
+    {
+    }
+}
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Properties/AssemblyInfo.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/Properties/AssemblyInfo.cs	(revision 16114)
@@ -0,0 +1,36 @@
+﻿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.Stacking-3.3")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[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("13f68501-d586-42a6-bea1-5f5fdf158600")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/StackingProblem.cs
===================================================================
--- /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/StackingProblem.cs	(revision 16114)
+++ /branches/2605_StackingProblems/HeuristicLab.Problems.Stacking/3.3/StackingProblem.cs	(revision 16114)
@@ -0,0 +1,467 @@
+﻿using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Data.MoveVectorData;
+using HeuristicLab.Data.MoveVectorData.Interfaces;
+using HeuristicLab.Data.MoveVectorData.Moves;
+using HeuristicLab.Encodings.MoveVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.Stacking
+{
+    [Item("Stacking Problem (SP)", "Represents a Stacking Problem.")]
+    [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 111)]
+    [StorableClass]
+    public class StackingProblem : SingleObjectiveBasicProblem<MoveVectorEncoding>
+    {
+        private const int INITIAL_WIDTH = 6;
+        private const int INITIAL_HEIGHT = 8;
+        private const int INITIAL_INPUT_SIZE = INITIAL_WIDTH * INITIAL_HEIGHT;
+        private const double INITIAL_FILL_RATE = 0.5;
+
+        #region Parameter Properties
+        protected IValueParameter<IntValue> StackAreaWidthParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaWidth"]; }
+        }
+        protected IValueParameter<IntValue> StackAreaHeightParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["StackAreaHeight"]; }
+        }
+        protected IValueParameter<IntValue> InputStackSizeParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["InputStackSize"]; }
+        }
+        protected IValueParameter<IntValue> MaximumMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["MaximumMoves"]; }
+        }
+        protected IValueParameter<IntValue> InitSeedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["InitSeed"]; }
+        }
+        protected IValueParameter<DoubleValue> FillRateParameter
+        {
+            get { return (IValueParameter<DoubleValue>)Parameters["FillRate"]; }
+        }
+        protected IValueParameter<Stack> InputStackParameter
+        {
+            get { return (IValueParameter<Stack>)Parameters["InputStack"]; }
+        }
+        protected IValueParameter<StackingArea> StartStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["StartStackArea"]; }
+        }
+        protected IValueParameter<MoveVector> BestKnownSolutionParameter
+        {
+            get { return (IValueParameter<MoveVector>)Parameters["BestKnownSolution"]; }
+        }
+        protected IValueParameter<StackingArea> BestKnownStackAreaParameter
+        {
+            get { return (IValueParameter<StackingArea>)Parameters["BestKnownStackArea"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownDislocatedParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownDislocated"]; }
+        }
+        protected IValueParameter<IntValue> BestKnownMovesParameter
+        {
+            get { return (IValueParameter<IntValue>)Parameters["BestKnownMoves"]; }
+        }
+        #endregion
+
+        #region Properties
+        public int StackAreaWidth
+        {
+            get { return StackAreaWidthParameter.Value.Value; }
+            set
+            {
+                StackAreaWidthParameter.Value.Value = value;
+                Encoding.Length = value;
+            }
+        }
+        public int InputStackSize
+        {
+            get { return InputStackSizeParameter.Value.Value; }
+            set
+            {
+                InputStackSizeParameter.Value.Value = value;
+            }
+        }
+        public int StackAreaHeight
+        {
+            get { return StackAreaHeightParameter.Value.Value; }
+            set
+            {
+                StackAreaHeightParameter.Value.Value = value;
+                Encoding.Bounds[0, 0] = 0;
+                Encoding.Bounds[0, 1] = value;
+            }
+        }
+        public int MaximumMoves
+        {
+            get { return MaximumMovesParameter.Value.Value; }
+            set
+            {
+                MaximumMovesParameter.Value.Value = value;
+                Encoding.Length = value;
+            }
+        }
+        public int InitSeed
+        {
+            get { return InitSeedParameter.Value.Value; }
+            set { InitSeedParameter.Value.Value = value; }
+        }
+        public double FillRate
+        {
+            get { return FillRateParameter.Value.Value; }
+            set { FillRateParameter.Value.Value = value; }
+        }
+        public Stack InputStack
+        {
+            get { return InputStackParameter.Value; }
+            set { InputStackParameter.Value = value; }
+        }
+        public StackingArea StartStackArea
+        {
+            get { return StartStackAreaParameter.Value; }
+            set { StartStackAreaParameter.Value = value; }
+        }
+        public MoveVector BestKnownSolution
+        {
+            get { return BestKnownSolutionParameter.Value; }
+            set { BestKnownSolutionParameter.Value = value; }
+        }
+        public StackingArea BestKnownStackArea
+        {
+            get { return BestKnownStackAreaParameter.Value; }
+            set { BestKnownStackAreaParameter.Value = value; }
+        }
+        public IntValue BestKnownDislocated
+        {
+            get { return BestKnownDislocatedParameter.Value; }
+            set { BestKnownDislocatedParameter.Value = value; }
+        }
+        public IntValue BestKnownMoves
+        {
+            get { return BestKnownMovesParameter.Value; }
+            set { BestKnownMovesParameter.Value = value; }
+        }
+        #endregion
+
+        #region Cloning
+        [StorableConstructor]
+        protected StackingProblem(bool deserializing) : base(deserializing) { }
+        public StackingProblem(StackingProblem alg, Cloner cloner) : base(alg, cloner)
+        {
+            RegisterEventHandlers();
+        }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new StackingProblem(this, cloner);
+        }
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterEventHandlers();
+        }
+        #endregion
+
+        public StackingProblem()
+        {
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaWidth", "Defines the width of the stacking arew.", new IntValue(INITIAL_WIDTH)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("StackAreaHeight", "Defines the maximum height of the stacking area.", new IntValue(INITIAL_HEIGHT)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("InputStackSize", "Defines the maximum height of the input stack.", new IntValue(INITIAL_INPUT_SIZE)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("MaximumMoves", "Defines the maximum ammount of move actions.", new IntValue(INITIAL_WIDTH * INITIAL_HEIGHT + INITIAL_INPUT_SIZE * 2)));
+            Parameters.Add(new OptionalValueParameter<IntValue>("InitSeed", "Seed for the random stacking area number generator.", new IntValue(Convert.ToInt32(DateTime.Now.Ticks % 10000))));
+            Parameters.Add(new OptionalValueParameter<DoubleValue>("FillRate", "How much containers are randomly generated in the stacking area.", new DoubleValue(INITIAL_FILL_RATE)));
+            Parameters.Add(new OptionalValueParameter<Stack>("InputStack", "Defines the status of the input stack at the start of the computation.", new Stack(0, INITIAL_INPUT_SIZE)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("StartStackArea", "Defines the status of the stacking area at the start of the computation.", new StackingArea(StackAreaWidth, StackAreaHeight)));
+            Parameters.Add(new OptionalValueParameter<StackingArea>("BestKnownStackArea", "Best known StackArea solution."));
+            Parameters.Add(new OptionalValueParameter<MoveVector>("BestKnownSolution", "Best Solution found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownDislocated", "Best amount of dislocated containers found."));
+            Parameters.Add(new OptionalValueParameter<IntValue>("BestKnownMoves", "Best amount of moves found."));
+            Encoding = new MoveVectorEncoding(MaximumMoves, 0, StackAreaWidth);
+            Encoding.SolutionCreator.MoveTypes = new List<Type>() { typeof(TwoPointMove), typeof(IngoingMove), typeof(OutgoingMove) };
+            RandomizeStackingAreas();
+            RegisterEventHandlers();
+        }
+
+        private void RandomizeStackingAreas()
+        {
+            InputStack.Randomize(FillRate, InitSeed);
+        }
+
+        public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random)
+        {
+            var neighbours = new List<Individual>();
+            var currentSolution = individual.MoveVector();
+
+            for (int i = 0; i < currentSolution.Length; i++)
+            {
+                //change type
+                foreach(Type t in Encoding.SolutionCreator.MoveTypes)
+                {
+                    var copy = individual.Copy();
+                    IMove m = (IMove)Activator.CreateInstance(t);
+                    m.Randomize(random, 0, StackAreaWidth - 1);
+                    copy.MoveVector()[i] = m;
+                    neighbours.Add(copy);
+                }
+
+                var move = currentSolution[i];
+                //change moves
+                foreach (var newMove in move.GenerateNeighbours(random, 0, StackAreaWidth - 1))
+                {
+                    var copy1 = individual.Copy();
+                    copy1.MoveVector()[i] = newMove;
+                    neighbours.Add(copy1);
+                }
+
+                //change position
+                if (currentSolution.Length > 1)
+                {
+                    var len = currentSolution.Length - 1;
+                    var right = individual.Copy();
+                    var r = right.MoveVector();
+                    var left = individual.Copy();
+                    var l = left.MoveVector();
+                    if (i == 0)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, len);
+                    }
+                    else if (i == len)
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, 0);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    else
+                    {
+                        r[i].Enabled = true;
+                        Swap(r, i, i + 1);
+                        l[i].Enabled = true;
+                        Swap(l, i, i - 1);
+                    }
+                    neighbours.Add(right);
+                    neighbours.Add(left);
+                }
+            }
+
+            neighbours.AddRange(base.GetNeighbors(individual, random));
+            return neighbours;
+        }
+
+        private static void Swap(MoveVector c, int index1, int index2)
+        {
+            var save = c[index1];
+            c[index1] = c[index2];
+            c[index2] = save;
+        }
+
+        #region EventHandlers
+        private void RegisterEventHandlers()
+        {
+            //this.Reset += StackingProblem_Reset;
+            StackAreaWidthParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            StackAreaHeightParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            InputStackSizeParameter.Value.ValueChanged += StackAreaDimensions_Changed;
+            MaximumMovesParameter.Value.ValueChanged += MaxiumumMoves_Changed;
+            InitSeedParameter.Value.ValueChanged += InitSeed_Changed;
+            FillRateParameter.Value.ValueChanged += FillRate_Changed;
+        }
+
+        private void FillRate_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        private void InitSeed_Changed(object sender, EventArgs e)
+        {
+            RandomizeStackingAreas();
+        }
+
+        /*private void StackingProblem_Reset(object sender, EventArgs e)
+        {
+            positions = null;
+            BestKnownQualityParameter.Value = null;
+            BestKnownSolutionParameter.Value = null;
+            BestKnownStackAreaParameter.Value = null;
+        }*/
+
+        private void MaxiumumMoves_Changed(object sender, EventArgs e)
+        {
+            Encoding.Length = MaximumMoves;
+        }
+
+        private void StackAreaDimensions_Changed(object sender, EventArgs e)
+        {
+            StartStackArea = new StackingArea(StackAreaWidth, StackAreaHeight);
+            InputStack = new Stack(0, InputStackSize);
+            RandomizeStackingAreas();
+            Encoding.Bounds[0, 0] = 0;
+            Encoding.Bounds[0, 1] = StackAreaWidth;
+            MaximumMoves = StackAreaWidth * StackAreaHeight + 2 * InputStackSize;
+            Encoding.Length = MaximumMoves;
+        }
+        #endregion
+
+        public override bool Maximization { get { return false; } }
+
+        public static double Evaluate(MoveVector moveVector, ref StackingArea newStackingArea, ref Stack inputStack, ref EvaluationResult result, StackingArea startStackArea, int stackAreaWidth, int stackAreaHeight)
+        {
+            int realMoves = 0;
+            int moves = StackingArea.ApplyMoves(ref newStackingArea, ref inputStack, moveVector, out realMoves);
+
+            int stillInStackingArea = 0;
+            int stillInInputStack = inputStack.CurrentHeight;
+            int score = 0;
+            for (int stack = 0; stack < stackAreaWidth; stack++)
+            {
+                int containerCount = stackAreaHeight;
+
+                for (int row = stackAreaHeight - 1; row >= 0; row--)
+                {
+                    if (newStackingArea[row, stack] == 0)
+                    {
+                        containerCount--;
+                    }
+                    else
+                    {
+                        int diff = 0;
+                        if (row != stackAreaHeight - 1 && newStackingArea[row + 1, stack] != 0)
+                        {
+                            diff = newStackingArea[row, stack] - newStackingArea[row + 1, stack] - 1;
+                        }
+                        int atop = containerCount - row;
+                        int rowScore = 0;
+                        if (diff < 0)
+                        {
+                            rowScore = Convert.ToInt32(Math.Pow(diff, 2) + 20) * atop;
+                        }
+                        else
+                        {
+                            rowScore = diff * atop;
+                        }
+                        score = score + rowScore;
+                    }
+                }
+                stillInStackingArea = stillInStackingArea + containerCount;
+            }
+
+            result.moves = realMoves;
+            result.dislocated = stillInStackingArea + stillInInputStack;
+            return moves * 2 + stillInInputStack * 1000 + score;
+        }
+
+        public override double Evaluate(Individual individual, IRandom random)
+        {
+            MoveVector moveVector = individual.MoveVector();
+            StackingArea newStackingArea = (StackingArea)StartStackArea.Clone();
+            Stack newInputStack = (Stack)InputStack.Clone();
+            EvaluationResult result = new EvaluationResult();
+            double quality = Evaluate(moveVector, ref newStackingArea, ref newInputStack, ref result, StartStackArea, StackAreaWidth, StackAreaHeight);
+            if (BestKnownQuality.Equals(double.NaN) || quality < BestKnownQuality)
+            {
+                BestKnownQuality = quality;
+                BestKnownSolution = moveVector;
+                BestKnownStackArea = newStackingArea;
+                BestKnownDislocated = new IntValue(result.dislocated);
+                BestKnownMoves = new IntValue(result.moves);
+            }
+            return quality;
+        }
+
+        public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random)
+        {
+            base.Analyze(individuals, qualities, results, random);
+            var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+            var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
+            if (!results.ContainsKey("Best Solution"))
+            {
+                results.Add(new Result("Best Solution", typeof(MoveVector)));
+            }
+            results["Best Solution"].Value = (IItem)best.MoveVector().Clone();
+
+            EvaluationResult result = new EvaluationResult();
+            StackingArea newStackingArea = (StackingArea)StartStackArea.Clone();
+            Stack newInputStack = (Stack)InputStack.Clone();
+            double quality = Evaluate(best.MoveVector(), ref newStackingArea, ref newInputStack, ref result, StartStackArea, StackAreaWidth, StackAreaHeight);
+
+            if (!results.ContainsKey("Best Solution Moves"))
+            {
+                results.Add(new Result("Best Solution Moves", typeof(IntValue)));
+            }
+            results["Best Solution Moves"].Value = new IntValue(result.moves);
+
+            if (!results.ContainsKey("Best Solution Dislocated"))
+            {
+                results.Add(new Result("Best Solution Dislocated", typeof(IntValue)));
+            }
+            results["Best Solution Dislocated"].Value = new IntValue(result.dislocated);
+
+            /*
+            if (!results.ContainsKey("Best Stacking Area"))
+            {
+                results.Add(new Result("Best Stacking Area", typeof(StackingArea)));
+            }
+            results["Best Stacking Area"].Value = newStackingArea;*/
+
+            Analysis.DataTable moveHistory;
+            if (!results.ContainsKey("Move History"))
+            {
+                string description = "Shows move amount.";
+                moveHistory = new Analysis.DataTable("Amount of Moves", description);
+                moveHistory.VisualProperties.XAxisTitle = "Iteration";
+                moveHistory.VisualProperties.YAxisTitle = "Moves";
+                results.Add(new Result("Move History", description, moveHistory));
+            }
+            moveHistory = (Analysis.DataTable)results["Move History"].Value;
+
+            Analysis.DataRow row;
+            if (!moveHistory.Rows.TryGetValue("MoveDistribution", out row))
+            {
+                row = new Analysis.DataRow("MoveDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                moveHistory.Rows.Add(row);
+            }
+            row.Values.Add(result.moves);
+
+
+
+            Analysis.DataTable dislocatedHistory;
+            if (!results.ContainsKey("Dislocated History"))
+            {
+                string description = "Shows move amount.";
+                dislocatedHistory = new Analysis.DataTable("Dislocated Containers", description);
+                dislocatedHistory.VisualProperties.XAxisTitle = "Iteration";
+                dislocatedHistory.VisualProperties.YAxisTitle = "Dislocated Containers";
+                results.Add(new Result("Dislocated History", description, dislocatedHistory));
+            }
+            dislocatedHistory = (Analysis.DataTable)results["Dislocated History"].Value;
+
+            if (!dislocatedHistory.Rows.TryGetValue("DislocatedDistribution", out row))
+            {
+                row = new Analysis.DataRow("DislocatedDistribution");
+                row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Line;
+                dislocatedHistory.Rows.Add(row);
+            }
+            row.Values.Add(result.dislocated);
+        }
+    }
+    public class EvaluationResult
+    {
+        public int moves;
+        public int dislocated;
+    }
+}
Index: /branches/2605_StackingProblems/PreBuildEvent.cmd
===================================================================
--- /branches/2605_StackingProblems/PreBuildEvent.cmd	(revision 16114)
+++ /branches/2605_StackingProblems/PreBuildEvent.cmd	(revision 16114)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
Index: /branches/2605_StackingProblems/StackingProblems.sln
===================================================================
--- /branches/2605_StackingProblems/StackingProblems.sln	(revision 16114)
+++ /branches/2605_StackingProblems/StackingProblems.sln	(revision 16114)
@@ -0,0 +1,123 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.24720.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Data.MoveVectorData-3.3", "HeuristicLab.Data.MoveVectorData\3.3\HeuristicLab.Data.MoveVectorData-3.3.csproj", "{471E9356-0EB6-426B-AE34-988E0C7632C2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Data.MoveVectorData.Views-3.3", "HeuristicLab.Data.MoveVectorData.Views\3.3\HeuristicLab.Data.MoveVectorData.Views-3.3.csproj", "{7F410472-F5B5-4FFF-BA3B-07CF01813572}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Encodings.MoveVectorEncoding-3.3", "HeuristicLab.Encodings.MoveVectorEncoding\3.3\HeuristicLab.Encodings.MoveVectorEncoding-3.3.csproj", "{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BlocksRelocationProblem-3.3", "HeuristicLab.Problems.BlocksRelocationProblem\3.3\HeuristicLab.Problems.BlocksRelocationProblem-3.3.csproj", "{794963E4-7348-4D4C-B4C8-44E580B98FBA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.BlocksWorldProblem-3.3", "HeuristicLab.Problems.BlocksWorldProblem\3.3\HeuristicLab.Problems.BlocksWorldProblem-3.3.csproj", "{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Stacking-3.3", "HeuristicLab.Problems.Stacking\3.3\HeuristicLab.Problems.Stacking-3.3.csproj", "{13F68501-D586-42A6-BEA1-5F5FDF158600}"
+EndProject
+Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "HeuristicLab 3.3", "..\..\trunk\sources\bin\HeuristicLab 3.3.exe", "{7D0808AF-330D-441C-B157-61D5F1060512}"
+	ProjectSection(DebuggerProjectSystem) = preProject
+		PortSupplier = 00000000-0000-0000-0000-000000000000
+		Executable = C:\HL\trunk\sources\bin\HeuristicLab 3.3.exe
+		RemoteMachine = LITTLE-THOUGHT
+		StartingDirectory = C:\HL\trunk\sources\bin
+		Environment = Default
+		LaunchingEngine = 00000000-0000-0000-0000-000000000000
+		UseLegacyDebugEngines = No
+		LaunchSQLEngine = No
+		AttachLaunchAction = No
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|x64.Build.0 = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Debug|x86.Build.0 = Debug|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|x64.ActiveCfg = Release|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|x64.Build.0 = Release|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|x86.ActiveCfg = Release|Any CPU
+		{471E9356-0EB6-426B-AE34-988E0C7632C2}.Release|x86.Build.0 = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|x64.Build.0 = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Debug|x86.Build.0 = Debug|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|x64.ActiveCfg = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|x64.Build.0 = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|x86.ActiveCfg = Release|Any CPU
+		{7F410472-F5B5-4FFF-BA3B-07CF01813572}.Release|x86.Build.0 = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|x64.Build.0 = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Debug|x86.Build.0 = Debug|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|x64.ActiveCfg = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|x64.Build.0 = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|x86.ActiveCfg = Release|Any CPU
+		{E77AA79E-EFFF-4038-A2D0-DD9BE070705C}.Release|x86.Build.0 = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|x64.Build.0 = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Debug|x86.Build.0 = Debug|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|x64.ActiveCfg = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|x64.Build.0 = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|x86.ActiveCfg = Release|Any CPU
+		{794963E4-7348-4D4C-B4C8-44E580B98FBA}.Release|x86.Build.0 = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|x64.Build.0 = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Debug|x86.Build.0 = Debug|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|x64.ActiveCfg = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|x64.Build.0 = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|x86.ActiveCfg = Release|Any CPU
+		{867A16B8-9A80-4EC8-9F23-802D1EE7BFF2}.Release|x86.Build.0 = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|x64.Build.0 = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Debug|x86.Build.0 = Debug|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|Any CPU.Build.0 = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|x64.ActiveCfg = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|x64.Build.0 = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|x86.ActiveCfg = Release|Any CPU
+		{13F68501-D586-42A6-BEA1-5F5FDF158600}.Release|x86.Build.0 = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Debug|Any CPU.ActiveCfg = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Debug|x64.ActiveCfg = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Debug|x86.ActiveCfg = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Release|x64.ActiveCfg = Release|Any CPU
+		{7D0808AF-330D-441C-B157-61D5F1060512}.Release|x86.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
