Index: /branches/2205_OptimizationNetworks/Build.cmd
===================================================================
--- /branches/2205_OptimizationNetworks/Build.cmd	(revision 15895)
+++ /branches/2205_OptimizationNetworks/Build.cmd	(revision 15895)
@@ -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/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 15895)
@@ -0,0 +1,520 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Common.Resources</RootNamespace>
+    <AssemblyName>HeuristicLab.Common.Resources-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="HeuristicLab.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>HeuristicLab.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VSImageLibrary.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>VSImageLibrary.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="HeuristicLab.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>HeuristicLab.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VSImageLibrary.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>VSImageLibrary.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Method.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Module.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Script.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Assembly.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Class.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Component.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Constant.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Control.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Database.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Delegate.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Document.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Drive.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Enum.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_EnumItem.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Error.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Event.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Exception.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Field.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_File.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Insall.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Interface.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Internet.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Library.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Macro.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Map.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_MapItem.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_MethodOverload.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Namespace.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_NetworkConnections.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Object.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Operator.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Properties.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Structure.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Template.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Timer.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Type.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_TypeDef.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Union.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_User.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_UserAccounts.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_ValueType.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Actions_Add.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Actions_Remove.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Down.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Pause.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Play.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Stop.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Restart.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditTable.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_OrgChart.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_ProtectForm.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Redo.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Sort.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_SortUp.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Undo.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Windows.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Open.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Save.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_SaveAll.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_NewDocument.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_NewFolder.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Blue.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Green.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Red.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Zoom.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Copy.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Cut.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_FormulaEvaluator.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Function.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Paste.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Print.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PrintPreview.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Warning.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_RefreshDocument.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Delete.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DeleteFolder.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Pointer.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Breakpoint.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Zoom_In.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Zoom_Out.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Nothing.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Table.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditInformation.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_Collapse.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_Expand.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Edit.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Comment.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Breakpoint_Active.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Breakpoint_Inactive.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Image.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Paused.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Prepared.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Started.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Stopped.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2010ImageLibrary\camera.png" />
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_SaveAsHH.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Checkout.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Clone.png" />
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Information_Large.png" />
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Network_Center_Large.png" />
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Monitor_Large.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor_Vertical.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up_Down.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Paused.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Prepared.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Started.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Stopped.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Paused.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Prepared.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Started.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Stopped.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations_Information.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Help.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_HiddenField.png" />
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_Filter.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Cab.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Gradient.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditBrightnessContrast.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_TrackBar.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_RadialChart.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Statistics.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Performance.png" />
+    <None Include="Resources\HeuristicLab\HeuristicLab.ico" />
+    <None Include="Resources\HeuristicLab\HeuristicLabBanner.png" />
+    <None Include="Resources\HeuristicLab\HeuristicLabLogo.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_ActualSize.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Disconnect.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PublishToWeb.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Refresh.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Database_Modified.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_HighPriority_Large.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Graph.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PieChart.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveFirst.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveLast.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveNext.png" />
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MovePrevious.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.Designer.cs	(revision 15895)
@@ -0,0 +1,93 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18444
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Common.Resources {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class HeuristicLab {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal HeuristicLab() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Common.Resources.HeuristicLab", typeof(HeuristicLab).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap HeuristicLabBanner {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLabBanner", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap HeuristicLabLogo {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLabLogo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
+        /// </summary>
+        public static System.Drawing.Icon Icon {
+            get {
+                object obj = ResourceManager.GetObject("Icon", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+    }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.resx
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.resx	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/HeuristicLab.resx	(revision 15895)
@@ -0,0 +1,130 @@
+﻿<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="HeuristicLabBanner" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLab\HeuristicLabBanner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLabLogo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLab\HeuristicLabLogo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLab\HeuristicLab.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Common.Resources {
+  [Plugin("HeuristicLab.Common.Resources", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Common.Resources-3.3.dll", PluginFileType.Assembly)]
+  public class HeuristicLabCommonResourcesPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+#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.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.Common.Resources")]
+[assembly: AssemblyDescription("This assembly contains common resources")]
+[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("e477780c-b901-4f5d-80d6-056991e55248")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (large).svg
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (large).svg	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (large).svg	(revision 15895)
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1100"
+   height="360"
+   id="svg3726"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="hl_logo_large.svg"
+   inkscape:export-filename="C:\Documents and Settings\Monika Kofler\Desktop\hl_logo4.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3728">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective3734" />
+    <inkscape:perspective
+       id="perspective3744"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="0"
+     inkscape:zoom="1.5417921"
+     inkscape:cx="666.02251"
+     inkscape:cy="135.26634"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="744"
+     inkscape:window-x="-4"
+     inkscape:window-y="-4"
+     inkscape:window-maximized="1"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3761"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3731">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-692.36218)"
+     style="display:inline">
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 135.97656,984.48581 15.31105,-84.8493 -88.282864,-0.3258 -14.65952,86.0025 -29.31903,-0.3258 23.78099,-132.91294 11.72762,-67.75955 0,10e-6 28.34173,0 -14.00798,86.32826 87.957084,10e-6 11.53189,-69.15743 -12.70625,0 34.4026,-44.53527 19.87179,44.53527 -12.70491,0 -15.96259,91.96114 -16.61411,91.0389 -28.6675,0 z"
+       id="path2844-7-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 304.64083,984.48581 0,12.2292 45.03885,-27.0386 -45.03885,-28.016 0,14.8254 -54.32005,-0.1662 -17.60601,0 2.94382,-21.2429 2.60881,-16.8715 8.46994,-51.79699 4.23497,-22.15215 9.7731,-59.94114 -28.668,0 -24.69352,145.68888 -8.78717,54.4818 44.88297,0 30.94787,2e-4 30.21329,0 -2e-5,0 z"
+       id="path2846-4-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+    <g
+       style="font-size:170px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Kartika;-inkscape-font-specification:Kartika"
+       id="text2816">
+      <path
+         d="m 469.02948,874.58496 -10.12695,0 0,-36.1084 -39.92676,0 0,36.1084 -10.04395,0 0,-76.61621 10.04395,0 0,31.37695 39.92676,0 0,-31.37695 10.12695,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3030" />
+      <path
+         d="m 508.5412,875.91309 c -4.03974,-10e-6 -7.71975,-0.65023 -11.04004,-1.95069 -3.32033,-1.30045 -6.17026,-3.18196 -8.54981,-5.64453 -2.37956,-2.46256 -4.21957,-5.49234 -5.52001,-9.08935 -1.30046,-3.59699 -1.95069,-7.71971 -1.95069,-12.36817 0,-4.53773 0.63639,-8.60511 1.90918,-12.20215 1.27278,-3.59696 3.05745,-6.64058 5.35401,-9.13086 2.29653,-2.49018 5.02195,-4.38552 8.17626,-5.68603 3.15428,-1.3004 6.6406,-1.95063 10.45899,-1.95069 3.98434,6e-5 7.58134,0.65029 10.79101,1.95069 3.2096,1.30051 5.94885,3.18202 8.21778,5.64453 2.26883,2.46261 4.01199,5.49239 5.22949,9.08936 1.21739,3.59704 1.82612,7.69208 1.82617,12.28515 l 0,2.40723 -41.75293,0 c 0.22134,3.26499 0.8024,6.08726 1.74317,8.46679 0.94074,2.37958 2.15818,4.34409 3.65234,5.89356 1.49412,1.54949 3.22345,2.68393 5.18799,3.40332 1.96449,0.71941 4.05352,1.07911 6.26709,1.0791 1.66012,10e-6 3.29261,-0.20751 4.89746,-0.62256 1.60478,-0.41503 3.04358,-1.05142 4.31641,-1.90918 1.27274,-0.85773 2.31034,-1.923 3.11279,-3.1958 0.80236,-1.27277 1.25891,-2.73924 1.36963,-4.39941 l 10.12695,0 c -0.38742,2.93295 -1.27284,5.52003 -2.65625,7.76123 -1.38351,2.24122 -3.12668,4.10889 -5.22949,5.60303 -2.10291,1.49414 -4.52397,2.62858 -7.26318,3.40332 -2.7393,0.77474 -5.63074,1.1621 -8.67432,1.16211 z m 14.52637,-34.44825 c -0.83013,-5.3678 -2.61479,-9.366 -5.35401,-11.99463 -2.73929,-2.62853 -6.18411,-3.94282 -10.33447,-3.94287 -1.93688,5e-5 -3.74921,0.31825 -5.43701,0.95459 -1.68785,0.63644 -3.20966,1.60487 -4.56543,2.90528 -1.35581,1.3005 -2.50409,2.96065 -3.44483,4.98047 -0.94077,2.01989 -1.60483,4.38561 -1.99218,7.09716 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3032" />
+      <path
+         d="m 579.84491,867.5293 c -4.92517,5.58919 -10.43135,8.38378 -16.51856,8.38379 -12.56186,-10e-6 -18.84278,-6.83431 -18.84277,-20.50293 l 0,-36.35743 9.87793,0 0,35.94239 c -2e-5,4.53777 0.80239,7.78891 2.40723,9.75342 1.60479,1.96452 4.26104,2.94678 7.96875,2.94677 5.47848,1e-5 10.51428,-2.9606 15.10742,-8.88183 l 0,-39.76075 9.79492,0 0,55.53223 -9.79492,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3034" />
+      <path
+         d="m 633.30194,828.10059 c -1.60485,-0.44267 -3.62471,-0.66402 -6.05957,-0.66407 -4.98049,5e-5 -9.26923,2.62863 -12.86621,7.88575 l 0,39.26269 -9.87793,0 0,-55.53223 9.87793,0 0,7.80274 c 3.98435,-5.97651 8.7988,-8.96479 14.44336,-8.96485 0.71937,6e-5 1.43877,0.0277 2.1582,0.083 0.71937,0.0554 1.49411,0.16607 2.32422,0.33203 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3036" />
+      <path
+         d="m 650.23553,874.58496 -9.87793,0 0,-55.53223 9.87793,0 z m 0,-65.99121 -9.87793,0 0,-10.625 9.87793,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3038" />
+      <path
+         d="m 684.68378,875.91309 c -15.16278,-10e-6 -23.07618,-5.97656 -23.74024,-17.92969 l 9.87793,0 c 0.11067,6.75131 4.70376,10.12696 13.7793,10.12695 4.15036,10e-6 7.27698,-0.81623 9.37988,-2.44873 2.10283,-1.63248 3.15426,-3.77684 3.1543,-6.4331 -4e-5,-1.21744 -0.20756,-2.22736 -0.62256,-3.02979 -0.41508,-0.80239 -1.20365,-1.52179 -2.36572,-2.1582 -1.16215,-0.63637 -2.79463,-1.27277 -4.89746,-1.90918 -2.1029,-0.63637 -4.84215,-1.36961 -8.21778,-2.19971 -3.32033,-0.83005 -6.15643,-1.64629 -8.5083,-2.44873 -2.3519,-0.80238 -4.30258,-1.79847 -5.85205,-2.98828 -1.54949,-1.18975 -2.68392,-2.62855 -3.40332,-4.31641 -0.7194,-1.68779 -1.0791,-3.80448 -1.0791,-6.3501 0,-2.32417 0.48421,-4.4547 1.45264,-6.3916 0.96841,-1.9368 2.35188,-3.61079 4.15039,-5.02197 1.79849,-1.41108 3.98436,-2.51785 6.55761,-3.32031 2.57323,-0.80235 5.43699,-1.20356 8.59131,-1.20362 14.49866,6e-5 21.91402,5.17421 22.2461,15.52247 l -9.87793,0 c -0.33207,-5.25712 -4.2611,-7.8857 -11.78711,-7.88575 -1.54951,5e-5 -3.01598,0.15223 -4.39942,0.45655 -1.38348,0.30441 -2.60093,0.76095 -3.65234,1.36963 -1.05145,0.60877 -1.88153,1.38351 -2.49023,2.32421 -0.60874,0.9408 -0.91311,2.0199 -0.91309,3.23731 -2e-5,1.10681 0.11066,2.00606 0.33203,2.69775 0.22134,0.69177 0.83006,1.32817 1.82617,1.90918 0.99608,0.58109 2.50405,1.16215 4.52393,1.74317 2.01983,0.58109 4.82826,1.31432 8.42529,2.1997 3.32028,0.83011 6.22555,1.67403 8.71582,2.53174 2.4902,0.85778 4.55155,1.90921 6.18408,3.1543 1.63244,1.24514 2.86373,2.75312 3.69385,4.52392 0.83003,1.77086 1.24507,3.9844 1.24512,6.64063 -5e-5,2.43491 -0.51193,4.73146 -1.53565,6.88965 -1.02381,2.15821 -2.50411,4.02588 -4.44091,5.60303 -1.93689,1.57715 -4.28878,2.82226 -7.05567,3.73535 -2.76696,0.91308 -5.86591,1.36962 -9.29687,1.36963 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3040" />
+      <path
+         d="m 739.88397,874.66797 c -1.1068,0.22135 -2.24124,0.38737 -3.40332,0.49805 -1.16213,0.11067 -2.37958,0.16601 -3.65234,0.16601 -3.09898,0 -5.53387,-0.38737 -7.30469,-1.16211 -1.77085,-0.77474 -3.08513,-1.89534 -3.94287,-3.36181 -0.85776,-1.46647 -1.38347,-3.25114 -1.57715,-5.35401 -0.19369,-2.10285 -0.29053,-4.48241 -0.29053,-7.13867 l 0,-31.45996 -6.80664,0 0,-7.80274 6.80664,0 0,-13.69628 9.87793,0 0,13.69628 8.96485,0 0,7.80274 -8.96485,0 0,31.95801 c -2e-5,1.93686 0.1245,3.48634 0.37354,4.64843 0.249,1.16212 0.59487,2.04754 1.0376,2.65625 0.44268,0.60874 1.0099,1.00994 1.70166,1.20362 0.69171,0.19369 1.45261,0.29053 2.28271,0.29052 0.88539,10e-6 1.72931,-0.0277 2.53174,-0.083 0.80238,-0.0553 1.59095,-0.16601 2.36572,-0.33203 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3042" />
+      <path
+         d="m 758.14569,874.58496 -9.87793,0 0,-55.53223 9.87793,0 z m 0,-65.99121 -9.87793,0 0,-10.625 9.87793,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3044" />
+      <path
+         d="m 795.25018,875.91309 c -3.81838,-10e-6 -7.31854,-0.62256 -10.50049,-1.86768 -3.18198,-1.24512 -5.92123,-3.09895 -8.21777,-5.56152 -2.29656,-2.46256 -4.06739,-5.49234 -5.3125,-9.08936 -1.24512,-3.59699 -1.86768,-7.77504 -1.86767,-12.53418 -1e-5,-4.70374 0.62255,-8.86796 1.86767,-12.49267 1.24511,-3.62463 3.01594,-6.65442 5.3125,-9.08936 2.29654,-2.43484 5.03579,-4.27485 8.21777,-5.52002 3.18195,-1.24506 6.68211,-1.86762 10.50049,-1.86768 3.15427,6e-5 6.03187,0.4151 8.63282,1.24512 2.60087,0.83013 4.86974,2.00608 6.80664,3.52783 1.9368,1.52186 3.50011,3.38954 4.68994,5.60303 1.18973,2.21359 1.95063,4.70382 2.28271,7.4707 l -10.12695,0 c -0.11072,-1.66011 -0.51192,-3.12658 -1.20361,-4.39941 -0.69178,-1.27274 -1.59103,-2.33801 -2.69776,-3.1958 -1.10681,-0.8577 -2.39343,-1.50793 -3.85986,-1.95068 -1.46651,-0.44266 -2.97448,-0.66402 -4.52393,-0.66407 -2.37958,5e-5 -4.53778,0.47043 -6.47461,1.41114 -1.93687,0.9408 -3.59702,2.31043 -4.98047,4.10888 -1.38348,1.79855 -2.46258,4.02592 -3.2373,6.68213 -0.77475,2.65629 -1.16212,5.6999 -1.16211,9.13086 -10e-6,6.91734 1.42495,12.18833 4.2749,15.81299 2.84992,3.62468 6.70978,5.43702 11.57959,5.43701 1.54945,10e-6 3.05742,-0.19368 4.52393,-0.58105 1.46643,-0.38737 2.75305,-0.99609 3.85986,-1.82618 1.10673,-0.83006 2.00598,-1.88149 2.69776,-3.15429 0.69169,-1.27278 1.09289,-2.79458 1.20361,-4.56543 l 10.12695,0 c -0.33208,2.93295 -1.13449,5.52003 -2.40722,7.76123 -1.27284,2.24122 -2.90532,4.10889 -4.89747,5.60303 -1.99223,1.49414 -4.27494,2.62858 -6.84814,3.40332 -2.57328,0.77474 -5.32637,1.1621 -8.25928,1.16211 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3046" />
+      <path
+         d="m 875.02069,874.58496 -47.39746,0 0,-76.61621 10.04395,0 0,67.48535 37.35351,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3048" />
+      <path
+         d="m 921.17303,859.97559 0,-12.28516 -6.72363,0 c -14.27736,3e-5 -21.41603,3.90139 -21.41601,11.7041 -2e-5,2.82228 1.02374,4.98048 3.07129,6.47461 2.0475,1.49415 4.89743,2.24122 8.5498,2.24121 1.60479,10e-6 3.19577,-0.17984 4.77295,-0.53955 1.57712,-0.35969 3.08509,-0.89924 4.52392,-1.61865 1.43877,-0.71939 2.78073,-1.57714 4.02588,-2.57324 1.24508,-0.99609 2.31035,-2.13052 3.1958,-3.40332 z m 0,8.88183 c -5.09118,4.70378 -11.56578,7.05566 -19.42382,7.05567 -2.71161,-10e-6 -5.22951,-0.38737 -7.55371,-1.16211 -2.32424,-0.77474 -4.33026,-1.86768 -6.01807,-3.27881 -1.68783,-1.41113 -3.00212,-3.09895 -3.94287,-5.06348 -0.94076,-1.96451 -1.41114,-4.13654 -1.41113,-6.51611 -10e-6,-13.00453 11.17837,-19.5068 33.53515,-19.50684 l 4.81445,0 c -4e-5,-2.54553 -0.11071,-4.75907 -0.33203,-6.64062 -0.22139,-1.88147 -0.76094,-3.43095 -1.61865,-4.64844 -0.85779,-1.2174 -2.17207,-2.11665 -3.94287,-2.69775 -1.77087,-0.58101 -4.23343,-0.87154 -7.3877,-0.87159 -8.85418,5e-5 -13.39194,3.15435 -13.61328,9.46289 l -9.79492,0 c 0.77473,-11.39968 8.74348,-17.09955 23.90625,-17.09961 3.54164,6e-5 6.70976,0.29059 9.5044,0.87159 2.79455,0.58111 5.16027,1.64637 7.09716,3.1958 1.9368,1.54953 3.41711,3.68006 4.44092,6.3916 1.02371,2.71163 1.53559,6.17029 1.53565,10.37598 l 0,35.85937 -9.79493,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3050" />
+      <path
+         d="m 955.70428,825.69336 c 4.37173,-5.20177 9.65655,-7.80268 15.8545,-7.80274 3.59697,6e-5 6.8066,0.67796 9.6289,2.0337 2.82222,1.35584 5.20178,3.26502 7.13867,5.72754 1.9368,2.46261 3.41711,5.45089 4.44092,8.96484 1.02371,3.51403 1.53559,7.42923 1.53565,11.7456 -6e-5,4.48245 -0.58111,8.54983 -1.74317,12.20215 -1.16216,3.65236 -2.79464,6.76515 -4.89746,9.33838 -2.10291,2.57325 -4.59314,4.5516 -7.4707,5.93506 -2.87764,1.38346 -6.00427,2.07519 -9.37988,2.0752 -5.97659,-10e-6 -11.01239,-1.88151 -15.10743,-5.64454 l 0,4.31641 -9.87793,0 0,-76.61621 9.87793,0 z m 0,35.69336 c 4.15037,4.48243 8.99249,6.72364 14.52637,6.72363 4.31637,10e-6 7.70585,-1.79849 10.16846,-5.39551 2.46252,-3.59699 3.6938,-9.04783 3.69385,-16.35254 -5e-5,-6.91728 -1.16216,-12.1191 -3.48633,-15.60546 -2.32426,-3.48628 -5.64457,-5.22945 -9.96094,-5.2295 -5.4232,5e-5 -10.40367,3.18202 -14.94141,9.5459 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path3052" />
+    </g>
+    <g
+       style="font-size:56px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Candara;-inkscape-font-specification:Candara"
+       id="text2820">
+      <path
+         d="m 432.90759,939.21674 -3.29687,0 -2.28125,-6.48438 -10.0625,0 -2.28125,6.48438 -3.14063,0 8.46875,-23.26563 4.125,0 z m -6.53125,-9.14063 -4.07812,-11.42187 -4.09375,11.42187 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2822" />
+      <path
+         d="m 462.90759,922.98236 c -2e-5,1.03127 -0.1797,1.98699 -0.53906,2.86719 -0.35939,0.88022 -0.862,1.64324 -1.50781,2.28906 -0.8021,0.80209 -1.75002,1.40366 -2.84375,1.80469 -1.09376,0.40105 -2.47397,0.60157 -4.14063,0.60156 l -3.09375,0 0,8.67188 -3.09375,0 0,-23.26563 6.3125,0 c 1.39583,2e-5 2.57812,0.11721 3.54688,0.35156 0.96873,0.2344 1.82811,0.60159 2.57812,1.10157 0.8854,0.59377 1.5703,1.33335 2.05469,2.21875 0.48436,0.88543 0.72654,2.00522 0.72656,3.35937 z m -3.21875,0.0781 c -1e-5,-0.80207 -0.14064,-1.49999 -0.42187,-2.09375 -0.28127,-0.59374 -0.70835,-1.07811 -1.28125,-1.45313 -0.50002,-0.3229 -1.07033,-0.55467 -1.71094,-0.69531 -0.64064,-0.14061 -1.45053,-0.21092 -2.42969,-0.21094 l -3.0625,0 0,9.29688 2.60938,0 c 1.24999,1e-5 2.26561,-0.11197 3.04687,-0.33594 0.78124,-0.22395 1.41666,-0.58072 1.90625,-1.07031 0.48957,-0.49999 0.83593,-1.02603 1.03907,-1.57813 0.20311,-0.55207 0.30467,-1.17186 0.30468,-1.85937 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2824" />
+      <path
+         d="m 480.32947,939.21674 -2.92188,0 0,-1.85938 c -0.26043,0.17709 -0.61199,0.42448 -1.05468,0.74219 -0.44273,0.31771 -0.87241,0.57031 -1.28907,0.75781 -0.48959,0.23958 -1.05209,0.4401 -1.6875,0.60156 -0.63542,0.16146 -1.38021,0.24219 -2.23437,0.24219 -1.57292,0 -2.90626,-0.52083 -4,-1.5625 -1.09375,-1.04166 -1.64063,-2.36979 -1.64063,-3.98437 0,-1.32291 0.28386,-2.39323 0.85157,-3.21094 0.5677,-0.8177 1.3776,-1.46093 2.42968,-1.92969 1.0625,-0.46874 2.33854,-0.78645 3.82813,-0.95312 1.48957,-0.16666 3.08853,-0.29166 4.79687,-0.375 l 0,-0.45313 c -1e-5,-0.66665 -0.1172,-1.21874 -0.35156,-1.65625 -0.23439,-0.43749 -0.57032,-0.78123 -1.00781,-1.03125 -0.41668,-0.23957 -0.91668,-0.40103 -1.5,-0.48437 -0.58335,-0.0833 -1.19272,-0.12499 -1.82813,-0.125 -0.77084,1e-5 -1.63021,0.10157 -2.57812,0.30468 -0.94792,0.20314 -1.92709,0.49741 -2.9375,0.88282 l -0.15625,0 0,-2.98438 c 0.57291,-0.15623 1.40103,-0.32811 2.48437,-0.51562 1.08333,-0.18749 2.15104,-0.28124 3.20313,-0.28125 1.22915,1e-5 2.29947,0.10158 3.21094,0.30468 0.91144,0.20315 1.7005,0.5495 2.36718,1.03907 0.65624,0.47918 1.15624,1.09897 1.5,1.85937 0.34374,0.76043 0.51561,1.70314 0.51563,2.82813 z m -2.92188,-4.29688 0,-4.85937 c -0.89584,0.0521 -1.95053,0.13021 -3.16406,0.23437 -1.21355,0.10418 -2.17449,0.25522 -2.88281,0.45313 -0.84376,0.23959 -1.52605,0.61198 -2.04688,1.11718 -0.52084,0.50522 -0.78125,1.20053 -0.78125,2.08594 0,1.00001 0.30208,1.75261 0.90625,2.25781 0.60416,0.50521 1.52604,0.75782 2.76563,0.75782 1.03124,0 1.97395,-0.20052 2.82812,-0.60157 0.85416,-0.40104 1.64582,-0.88281 2.375,-1.44531 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2826" />
+      <path
+         d="m 496.90759,924.96674 -0.15625,0 c -0.43751,-0.10416 -0.86199,-0.17968 -1.27343,-0.22657 -0.41147,-0.0469 -0.89845,-0.0703 -1.46094,-0.0703 -0.90626,2e-5 -1.78126,0.20054 -2.625,0.60156 -0.84376,0.40106 -1.65626,0.91929 -2.4375,1.55469 l 0,12.39063 -2.9375,0 0,-17.45313 2.9375,0 0,2.57813 c 1.16666,-0.93749 2.1953,-1.60155 3.08594,-1.99219 0.89061,-0.39061 1.79946,-0.58592 2.72656,-0.58594 0.5104,2e-5 0.88019,0.013 1.10937,0.0391 0.22916,0.0261 0.57291,0.0755 1.03125,0.14844 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2828" />
+      <path
+         d="m 513.26697,939.21674 -2.92188,0 0,-1.85938 c -0.26043,0.17709 -0.61199,0.42448 -1.05468,0.74219 -0.44273,0.31771 -0.87241,0.57031 -1.28907,0.75781 -0.48959,0.23958 -1.05209,0.4401 -1.6875,0.60156 -0.63542,0.16146 -1.38021,0.24219 -2.23437,0.24219 -1.57292,0 -2.90626,-0.52083 -4,-1.5625 -1.09375,-1.04166 -1.64063,-2.36979 -1.64063,-3.98437 0,-1.32291 0.28386,-2.39323 0.85157,-3.21094 0.5677,-0.8177 1.3776,-1.46093 2.42968,-1.92969 1.0625,-0.46874 2.33854,-0.78645 3.82813,-0.95312 1.48957,-0.16666 3.08853,-0.29166 4.79687,-0.375 l 0,-0.45313 c -1e-5,-0.66665 -0.1172,-1.21874 -0.35156,-1.65625 -0.23439,-0.43749 -0.57032,-0.78123 -1.00781,-1.03125 -0.41668,-0.23957 -0.91668,-0.40103 -1.5,-0.48437 -0.58335,-0.0833 -1.19272,-0.12499 -1.82813,-0.125 -0.77084,1e-5 -1.63021,0.10157 -2.57812,0.30468 -0.94792,0.20314 -1.92709,0.49741 -2.9375,0.88282 l -0.15625,0 0,-2.98438 c 0.57291,-0.15623 1.40103,-0.32811 2.48437,-0.51562 1.08333,-0.18749 2.15104,-0.28124 3.20313,-0.28125 1.22915,1e-5 2.29947,0.10158 3.21094,0.30468 0.91144,0.20315 1.7005,0.5495 2.36718,1.03907 0.65624,0.47918 1.15624,1.09897 1.5,1.85937 0.34374,0.76043 0.51561,1.70314 0.51563,2.82813 z m -2.92188,-4.29688 0,-4.85937 c -0.89584,0.0521 -1.95053,0.13021 -3.16406,0.23437 -1.21355,0.10418 -2.17449,0.25522 -2.88281,0.45313 -0.84376,0.23959 -1.52605,0.61198 -2.04688,1.11718 -0.52084,0.50522 -0.78125,1.20053 -0.78125,2.08594 0,1.00001 0.30208,1.75261 0.90625,2.25781 0.60416,0.50521 1.52604,0.75782 2.76563,0.75782 1.03124,0 1.97395,-0.20052 2.82812,-0.60157 0.85416,-0.40104 1.64582,-0.88281 2.375,-1.44531 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2830" />
+      <path
+         d="m 533.11072,939.21674 -2.9375,0 0,-1.82813 c -0.84377,0.72917 -1.72397,1.29688 -2.64063,1.70313 -0.91667,0.40625 -1.91147,0.60937 -2.98437,0.60937 -2.08334,0 -3.73699,-0.80208 -4.96094,-2.40625 -1.22396,-1.60416 -1.83594,-3.82812 -1.83594,-6.67187 0,-1.47916 0.21094,-2.79687 0.63282,-3.95313 0.42187,-1.15624 0.99218,-2.14061 1.71093,-2.95312 0.70833,-0.79165 1.53385,-1.39582 2.47657,-1.8125 0.9427,-0.41665 1.91926,-0.62499 2.92968,-0.625 0.91666,1e-5 1.72916,0.0964 2.4375,0.28906 0.70832,0.19272 1.45311,0.4922 2.23438,0.89844 l 0,-7.5625 2.9375,0 z m -2.9375,-4.29688 0,-10.01562 c -0.79168,-0.35416 -1.50001,-0.59895 -2.125,-0.73438 -0.62501,-0.1354 -1.3073,-0.20311 -2.04688,-0.20312 -1.64584,1e-5 -2.92709,0.57293 -3.84375,1.71875 -0.91667,1.14584 -1.375,2.77084 -1.375,4.875 0,2.07292 0.35416,3.64844 1.0625,4.72656 0.70833,1.07813 1.84375,1.61719 3.40625,1.61719 0.83333,0 1.67708,-0.1849 2.53125,-0.55469 0.85416,-0.36979 1.65103,-0.84635 2.39063,-1.42969 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2832" />
+      <path
+         d="m 542.04822,918.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2834" />
+      <path
+         d="m 561.86072,937.23236 c -2e-5,2.95833 -0.67189,5.13021 -2.01563,6.51563 -1.34376,1.38541 -3.41147,2.07811 -6.20312,2.07812 -0.92709,-10e-6 -1.83074,-0.0651 -2.71094,-0.19531 -0.88021,-0.13022 -1.7474,-0.31511 -2.60156,-0.55469 l 0,-3 0.15625,0 c 0.47916,0.1875 1.23958,0.41927 2.28125,0.69531 1.04166,0.27604 2.08332,0.41406 3.125,0.41407 0.99999,-10e-6 1.82811,-0.1198 2.48437,-0.35938 0.65624,-0.23959 1.16666,-0.57292 1.53125,-1 0.36457,-0.40625 0.62499,-0.89583 0.78125,-1.46875 0.15624,-0.57292 0.23436,-1.21354 0.23438,-1.92187 l 0,-1.59375 c -0.88543,0.70833 -1.73179,1.23698 -2.53906,1.58593 -0.80731,0.34896 -1.83595,0.52344 -3.08594,0.52344 -2.08334,0 -3.73699,-0.7526 -4.96094,-2.25781 -1.22396,-1.50521 -1.83594,-3.6276 -1.83594,-6.36719 0,-1.49999 0.21094,-2.79426 0.63282,-3.88281 0.42187,-1.08853 0.99739,-2.02863 1.72656,-2.82031 0.67708,-0.73957 1.49999,-1.31509 2.46875,-1.72657 0.96874,-0.41144 1.93228,-0.61717 2.89062,-0.61718 1.01041,1e-5 1.85676,0.10158 2.53907,0.30468 0.68227,0.20315 1.40363,0.51304 2.16406,0.92969 l 0.1875,-0.75 2.75,0 z m -2.9375,-2.8125 0,-9.51562 c -0.78127,-0.35416 -1.50783,-0.60676 -2.17969,-0.75782 -0.67189,-0.15102 -1.34116,-0.22654 -2.00781,-0.22656 -1.61459,2e-5 -2.88543,0.54168 -3.8125,1.625 -0.92709,1.08335 -1.39063,2.65626 -1.39063,4.71875 0,1.95834 0.34375,3.44271 1.03125,4.45313 0.6875,1.01042 1.82812,1.51562 3.42188,1.51562 0.85415,0 1.71092,-0.16406 2.57031,-0.49219 0.85936,-0.32812 1.64842,-0.76822 2.36719,-1.32031 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2836" />
+      <path
+         d="m 593.11072,939.21674 -2.9375,0 0,-9.9375 c -3e-5,-0.74999 -0.0339,-1.47395 -0.10156,-2.17188 -0.0677,-0.6979 -0.21097,-1.25519 -0.42969,-1.67187 -0.23961,-0.44791 -0.58336,-0.78645 -1.03125,-1.01563 -0.44794,-0.22915 -1.09377,-0.34373 -1.9375,-0.34375 -0.82294,2e-5 -1.64586,0.20574 -2.46875,0.61719 -0.82294,0.41147 -1.64585,0.93491 -2.46875,1.57031 0.0312,0.2396 0.0573,0.51824 0.0781,0.83594 0.0208,0.31772 0.0312,0.63282 0.0312,0.94531 l 0,11.17188 -2.9375,0 0,-9.9375 c -10e-6,-0.77083 -0.0339,-1.5026 -0.10156,-2.19532 -0.0677,-0.69269 -0.21095,-1.24738 -0.42969,-1.66406 -0.23959,-0.4479 -0.58334,-0.78384 -1.03125,-1.00781 -0.44793,-0.22394 -1.09376,-0.33592 -1.9375,-0.33594 -0.80209,2e-5 -1.60678,0.19793 -2.41406,0.59375 -0.8073,0.39585 -1.61199,0.90106 -2.41406,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.83072,-1.35415 2.74219,-1.78125 0.91144,-0.42706 1.8828,-0.64061 2.91406,-0.64062 1.18749,1e-5 2.1953,0.25001 3.02344,0.75 0.8281,0.50001 1.44529,1.19272 1.85156,2.07812 1.18748,-0.99998 2.27081,-1.72134 3.25,-2.16406 0.97914,-0.44269 2.02602,-0.66405 3.14062,-0.66406 1.91664,1e-5 3.33071,0.58074 4.24219,1.74218 0.91143,1.16148 1.36716,2.78387 1.36719,4.86719 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2838" />
+      <path
+         d="m 608.01697,930.45111 -9.75,0 0,-2.82812 9.75,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2840" />
+      <path
+         d="m 621.76697,939.21674 -9.1875,0 0,-2.375 3.04687,0 0,-18.51563 -3.04687,0 0,-2.375 9.1875,0 0,2.375 -3.04688,0 0,18.51563 3.04688,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2842" />
+      <path
+         d="m 641.42322,939.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2844" />
+      <path
+         d="m 661.23572,939.21674 -2.9375,0 0,-1.82813 c -0.84377,0.72917 -1.72397,1.29688 -2.64063,1.70313 -0.91667,0.40625 -1.91147,0.60937 -2.98437,0.60937 -2.08334,0 -3.73699,-0.80208 -4.96094,-2.40625 -1.22396,-1.60416 -1.83594,-3.82812 -1.83594,-6.67187 0,-1.47916 0.21094,-2.79687 0.63282,-3.95313 0.42187,-1.15624 0.99218,-2.14061 1.71093,-2.95312 0.70833,-0.79165 1.53385,-1.39582 2.47657,-1.8125 0.9427,-0.41665 1.91926,-0.62499 2.92968,-0.625 0.91666,1e-5 1.72916,0.0964 2.4375,0.28906 0.70832,0.19272 1.45311,0.4922 2.23438,0.89844 l 0,-7.5625 2.9375,0 z m -2.9375,-4.29688 0,-10.01562 c -0.79168,-0.35416 -1.50001,-0.59895 -2.125,-0.73438 -0.62501,-0.1354 -1.3073,-0.20311 -2.04688,-0.20312 -1.64584,1e-5 -2.92709,0.57293 -3.84375,1.71875 -0.91667,1.14584 -1.375,2.77084 -1.375,4.875 0,2.07292 0.35416,3.64844 1.0625,4.72656 0.70833,1.07813 1.84375,1.61719 3.40625,1.61719 0.83333,0 1.67708,-0.1849 2.53125,-0.55469 0.85416,-0.36979 1.65103,-0.84635 2.39063,-1.42969 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2846" />
+      <path
+         d="m 681.62634,930.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2848" />
+      <path
+         d="m 701.43884,930.27924 c -2e-5,1.41667 -0.20314,2.71094 -0.60937,3.88281 -0.40627,1.17188 -0.97919,2.16406 -1.71875,2.97656 -0.68752,0.77084 -1.49741,1.36719 -2.42969,1.78906 -0.9323,0.42188 -1.91928,0.63282 -2.96094,0.63282 -0.90626,0 -1.72657,-0.099 -2.46093,-0.29688 -0.73439,-0.19792 -1.48178,-0.50521 -2.24219,-0.92187 l 0,7.3125 -2.9375,0 0,-23.89063 2.9375,0 0,1.82813 c 0.78124,-0.65624 1.65884,-1.20572 2.63281,-1.64844 0.97395,-0.44269 2.01301,-0.66405 3.11719,-0.66406 2.10415,1e-5 3.74217,0.79428 4.91406,2.38281 1.17186,1.58855 1.75779,3.79428 1.75781,6.61719 z m -3.03125,0.0781 c -10e-6,-2.10415 -0.35939,-3.67707 -1.07812,-4.71875 -0.71877,-1.04165 -1.82293,-1.56248 -3.3125,-1.5625 -0.84376,2e-5 -1.69272,0.18231 -2.54688,0.54688 -0.85417,0.36459 -1.67188,0.84376 -2.45312,1.4375 l 0,9.89062 c 0.83332,0.375 1.54947,0.63021 2.14844,0.76563 0.59895,0.13541 1.27863,0.20312 2.03906,0.20312 1.6354,0 2.91144,-0.55208 3.82812,-1.65625 0.91665,-1.10416 1.37499,-2.73958 1.375,-4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2850" />
+      <path
+         d="m 720.62634,930.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2852" />
+      <path
+         d="m 739.67322,939.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2854" />
+      <path
+         d="m 759.48572,939.21674 -2.9375,0 0,-1.82813 c -0.84377,0.72917 -1.72397,1.29688 -2.64063,1.70313 -0.91667,0.40625 -1.91147,0.60937 -2.98437,0.60937 -2.08334,0 -3.73699,-0.80208 -4.96094,-2.40625 -1.22396,-1.60416 -1.83594,-3.82812 -1.83594,-6.67187 0,-1.47916 0.21094,-2.79687 0.63282,-3.95313 0.42187,-1.15624 0.99218,-2.14061 1.71093,-2.95312 0.70833,-0.79165 1.53385,-1.39582 2.47657,-1.8125 0.9427,-0.41665 1.91926,-0.62499 2.92968,-0.625 0.91666,1e-5 1.72916,0.0964 2.4375,0.28906 0.70832,0.19272 1.45311,0.4922 2.23438,0.89844 l 0,-7.5625 2.9375,0 z m -2.9375,-4.29688 0,-10.01562 c -0.79168,-0.35416 -1.50001,-0.59895 -2.125,-0.73438 -0.62501,-0.1354 -1.3073,-0.20311 -2.04688,-0.20312 -1.64584,1e-5 -2.92709,0.57293 -3.84375,1.71875 -0.91667,1.14584 -1.375,2.77084 -1.375,4.875 0,2.07292 0.35416,3.64844 1.0625,4.72656 0.70833,1.07813 1.84375,1.61719 3.40625,1.61719 0.83333,0 1.67708,-0.1849 2.53125,-0.55469 0.85416,-0.36979 1.65103,-0.84635 2.39063,-1.42969 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2856" />
+      <path
+         d="m 779.87634,930.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2858" />
+      <path
+         d="m 798.92322,939.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2860" />
+      <path
+         d="m 813.64197,939.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2862" />
+      <path
+         d="m 842.01697,939.21674 -2.92188,0 0,-1.85938 c -0.26043,0.17709 -0.61199,0.42448 -1.05468,0.74219 -0.44273,0.31771 -0.87241,0.57031 -1.28907,0.75781 -0.48959,0.23958 -1.05209,0.4401 -1.6875,0.60156 -0.63542,0.16146 -1.38021,0.24219 -2.23437,0.24219 -1.57292,0 -2.90626,-0.52083 -4,-1.5625 -1.09375,-1.04166 -1.64063,-2.36979 -1.64063,-3.98437 0,-1.32291 0.28386,-2.39323 0.85157,-3.21094 0.5677,-0.8177 1.3776,-1.46093 2.42968,-1.92969 1.0625,-0.46874 2.33854,-0.78645 3.82813,-0.95312 1.48957,-0.16666 3.08853,-0.29166 4.79687,-0.375 l 0,-0.45313 c -10e-6,-0.66665 -0.1172,-1.21874 -0.35156,-1.65625 -0.23439,-0.43749 -0.57032,-0.78123 -1.00781,-1.03125 -0.41668,-0.23957 -0.91668,-0.40103 -1.5,-0.48437 -0.58335,-0.0833 -1.19272,-0.12499 -1.82813,-0.125 -0.77084,1e-5 -1.63021,0.10157 -2.57812,0.30468 -0.94792,0.20314 -1.92709,0.49741 -2.9375,0.88282 l -0.15625,0 0,-2.98438 c 0.57291,-0.15623 1.40103,-0.32811 2.48437,-0.51562 1.08333,-0.18749 2.15104,-0.28124 3.20313,-0.28125 1.22915,1e-5 2.29947,0.10158 3.21094,0.30468 0.91144,0.20315 1.7005,0.5495 2.36718,1.03907 0.65624,0.47918 1.15624,1.09897 1.5,1.85937 0.34374,0.76043 0.51561,1.70314 0.51563,2.82813 z m -2.92188,-4.29688 0,-4.85937 c -0.89584,0.0521 -1.95053,0.13021 -3.16406,0.23437 -1.21355,0.10418 -2.17449,0.25522 -2.88281,0.45313 -0.84376,0.23959 -1.52605,0.61198 -2.04688,1.11718 -0.52084,0.50522 -0.78125,1.20053 -0.78125,2.08594 0,1.00001 0.30208,1.75261 0.90625,2.25781 0.60416,0.50521 1.52604,0.75782 2.76563,0.75782 1.03124,0 1.97395,-0.20052 2.82812,-0.60157 0.85416,-0.40104 1.64582,-0.88281 2.375,-1.44531 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2864" />
+      <path
+         d="m 862.29822,939.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2866" />
+      <path
+         d="m 882.11072,939.21674 -2.9375,0 0,-1.82813 c -0.84377,0.72917 -1.72397,1.29688 -2.64063,1.70313 -0.91667,0.40625 -1.91147,0.60937 -2.98437,0.60937 -2.08334,0 -3.73699,-0.80208 -4.96094,-2.40625 -1.22396,-1.60416 -1.83594,-3.82812 -1.83594,-6.67187 0,-1.47916 0.21094,-2.79687 0.63282,-3.95313 0.42187,-1.15624 0.99218,-2.14061 1.71093,-2.95312 0.70833,-0.79165 1.53385,-1.39582 2.47657,-1.8125 0.9427,-0.41665 1.91926,-0.62499 2.92968,-0.625 0.91666,1e-5 1.72916,0.0964 2.4375,0.28906 0.70832,0.19272 1.45311,0.4922 2.23438,0.89844 l 0,-7.5625 2.9375,0 z m -2.9375,-4.29688 0,-10.01562 c -0.79168,-0.35416 -1.50001,-0.59895 -2.125,-0.73438 -0.62501,-0.1354 -1.3073,-0.20311 -2.04688,-0.20312 -1.64584,1e-5 -2.92709,0.57293 -3.84375,1.71875 -0.91667,1.14584 -1.375,2.77084 -1.375,4.875 0,2.07292 0.35416,3.64844 1.0625,4.72656 0.70833,1.07813 1.84375,1.61719 3.40625,1.61719 0.83333,0 1.67708,-0.1849 2.53125,-0.55469 0.85416,-0.36979 1.65103,-0.84635 2.39063,-1.42969 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2868" />
+      <path
+         d="m 914.70447,939.21674 -15.32813,0 0,-23.26563 15.32813,0 0,2.75 -12.23438,0 0,6.375 12.23438,0 0,2.75 -12.23438,0 0,8.64063 12.23438,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2870" />
+      <path
+         d="m 934.50134,939.21674 -3.70312,0 -4.95313,-6.70313 -4.98437,6.70313 -3.42188,0 6.8125,-8.70313 -6.75,-8.75 3.70313,0 4.92187,6.59375 4.9375,-6.59375 3.4375,0 -6.85937,8.59375 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2872" />
+      <path
+         d="m 947.39197,939.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2874" />
+      <path
+         d="m 965.56384,930.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2876" />
+      <path
+         d="m 984.61072,939.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2878" />
+      <path
+         d="m 1002.7357,934.18549 c 0,1.59375 -0.6589,2.90104 -1.9765,3.92187 -1.31777,1.02083 -3.11724,1.53125 -5.39848,1.53125 -1.29168,0 -2.47657,-0.15365 -3.55469,-0.46094 -1.07813,-0.30729 -1.98177,-0.64323 -2.71094,-1.00781 l 0,-3.29687 0.15625,0 c 0.92708,0.69792 1.95833,1.2526 3.09375,1.66406 1.13541,0.41146 2.22395,0.61719 3.26563,0.61719 1.29165,0 2.30207,-0.20834 3.03125,-0.625 0.72915,-0.41667 1.09374,-1.07292 1.09375,-1.96875 -10e-6,-0.6875 -0.19793,-1.20833 -0.59375,-1.5625 -0.39585,-0.35416 -1.15626,-0.65625 -2.28125,-0.90625 -0.41668,-0.0937 -0.96095,-0.20312 -1.63281,-0.32813 -0.67189,-0.12499 -1.28387,-0.26041 -1.83594,-0.40625 -1.53126,-0.40624 -2.61719,-1.00259 -3.25781,-1.78906 -0.64063,-0.78645 -0.96094,-1.75259 -0.96094,-2.89844 0,-0.71874 0.14843,-1.39582 0.44531,-2.03125 0.29687,-0.6354 0.74739,-1.20311 1.35156,-1.70312 0.58333,-0.48957 1.32552,-0.87759 2.22657,-1.16407 0.90103,-0.28644 1.90884,-0.42967 3.02343,-0.42968 1.04166,1e-5 2.09635,0.12762 3.16407,0.38281 1.06774,0.25522 1.95574,0.56512 2.66404,0.92969 l 0,3.14062 -0.1562,0 c -0.75,-0.55207 -1.6615,-1.01821 -2.73441,-1.39844 -1.07292,-0.38019 -2.12501,-0.57029 -3.15625,-0.57031 -1.07292,2e-5 -1.97917,0.20575 -2.71875,0.61719 -0.73959,0.41147 -1.10938,1.02345 -1.10937,1.83594 -10e-6,0.71876 0.22395,1.26042 0.67187,1.625 0.4375,0.36459 1.14583,0.66146 2.125,0.89062 0.54166,0.12501 1.14843,0.25001 1.82032,0.375 0.67186,0.12501 1.23176,0.23959 1.67968,0.34375 1.36457,0.31251 2.41661,0.84897 3.15621,1.60938 0.7396,0.77084 1.1094,1.79167 1.1094,3.0625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2880" />
+      <path
+         d="m 1010.1107,918.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2882" />
+      <path
+         d="m 1031.1263,930.35736 c 0,1.45834 -0.2057,2.77084 -0.6171,3.9375 -0.4115,1.16667 -0.9662,2.14584 -1.6641,2.9375 -0.7396,0.82292 -1.5521,1.44011 -2.4375,1.85156 -0.8854,0.41146 -1.8594,0.61719 -2.9219,0.61719 -0.9896,0 -1.8542,-0.11719 -2.5937,-0.35156 -0.7396,-0.23438 -1.4688,-0.54948 -2.1875,-0.94531 l -0.1875,0.8125 -2.75,0 0,-24.3125 2.9375,0 0,8.6875 c 0.8229,-0.67707 1.6979,-1.23176 2.625,-1.66407 0.927,-0.43227 1.9687,-0.64842 3.125,-0.64843 2.0625,1e-5 3.6901,0.79168 4.8828,2.375 1.1927,1.58334 1.789,3.81772 1.789,6.70312 z m -3.0312,0.0781 c 0,-2.08333 -0.3438,-3.66405 -1.0313,-4.74219 -0.6875,-1.07811 -1.7968,-1.61717 -3.3281,-1.61719 -0.8542,2e-5 -1.7187,0.18491 -2.5937,0.55469 -0.875,0.3698 -1.6875,0.84637 -2.4375,1.42969 l 0,10 c 0.8333,0.375 1.5494,0.63542 2.1484,0.78125 0.599,0.14583 1.2786,0.21875 2.0391,0.21875 1.625,0 2.8984,-0.53386 3.8203,-1.60157 0.9218,-1.0677 1.3828,-2.74218 1.3828,-5.02343 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2884" />
+      <path
+         d="m 1038.6732,939.21674 -2.9375,0 0,-24.3125 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2886" />
+      <path
+         d="m 1059.1263,930.79486 -12.8593,0 c 0,1.07292 0.1614,2.00782 0.4843,2.80469 0.323,0.79688 0.7657,1.45052 1.3282,1.96094 0.5416,0.5 1.1849,0.875 1.9297,1.125 0.7447,0.25 1.565,0.375 2.4609,0.375 1.1875,0 2.3828,-0.23698 3.5859,-0.71094 1.2031,-0.47396 2.0599,-0.9401 2.5703,-1.39844 l 0.1563,0 0,3.20313 c -0.9896,0.41666 -2,0.76562 -3.0313,1.04687 -1.0312,0.28125 -2.1146,0.42188 -3.25,0.42188 -2.8958,0 -5.1562,-0.78386 -6.7812,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.7786,-5.11978 2.3359,-6.79688 1.5573,-1.67707 3.6068,-2.51561 6.1485,-2.51562 2.3541,1e-5 4.1692,0.68751 5.4453,2.0625 1.276,1.37501 1.914,3.32813 1.914,5.85937 z m -2.8593,-2.25 c -0.011,-1.54165 -0.3985,-2.73436 -1.1641,-3.57812 -0.7656,-0.84374 -1.9297,-1.26561 -3.4922,-1.26563 -1.5729,2e-5 -2.8255,0.46356 -3.7578,1.39063 -0.9323,0.92709 -1.4609,2.07813 -1.5859,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2888" />
+      <path
+         d="m 429.89197,979.21674 -15.32813,0 0,-23.26563 15.32813,0 0,2.75 -12.23438,0 0,6.375 12.23438,0 0,2.75 -12.23438,0 0,8.64063 12.23438,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2890" />
+      <path
+         d="m 449.17322,979.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2892" />
+      <path
+         d="m 469.92322,961.76361 -7.0625,17.45313 -2.95313,0 -7.01562,-17.45313 3.1875,0 5.40625,13.89063 5.35937,-13.89063 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2894" />
+      <path
+         d="m 476.92322,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2896" />
+      <path
+         d="m 493.47009,964.96674 -0.15625,0 c -0.43751,-0.10416 -0.86199,-0.17968 -1.27343,-0.22657 -0.41147,-0.0469 -0.89845,-0.0703 -1.46094,-0.0703 -0.90626,2e-5 -1.78126,0.20054 -2.625,0.60156 -0.84376,0.40106 -1.65626,0.91929 -2.4375,1.55469 l 0,12.39063 -2.9375,0 0,-17.45313 2.9375,0 0,2.57813 c 1.16666,-0.93749 2.1953,-1.60155 3.08594,-1.99219 0.89061,-0.39061 1.79946,-0.58592 2.72656,-0.58594 0.5104,2e-5 0.88019,0.013 1.10937,0.0391 0.22916,0.0261 0.57291,0.0755 1.03125,0.14844 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2898" />
+      <path
+         d="m 511.14197,970.49799 c -2e-5,2.84375 -0.72919,5.08854 -2.1875,6.73437 -1.45835,1.64583 -3.41147,2.46875 -5.85938,2.46875 -2.46875,0 -4.42969,-0.82292 -5.88281,-2.46875 -1.45313,-1.64583 -2.17969,-3.89062 -2.17969,-6.73437 0,-2.84374 0.72656,-5.09114 2.17969,-6.74219 1.45312,-1.65103 3.41406,-2.47655 5.88281,-2.47656 2.44791,1e-5 4.40103,0.82553 5.85938,2.47656 1.45831,1.65105 2.18748,3.89845 2.1875,6.74219 z m -3.03125,0 c -2e-5,-2.26041 -0.44272,-3.9401 -1.32813,-5.03907 -0.88543,-1.09894 -2.11459,-1.64842 -3.6875,-1.64843 -1.59376,1e-5 -2.83073,0.54949 -3.71093,1.64843 -0.88022,1.09897 -1.32032,2.77866 -1.32032,5.03907 0,2.1875 0.44271,3.84635 1.32813,4.97656 0.88541,1.13021 2.11978,1.69531 3.70312,1.69531 1.56249,0 2.78905,-0.55989 3.67969,-1.67969 0.89061,-1.11978 1.33592,-2.78384 1.33594,-4.99218 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2900" />
+      <path
+         d="m 530.29822,979.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2902" />
+      <path
+         d="m 561.42322,979.21674 -2.9375,0 0,-9.9375 c -3e-5,-0.74999 -0.0339,-1.47395 -0.10156,-2.17188 -0.0677,-0.6979 -0.21097,-1.25519 -0.42969,-1.67187 -0.23961,-0.44791 -0.58336,-0.78645 -1.03125,-1.01563 -0.44794,-0.22915 -1.09377,-0.34373 -1.9375,-0.34375 -0.82294,2e-5 -1.64586,0.20574 -2.46875,0.61719 -0.82294,0.41147 -1.64585,0.93491 -2.46875,1.57031 0.0312,0.2396 0.0573,0.51824 0.0781,0.83594 0.0208,0.31772 0.0312,0.63282 0.0312,0.94531 l 0,11.17188 -2.9375,0 0,-9.9375 c -10e-6,-0.77083 -0.0339,-1.5026 -0.10156,-2.19532 -0.0677,-0.69269 -0.21095,-1.24738 -0.42969,-1.66406 -0.23959,-0.4479 -0.58334,-0.78384 -1.03125,-1.00781 -0.44793,-0.22394 -1.09376,-0.33592 -1.9375,-0.33594 -0.80209,2e-5 -1.60678,0.19793 -2.41406,0.59375 -0.8073,0.39585 -1.61199,0.90106 -2.41406,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.83072,-1.35415 2.74219,-1.78125 0.91144,-0.42706 1.8828,-0.64061 2.91406,-0.64062 1.18749,1e-5 2.1953,0.25001 3.02344,0.75 0.8281,0.50001 1.44529,1.19272 1.85156,2.07812 1.18748,-0.99998 2.27081,-1.72134 3.25,-2.16406 0.97914,-0.44269 2.02602,-0.66405 3.14062,-0.66406 1.91664,1e-5 3.33071,0.58074 4.24219,1.74218 0.91143,1.16148 1.36716,2.78387 1.36719,4.86719 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2904" />
+      <path
+         d="m 581.68884,970.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2906" />
+      <path
+         d="m 600.73572,979.21674 -2.9375,0 0,-9.9375 c -2e-5,-0.80208 -0.0469,-1.55468 -0.14063,-2.25782 -0.0938,-0.70311 -0.26564,-1.25259 -0.51562,-1.64843 -0.26043,-0.43749 -0.63543,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.12501,-0.32029 -1.90625,-0.32031 -0.8021,2e-5 -1.64064,0.19793 -2.51563,0.59375 -0.875,0.39585 -1.71355,0.90106 -2.51562,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.86457,-1.35415 2.84375,-1.78125 0.97915,-0.42706 1.98436,-0.64061 3.01562,-0.64062 1.88541,1e-5 3.3229,0.56772 4.3125,1.70312 0.98957,1.13543 1.48436,2.77085 1.48438,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2908" />
+      <path
+         d="m 615.45447,979.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2910" />
+      <path
+         d="m 639.65759,957.74799 -0.15625,0 c -0.32293,-0.0937 -0.7448,-0.19009 -1.26562,-0.28907 -0.52085,-0.0989 -0.97918,-0.14841 -1.375,-0.14843 -1.26043,2e-5 -2.17449,0.27866 -2.74219,0.83593 -0.56771,0.55732 -0.85157,1.56513 -0.85156,3.02344 l 0,0.59375 5.29687,0 0,2.46875 -5.20312,0 0,14.98438 -2.9375,0 0,-14.98438 -1.98438,0 0,-2.46875 1.98438,0 0,-0.57812 c -10e-6,-2.0729 0.51562,-3.66404 1.54687,-4.77344 1.03125,-1.10935 2.52083,-1.66404 4.46875,-1.66406 0.65624,2e-5 1.24739,0.0313 1.77344,0.0937 0.52603,0.0625 1.0078,0.13544 1.44531,0.21875 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2912" />
+      <path
+         d="m 656.39197,970.49799 c -2e-5,2.84375 -0.72919,5.08854 -2.1875,6.73437 -1.45835,1.64583 -3.41147,2.46875 -5.85938,2.46875 -2.46875,0 -4.42969,-0.82292 -5.88281,-2.46875 -1.45313,-1.64583 -2.17969,-3.89062 -2.17969,-6.73437 0,-2.84374 0.72656,-5.09114 2.17969,-6.74219 1.45312,-1.65103 3.41406,-2.47655 5.88281,-2.47656 2.44791,1e-5 4.40103,0.82553 5.85938,2.47656 1.45831,1.65105 2.18748,3.89845 2.1875,6.74219 z m -3.03125,0 c -2e-5,-2.26041 -0.44272,-3.9401 -1.32813,-5.03907 -0.88543,-1.09894 -2.11459,-1.64842 -3.6875,-1.64843 -1.59376,1e-5 -2.83073,0.54949 -3.71093,1.64843 -0.88022,1.09897 -1.32032,2.77866 -1.32032,5.03907 0,2.1875 0.44271,3.84635 1.32813,4.97656 0.88541,1.13021 2.11978,1.69531 3.70312,1.69531 1.56249,0 2.78905,-0.55989 3.67969,-1.67969 0.89061,-1.11978 1.33592,-2.78384 1.33594,-4.99218 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2914" />
+      <path
+         d="m 671.84509,964.96674 -0.15625,0 c -0.43751,-0.10416 -0.86199,-0.17968 -1.27343,-0.22657 -0.41148,-0.0469 -0.89845,-0.0703 -1.46094,-0.0703 -0.90626,2e-5 -1.78126,0.20054 -2.625,0.60156 -0.84376,0.40106 -1.65626,0.91929 -2.4375,1.55469 l 0,12.39063 -2.9375,0 0,-17.45313 2.9375,0 0,2.57813 c 1.16666,-0.93749 2.1953,-1.60155 3.08594,-1.99219 0.89061,-0.39061 1.79946,-0.58592 2.72656,-0.58594 0.5104,2e-5 0.88019,0.013 1.10937,0.0391 0.22916,0.0261 0.57291,0.0755 1.03125,0.14844 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2916" />
+      <path
+         d="m 703.92322,979.21674 -3.09375,0 0,-11.39063 -11.60938,0 0,11.39063 -3.09375,0 0,-23.26563 3.09375,0 0,9.125 11.60938,0 0,-9.125 3.09375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2918" />
+      <path
+         d="m 724.56384,970.79486 -12.85937,0 c -10e-6,1.07292 0.16145,2.00782 0.48437,2.80469 0.32291,0.79688 0.76562,1.45052 1.32813,1.96094 0.54166,0.5 1.18489,0.875 1.92969,1.125 0.74478,0.25 1.56509,0.375 2.46093,0.375 1.18749,0 2.3828,-0.23698 3.58594,-0.71094 1.20311,-0.47396 2.05988,-0.9401 2.57031,-1.39844 l 0.15625,0 0,3.20313 c -0.9896,0.41666 -2.00001,0.76562 -3.03125,1.04687 -1.03126,0.28125 -2.11459,0.42188 -3.25,0.42188 -2.89584,0 -5.15625,-0.78386 -6.78125,-2.35157 -1.625,-1.5677 -2.4375,-3.79426 -2.4375,-6.67968 0,-2.85416 0.77865,-5.11978 2.33594,-6.79688 1.55729,-1.67707 3.60676,-2.51561 6.14844,-2.51562 2.35415,1e-5 4.16925,0.68751 5.44531,2.0625 1.27603,1.37501 1.91405,3.32813 1.91406,5.85937 z m -2.85937,-2.25 c -0.0104,-1.54165 -0.39845,-2.73436 -1.16406,-3.57812 -0.76564,-0.84374 -1.9297,-1.26561 -3.49219,-1.26563 -1.57293,2e-5 -2.82553,0.46356 -3.75781,1.39063 -0.9323,0.92709 -1.46095,2.07813 -1.58594,3.45312 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2920" />
+      <path
+         d="m 743.48572,979.21674 -2.9375,0 0,-1.9375 c -0.9896,0.78125 -1.93751,1.3802 -2.84375,1.79687 -0.90626,0.41667 -1.90626,0.625 -3,0.625 -1.83334,0 -3.26042,-0.55989 -4.28125,-1.67969 -1.02084,-1.11979 -1.53125,-2.76301 -1.53125,-4.92968 l 0,-11.32813 2.9375,0 0,9.9375 c -10e-6,0.88542 0.0417,1.64324 0.125,2.27344 0.0833,0.63021 0.26041,1.16927 0.53125,1.61719 0.28124,0.45833 0.64582,0.79167 1.09375,1 0.44791,0.20833 1.09895,0.3125 1.95312,0.3125 0.76041,0 1.59114,-0.19792 2.49219,-0.59375 0.90103,-0.39583 1.74217,-0.90104 2.52344,-1.51563 l 0,-13.03125 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2922" />
+      <path
+         d="m 760.15759,964.96674 -0.15625,0 c -0.43751,-0.10416 -0.86199,-0.17968 -1.27343,-0.22657 -0.41148,-0.0469 -0.89845,-0.0703 -1.46094,-0.0703 -0.90626,2e-5 -1.78126,0.20054 -2.625,0.60156 -0.84376,0.40106 -1.65626,0.91929 -2.4375,1.55469 l 0,12.39063 -2.9375,0 0,-17.45313 2.9375,0 0,2.57813 c 1.16666,-0.93749 2.1953,-1.60155 3.08594,-1.99219 0.89061,-0.39061 1.79946,-0.58592 2.72656,-0.58594 0.5104,2e-5 0.88019,0.013 1.10937,0.0391 0.22916,0.0261 0.57291,0.0755 1.03125,0.14844 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2924" />
+      <path
+         d="m 766.11072,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2926" />
+      <path
+         d="m 784.23572,974.18549 c -2e-5,1.59375 -0.65887,2.90104 -1.97656,3.92187 -1.31773,1.02083 -3.1172,1.53125 -5.39844,1.53125 -1.29168,0 -2.47657,-0.15365 -3.55469,-0.46094 -1.07813,-0.30729 -1.98177,-0.64323 -2.71094,-1.00781 l 0,-3.29687 0.15625,0 c 0.92708,0.69792 1.95833,1.2526 3.09375,1.66406 1.13541,0.41146 2.22395,0.61719 3.26563,0.61719 1.29165,0 2.30207,-0.20834 3.03125,-0.625 0.72915,-0.41667 1.09374,-1.07292 1.09375,-1.96875 -10e-6,-0.6875 -0.19793,-1.20833 -0.59375,-1.5625 -0.39585,-0.35416 -1.15626,-0.65625 -2.28125,-0.90625 -0.41668,-0.0937 -0.96095,-0.20312 -1.63281,-0.32813 -0.67189,-0.12499 -1.28387,-0.26041 -1.83594,-0.40625 -1.53126,-0.40624 -2.61719,-1.00259 -3.25781,-1.78906 -0.64063,-0.78645 -0.96094,-1.75259 -0.96094,-2.89844 0,-0.71874 0.14843,-1.39582 0.44531,-2.03125 0.29687,-0.6354 0.74739,-1.20311 1.35156,-1.70312 0.58333,-0.48957 1.32552,-0.87759 2.22657,-1.16407 0.90103,-0.28644 1.90884,-0.42967 3.02343,-0.42968 1.04166,1e-5 2.09635,0.12762 3.16407,0.38281 1.06769,0.25522 1.95571,0.56512 2.66406,0.92969 l 0,3.14062 -0.15625,0 c -0.75002,-0.55207 -1.66147,-1.01821 -2.73438,-1.39844 -1.07292,-0.38019 -2.12501,-0.57029 -3.15625,-0.57031 -1.07292,2e-5 -1.97917,0.20575 -2.71875,0.61719 -0.73959,0.41147 -1.10938,1.02345 -1.10937,1.83594 -10e-6,0.71876 0.22395,1.26042 0.67187,1.625 0.4375,0.36459 1.14583,0.66146 2.125,0.89062 0.54166,0.12501 1.14843,0.25001 1.82032,0.375 0.67186,0.12501 1.23176,0.23959 1.67968,0.34375 1.36457,0.31251 2.41666,0.84897 3.15625,1.60938 0.73957,0.77084 1.10936,1.79167 1.10938,3.0625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2928" />
+      <path
+         d="m 797.51697,979.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2930" />
+      <path
+         d="m 804.23572,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2932" />
+      <path
+         d="m 822.79822,978.12299 c -0.97918,0.46875 -1.90887,0.83333 -2.78906,1.09375 -0.88023,0.26041 -1.81512,0.39062 -2.80469,0.39062 -1.26043,0 -2.41668,-0.1849 -3.46875,-0.55469 -1.05209,-0.36979 -1.95313,-0.92968 -2.70313,-1.67968 -0.76042,-0.75 -1.34896,-1.69792 -1.76562,-2.84375 -0.41667,-1.14583 -0.625,-2.48437 -0.625,-4.01563 0,-2.85415 0.78385,-5.09374 2.35156,-6.71875 1.5677,-1.62498 3.63801,-2.43748 6.21094,-2.4375 0.99999,2e-5 1.98176,0.14064 2.94531,0.42188 0.96353,0.28126 1.84634,0.62501 2.64844,1.03125 l 0,3.26562 -0.15625,0 c -0.89585,-0.6979 -1.82033,-1.23436 -2.77344,-1.60937 -0.95314,-0.37499 -1.88282,-0.56249 -2.78906,-0.5625 -1.66668,1e-5 -2.98178,0.55991 -3.94531,1.67968 -0.96355,1.11981 -1.44532,2.76304 -1.44532,4.92969 0,2.10417 0.47135,3.72136 1.41407,4.85156 0.9427,1.13021 2.26822,1.69532 3.97656,1.69532 0.59374,0 1.1979,-0.0781 1.8125,-0.23438 0.61457,-0.15625 1.16665,-0.35937 1.65625,-0.60937 0.42707,-0.21875 0.82811,-0.45052 1.20312,-0.69532 0.37499,-0.24478 0.67186,-0.45572 0.89063,-0.63281 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2934" />
+      <path
+         d="m 855.40759,958.62299 c 0.9479,1.04168 1.67446,2.31772 2.17969,3.82812 0.50519,1.51043 0.75779,3.22397 0.75781,5.14063 -2e-5,1.91667 -0.25783,3.63282 -0.77343,5.14843 -0.51565,1.51563 -1.23701,2.77865 -2.16407,3.78907 -0.95835,1.05208 -2.09116,1.84375 -3.39843,2.375 -1.30731,0.53125 -2.7995,0.79687 -4.47657,0.79687 -1.63542,0 -3.1224,-0.27083 -4.46093,-0.8125 -1.33855,-0.54166 -2.47657,-1.32812 -3.41407,-2.35937 -0.9375,-1.03125 -1.65885,-2.29687 -2.16406,-3.79688 -0.50521,-1.49999 -0.75781,-3.21353 -0.75781,-5.14062 0,-1.89582 0.25,-3.59634 0.75,-5.10157 0.49999,-1.50519 1.22916,-2.79425 2.1875,-3.86718 0.91666,-1.02082 2.05468,-1.80207 3.41406,-2.34375 1.35937,-0.54165 2.84114,-0.81248 4.44531,-0.8125 1.66666,2e-5 3.16405,0.27346 4.49219,0.82031 1.32811,0.5469 2.45571,1.32554 3.38281,2.33594 z m -0.28125,8.96875 c -2e-5,-3.02082 -0.6771,-5.35155 -2.03125,-6.99219 -1.35418,-1.64061 -3.20314,-2.46092 -5.54687,-2.46094 -2.3646,2e-5 -4.22136,0.82033 -5.57031,2.46094 -1.34897,1.64064 -2.02345,3.97137 -2.02344,6.99219 -10e-6,3.05209 0.68749,5.38802 2.0625,7.00781 1.37499,1.61979 3.21874,2.42969 5.53125,2.42969 2.31248,0 4.15363,-0.8099 5.52344,-2.42969 1.36977,-1.61979 2.05466,-3.95572 2.05468,-7.00781 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2936" />
+      <path
+         d="m 878.37634,970.27924 c -2e-5,1.41667 -0.20314,2.71094 -0.60937,3.88281 -0.40627,1.17188 -0.97919,2.16406 -1.71875,2.97656 -0.68752,0.77084 -1.49741,1.36719 -2.42969,1.78906 -0.9323,0.42188 -1.91928,0.63282 -2.96094,0.63282 -0.90626,0 -1.72657,-0.099 -2.46093,-0.29688 -0.73439,-0.19792 -1.48178,-0.50521 -2.24219,-0.92187 l 0,7.3125 -2.9375,0 0,-23.89063 2.9375,0 0,1.82813 c 0.78124,-0.65624 1.65884,-1.20572 2.63281,-1.64844 0.97395,-0.44269 2.01301,-0.66405 3.11719,-0.66406 2.10415,1e-5 3.74217,0.79428 4.91406,2.38281 1.17186,1.58855 1.75779,3.79428 1.75781,6.61719 z m -3.03125,0.0781 c -10e-6,-2.10415 -0.35939,-3.67707 -1.07812,-4.71875 -0.71877,-1.04165 -1.82293,-1.56248 -3.3125,-1.5625 -0.84376,2e-5 -1.69272,0.18231 -2.54688,0.54688 -0.85417,0.36459 -1.67188,0.84376 -2.45312,1.4375 l 0,9.89062 c 0.83332,0.375 1.54947,0.63021 2.14844,0.76563 0.59895,0.13541 1.27863,0.20312 2.03906,0.20312 1.6354,0 2.91144,-0.55208 3.82812,-1.65625 0.91665,-1.10416 1.37499,-2.73958 1.375,-4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2938" />
+      <path
+         d="m 892.01697,979.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2940" />
+      <path
+         d="m 898.73572,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2942" />
+      <path
+         d="m 929.86072,979.21674 -2.9375,0 0,-9.9375 c -3e-5,-0.74999 -0.0339,-1.47395 -0.10156,-2.17188 -0.0677,-0.6979 -0.21097,-1.25519 -0.42969,-1.67187 -0.23961,-0.44791 -0.58336,-0.78645 -1.03125,-1.01563 -0.44794,-0.22915 -1.09377,-0.34373 -1.9375,-0.34375 -0.82294,2e-5 -1.64586,0.20574 -2.46875,0.61719 -0.82294,0.41147 -1.64585,0.93491 -2.46875,1.57031 0.0312,0.2396 0.0573,0.51824 0.0781,0.83594 0.0208,0.31772 0.0312,0.63282 0.0312,0.94531 l 0,11.17188 -2.9375,0 0,-9.9375 c -10e-6,-0.77083 -0.0339,-1.5026 -0.10156,-2.19532 -0.0677,-0.69269 -0.21095,-1.24738 -0.42969,-1.66406 -0.23959,-0.4479 -0.58334,-0.78384 -1.03125,-1.00781 -0.44793,-0.22394 -1.09376,-0.33592 -1.9375,-0.33594 -0.80209,2e-5 -1.60678,0.19793 -2.41406,0.59375 -0.8073,0.39585 -1.61199,0.90106 -2.41406,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.91666,-0.7604 1.83072,-1.35415 2.74219,-1.78125 0.91144,-0.42706 1.8828,-0.64061 2.91406,-0.64062 1.18749,1e-5 2.1953,0.25001 3.02344,0.75 0.8281,0.50001 1.44529,1.19272 1.85156,2.07812 1.18748,-0.99998 2.27081,-1.72134 3.25,-2.16406 0.97914,-0.44269 2.02602,-0.66405 3.14062,-0.66406 1.91664,1e-5 3.33071,0.58074 4.24219,1.74218 0.91143,1.16148 1.36716,2.78387 1.36719,4.86719 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2944" />
+      <path
+         d="m 938.67322,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2946" />
+      <path
+         d="m 956.98572,979.21674 -14.09375,0 0,-2.17188 10.17187,-12.82812 -9.95312,0 0,-2.45313 13.60937,0 0,2.09375 -10.21875,12.875 10.48438,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2948" />
+      <path
+         d="m 974.70447,979.21674 -2.92188,0 0,-1.85938 c -0.26043,0.17709 -0.61199,0.42448 -1.05468,0.74219 -0.44273,0.31771 -0.87241,0.57031 -1.28907,0.75781 -0.48959,0.23958 -1.05209,0.4401 -1.6875,0.60156 -0.63542,0.16146 -1.38021,0.24219 -2.23437,0.24219 -1.57292,0 -2.90626,-0.52083 -4,-1.5625 -1.09375,-1.04166 -1.64063,-2.36979 -1.64063,-3.98437 0,-1.32291 0.28386,-2.39323 0.85157,-3.21094 0.5677,-0.8177 1.3776,-1.46093 2.42968,-1.92969 1.0625,-0.46874 2.33854,-0.78645 3.82813,-0.95312 1.48957,-0.16666 3.08853,-0.29166 4.79687,-0.375 l 0,-0.45313 c -10e-6,-0.66665 -0.1172,-1.21874 -0.35156,-1.65625 -0.23439,-0.43749 -0.57032,-0.78123 -1.00781,-1.03125 -0.41668,-0.23957 -0.91668,-0.40103 -1.5,-0.48437 -0.58335,-0.0833 -1.19272,-0.12499 -1.82813,-0.125 -0.77084,1e-5 -1.63021,0.10157 -2.57812,0.30468 -0.94792,0.20314 -1.92709,0.49741 -2.9375,0.88282 l -0.15625,0 0,-2.98438 c 0.57291,-0.15623 1.40103,-0.32811 2.48437,-0.51562 1.08333,-0.18749 2.15104,-0.28124 3.20313,-0.28125 1.22915,1e-5 2.29947,0.10158 3.21094,0.30468 0.91144,0.20315 1.7005,0.5495 2.36718,1.03907 0.65624,0.47918 1.15624,1.09897 1.5,1.85937 0.34374,0.76043 0.51561,1.70314 0.51563,2.82813 z m -2.92188,-4.29688 0,-4.85937 c -0.89584,0.0521 -1.95053,0.13021 -3.16406,0.23437 -1.21355,0.10418 -2.17449,0.25522 -2.88281,0.45313 -0.84376,0.23959 -1.52605,0.61198 -2.04688,1.11718 -0.52084,0.50522 -0.78125,1.20053 -0.78125,2.08594 0,1.00001 0.30208,1.75261 0.90625,2.25781 0.60416,0.50521 1.52604,0.75782 2.76563,0.75782 1.03124,0 1.97395,-0.20052 2.82812,-0.60157 0.85416,-0.40104 1.64582,-0.88281 2.375,-1.44531 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2950" />
+      <path
+         d="m 989.45447,979.06049 c -0.5521,0.14583 -1.15366,0.26562 -1.80469,0.35937 -0.65105,0.0937 -1.23178,0.14063 -1.74219,0.14063 -1.78125,0 -3.13542,-0.47917 -4.0625,-1.4375 -0.92708,-0.95834 -1.39063,-2.49479 -1.39062,-4.60938 l 0,-9.28125 -1.98438,0 0,-2.46875 1.98438,0 0,-5.01562 2.9375,0 0,5.01562 6.0625,0 0,2.46875 -6.0625,0 0,7.95313 c -10e-6,0.91667 0.0208,1.63281 0.0625,2.14843 0.0417,0.51563 0.18749,0.9974 0.4375,1.44532 0.22916,0.41667 0.54426,0.72135 0.94531,0.91406 0.40103,0.19271 1.01301,0.28906 1.83594,0.28906 0.47915,0 0.97915,-0.0703 1.5,-0.21094 0.52082,-0.14062 0.89582,-0.25781 1.125,-0.35156 l 0.15625,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2952" />
+      <path
+         d="m 996.17322,958.84174 -3.3125,0 0,-3.04688 3.3125,0 z m -0.1875,20.375 -2.9375,0 0,-17.45313 2.9375,0 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2954" />
+      <path
+         d="m 1016.7045,970.49799 c 0,2.84375 -0.7292,5.08854 -2.1875,6.73437 -1.4584,1.64583 -3.4115,2.46875 -5.8594,2.46875 -2.4688,0 -4.4297,-0.82292 -5.8828,-2.46875 -1.4531,-1.64583 -2.1797,-3.89062 -2.1797,-6.73437 0,-2.84374 0.7266,-5.09114 2.1797,-6.74219 1.4531,-1.65103 3.414,-2.47655 5.8828,-2.47656 2.4479,1e-5 4.401,0.82553 5.8594,2.47656 1.4583,1.65105 2.1875,3.89845 2.1875,6.74219 z m -3.0313,0 c 0,-2.26041 -0.4427,-3.9401 -1.3281,-5.03907 -0.8854,-1.09894 -2.1146,-1.64842 -3.6875,-1.64843 -1.5938,1e-5 -2.8307,0.54949 -3.7109,1.64843 -0.8803,1.09897 -1.3204,2.77866 -1.3204,5.03907 0,2.1875 0.4427,3.84635 1.3282,4.97656 0.8854,1.13021 2.1198,1.69531 3.7031,1.69531 1.5625,0 2.789,-0.55989 3.6797,-1.67969 0.8906,-1.11978 1.3359,-2.78384 1.3359,-4.99218 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2956" />
+      <path
+         d="m 1035.8607,979.21674 -2.9375,0 0,-9.9375 c 0,-0.80208 -0.047,-1.55468 -0.1406,-2.25782 -0.094,-0.70311 -0.2656,-1.25259 -0.5156,-1.64843 -0.2605,-0.43749 -0.6355,-0.76301 -1.125,-0.97657 -0.4896,-0.21352 -1.125,-0.32029 -1.9063,-0.32031 -0.8021,2e-5 -1.6406,0.19793 -2.5156,0.59375 -0.875,0.39585 -1.7136,0.90106 -2.5156,1.51563 l 0,13.03125 -2.9375,0 0,-17.45313 2.9375,0 0,1.9375 c 0.9166,-0.7604 1.8645,-1.35415 2.8437,-1.78125 0.9792,-0.42706 1.9844,-0.64061 3.0156,-0.64062 1.8854,1e-5 3.3229,0.56772 4.3125,1.70312 0.9896,1.13543 1.4844,2.77085 1.4844,4.90625 z"
+         style="font-size:32px;font-variant:normal;font-stretch:normal;font-family:Verdana;-inkscape-font-specification:Verdana"
+         id="path2958" />
+    </g>
+  </g>
+</svg>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (medium).svg
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (medium).svg	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (medium).svg	(revision 15895)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="350"
+   id="svg3726"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="hl_logo_med.svg"
+   inkscape:export-filename="C:\Documents and Settings\Monika Kofler\Desktop\hl_logo3.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3728">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective3734" />
+    <inkscape:perspective
+       id="perspective3744"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="0"
+     inkscape:zoom="0.76049863"
+     inkscape:cx="723.73909"
+     inkscape:cy="135.26634"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="744"
+     inkscape:window-x="-4"
+     inkscape:window-y="-4"
+     inkscape:window-maximized="1"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3761"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3731">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-702.36218)"
+     style="display:inline">
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 147.97656,956.48581 15.31105,-84.8493 -88.282864,-0.3258 -14.65952,86.0025 -29.31903,-0.3258 23.78099,-132.91294 11.72762,-67.75955 0,10e-6 28.34173,0 -14.00798,86.32826 87.957084,10e-6 11.53189,-69.15743 -12.70625,0 34.4026,-44.53527 19.87179,44.53527 -12.70491,0 -15.96259,91.96114 -16.61411,91.0389 -28.6675,0 z"
+       id="path2844-7-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 316.64083,956.48581 0,12.2292 45.03885,-27.0386 -45.03885,-28.016 0,14.8254 -54.32005,-0.1662 -17.60601,0 2.94382,-21.2429 2.60881,-16.8715 8.46994,-51.79699 4.23497,-22.15215 9.7731,-59.94114 -28.668,0 -24.69352,145.68888 -8.78717,54.4818 44.88297,0 30.94787,2e-4 30.21329,0 -2e-5,0 z"
+       id="path2846-4-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+    <g
+       style="font-size:100px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Kartika;-inkscape-font-specification:Kartika"
+       id="text2816">
+      <path
+         d="m 63.520651,1030.5259 -5.957031,0 0,-21.2403 -23.486329,0 0,21.2403 -5.908203,0 0,-45.06838 5.908203,0 0,18.45708 23.486329,0 0,-18.45708 5.957031,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2819" />
+      <path
+         d="m 86.762838,1031.3071 c -2.376318,0 -4.541029,-0.3825 -6.49414,-1.1474 -1.953135,-0.765 -3.629566,-1.8718 -5.029297,-3.3203 -1.399745,-1.4486 -2.482101,-3.2308 -3.24707,-5.3467 -0.764977,-2.1159 -1.147464,-4.541 -1.147461,-7.2754 -3e-6,-2.6693 0.374346,-5.0618 1.123046,-7.1777 0.748694,-2.1159 1.798498,-3.9063 3.149415,-5.3711 1.350903,-1.4649 2.954092,-2.57976 4.80957,-3.34477 1.855455,-0.76494 3.906235,-1.14743 6.152344,-1.14746 2.34373,3e-5 4.459613,0.38252 6.347656,1.14746 1.887995,0.76501 3.499321,1.87177 4.833984,3.32027 1.334606,1.4486 2.359995,3.2309 3.076175,5.3467 0.71611,2.1159 1.07418,4.5248 1.07422,7.2266 l 0,1.416 -24.560551,0 c 0.1302,1.9206 0.471996,3.5807 1.025391,4.9805 0.553375,1.3997 1.26952,2.5553 2.148437,3.4668 0.878894,0.9114 1.896146,1.5787 3.051758,2.0019 1.155583,0.4232 2.384423,0.6348 3.686523,0.6348 0.976544,0 1.936829,-0.1221 2.88086,-0.3662 0.943988,-0.2442 1.790341,-0.6185 2.539062,-1.1231 0.748674,-0.5045 1.359025,-1.1312 1.831055,-1.8799 0.471979,-0.7486 0.740534,-1.6113 0.805664,-2.5878 l 5.957031,0 c -0.2279,1.7252 -0.74873,3.247 -1.5625,4.5654 -0.813832,1.3183 -1.839221,2.417 -3.076172,3.2959 -1.237005,0.8789 -2.661157,1.5462 -4.272461,2.0019 -1.611349,0.4558 -3.312194,0.6836 -5.102539,0.6836 z m 8.544922,-20.2636 c -0.488307,-3.1576 -1.538111,-5.5095 -3.149414,-7.0557 -1.61135,-1.5462 -3.637715,-2.3193 -6.079101,-2.3193 -1.13934,0 -2.205419,0.1872 -3.198243,0.5615 -0.992851,0.3744 -1.888033,0.944 -2.685546,1.709 -0.797537,0.765 -1.472992,1.7415 -2.026368,2.9297 -0.553394,1.1881 -0.944019,2.5797 -1.171875,4.1748 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2821" />
+      <path
+         d="m 128.7062,1026.3755 c -2.89716,3.2877 -6.13609,4.9316 -9.7168,4.9316 -7.38933,0 -11.08399,-4.0202 -11.08398,-12.0605 l 0,-21.38674 5.81054,0 0,21.14254 c -10e-6,2.6693 0.472,4.5818 1.41602,5.7373 0.944,1.1556 2.5065,1.7334 4.6875,1.7334 3.22264,0 6.18487,-1.7415 8.88672,-5.2246 l 0,-23.38864 5.76172,0 0,32.66604 -5.76172,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2823" />
+      <path
+         d="m 160.15151,1003.1821 c -0.94403,-0.2604 -2.13218,-0.3906 -3.56445,-0.3906 -2.92971,0 -5.45249,1.5463 -7.56836,4.6387 l 0,23.0957 -5.81055,0 0,-32.66604 5.81055,0 0,4.58984 c 2.34374,-3.51559 5.17576,-5.2734 8.49609,-5.27343 0.42316,3e-5 0.84634,0.0163 1.26953,0.0488 0.42316,0.0326 0.87889,0.0977 1.36719,0.19531 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2825" />
+      <path
+         d="m 170.11245,1030.5259 -5.81055,0 0,-32.66604 5.81055,0 z m 0,-38.81838 -5.81055,0 0,-6.25 5.81055,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2827" />
+      <path
+         d="m 190.37612,1031.3071 c -8.91928,0 -13.57422,-3.5156 -13.96484,-10.5468 l 5.81054,0 c 0.0651,3.9713 2.76692,5.957 8.10547,5.957 2.44139,0 4.28058,-0.4802 5.51758,-1.4404 1.23696,-0.9603 1.85545,-2.2217 1.85547,-3.7842 -2e-5,-0.7162 -0.1221,-1.3102 -0.36621,-1.7823 -0.24417,-0.4719 -0.70803,-0.8951 -1.3916,-1.2695 -0.68362,-0.3743 -1.6439,-0.7487 -2.88086,-1.123 -1.237,-0.3744 -2.84833,-0.8057 -4.83399,-1.294 -1.95313,-0.4882 -3.62143,-0.9684 -5.00488,-1.4404 -1.38347,-0.472 -2.53093,-1.0579 -3.44238,-1.7578 -0.91147,-0.6999 -1.57878,-1.5462 -2.00196,-2.5391 -0.42318,-0.9928 -0.63476,-2.2379 -0.63476,-3.7353 0,-1.3672 0.28483,-2.6204 0.85449,-3.7598 0.56966,-1.1393 1.38346,-2.124 2.44141,-2.9541 1.05793,-0.83004 2.34374,-1.48109 3.85742,-1.95312 1.51366,-0.47197 3.19823,-0.70798 5.05371,-0.70801 8.52862,3e-5 12.8906,3.04363 13.08594,9.13083 l -5.81055,0 c -0.19533,-3.0924 -2.50653,-4.6386 -6.93359,-4.6386 -0.91148,0 -1.77411,0.09 -2.58789,0.2685 -0.81382,0.1791 -1.52996,0.4476 -2.14844,0.8057 -0.6185,0.3581 -1.10678,0.8138 -1.46485,1.3672 -0.35808,0.5534 -0.53711,1.1881 -0.53711,1.9043 0,0.651 0.0651,1.18 0.19532,1.5869 0.1302,0.4069 0.48827,0.7812 1.07422,1.123 0.58592,0.3418 1.47297,0.6836 2.66113,1.0254 1.18814,0.3418 2.84015,0.7731 4.95605,1.294 1.95311,0.4883 3.66209,0.9847 5.12696,1.4892 1.46482,0.5046 2.67738,1.1231 3.63769,1.8555 0.96026,0.7324 1.68454,1.6195 2.17285,2.6611 0.48826,1.0417 0.7324,2.3438 0.73243,3.9063 -3e-5,1.4323 -0.30114,2.7832 -0.90333,4.0527 -0.60224,1.2695 -1.473,2.3682 -2.6123,3.2959 -1.13935,0.9277 -2.52281,1.6602 -4.15039,2.1973 -1.62762,0.5371 -3.45054,0.8056 -5.46875,0.8056 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2829" />
+      <path
+         d="m 222.84682,1030.5747 c -0.65106,0.1302 -1.31837,0.2279 -2.00195,0.293 -0.68361,0.065 -1.39975,0.098 -2.14844,0.098 -1.82293,0 -3.25522,-0.2278 -4.29687,-0.6836 -1.04168,-0.4557 -1.81479,-1.1149 -2.31934,-1.9775 -0.50456,-0.8626 -0.81381,-1.9124 -0.92773,-3.1494 -0.11394,-1.237 -0.17091,-2.6367 -0.1709,-4.1992 l 0,-18.5059 -4.00391,0 0,-4.58984 4.00391,0 0,-8.05664 5.81055,0 0,8.05664 5.27343,0 0,4.58984 -5.27343,0 0,18.7988 c -2e-5,1.1394 0.0732,2.0508 0.21972,2.7344 0.14647,0.6836 0.34993,1.2044 0.61035,1.5625 0.26041,0.3581 0.59407,0.5941 1.00098,0.708 0.40689,0.114 0.85448,0.1709 1.34277,0.1709 0.52082,0 1.01724,-0.016 1.48926,-0.049 0.47199,-0.033 0.93586,-0.098 1.3916,-0.1953 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2831" />
+      <path
+         d="m 233.58901,1030.5259 -5.81055,0 0,-32.66604 5.81055,0 z m 0,-38.81838 -5.81055,0 0,-6.25 5.81055,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2833" />
+      <path
+         d="m 255.41518,1031.3071 c -2.24611,0 -4.30502,-0.3662 -6.17676,-1.0986 -1.87175,-0.7324 -3.48308,-1.8229 -4.83398,-3.2715 -1.35092,-1.4486 -2.39258,-3.2308 -3.125,-5.3467 -0.73242,-2.1158 -1.09864,-4.5735 -1.09863,-7.373 -1e-5,-2.7669 0.36621,-5.2165 1.09863,-7.3486 0.73242,-2.1322 1.77408,-3.9144 3.125,-5.3467 1.3509,-1.4323 2.96223,-2.51464 4.83398,-3.2471 1.87174,-0.73239 3.93065,-1.0986 6.17676,-1.09863 1.85545,3e-5 3.54816,0.24417 5.07813,0.73242 1.52992,0.48831 2.86456,1.18005 4.0039,2.0752 1.1393,0.89521 2.05889,1.99381 2.75879,3.29591 0.69984,1.3021 1.14743,2.7669 1.34278,4.3945 l -5.95704,0 c -0.0651,-0.9765 -0.30113,-1.8392 -0.708,-2.5879 -0.40693,-0.7486 -0.9359,-1.3753 -1.58692,-1.8799 -0.65106,-0.5045 -1.4079,-0.887 -2.27051,-1.1474 -0.86264,-0.2604 -1.74969,-0.3906 -2.66113,-0.3906 -1.39975,0 -2.66928,0.2767 -3.80859,0.83 -1.13934,0.5534 -2.1159,1.3591 -2.92969,2.417 -0.81381,1.058 -1.44858,2.3682 -1.9043,3.9307 -0.45573,1.5625 -0.6836,3.3529 -0.68359,5.3711 -1e-5,4.069 0.83821,7.1696 2.51465,9.3017 1.67642,2.1322 3.94692,3.1983 6.81152,3.1983 0.91144,0 1.79849,-0.1139 2.66113,-0.3418 0.86261,-0.2279 1.61945,-0.5859 2.27051,-1.0742 0.65102,-0.4883 1.17999,-1.1068 1.58692,-1.8555 0.40687,-0.7487 0.64288,-1.6439 0.708,-2.6855 l 5.95704,0 c -0.19535,1.7252 -0.66735,3.247 -1.41602,4.5654 -0.74873,1.3183 -1.70901,2.417 -2.88086,3.2959 -1.1719,0.8789 -2.51467,1.5462 -4.02832,2.0019 -1.51369,0.4558 -3.13316,0.6836 -4.8584,0.6836 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2835" />
+      <path
+         d="m 302.33901,1030.5259 -27.88086,0 0,-45.06838 5.9082,0 0,39.69728 21.97266,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2837" />
+      <path
+         d="m 329.48745,1021.9321 0,-7.2265 -3.95508,0 c -8.39845,0 -12.59767,2.2949 -12.59766,6.8847 -10e-6,1.6602 0.60221,2.9297 1.80664,3.8086 1.20442,0.8789 2.88085,1.3184 5.0293,1.3184 0.944,0 1.87987,-0.1058 2.80762,-0.3174 0.92771,-0.2116 1.81476,-0.529 2.66113,-0.9521 0.84633,-0.4232 1.63572,-0.9278 2.36816,-1.5137 0.7324,-0.5859 1.35903,-1.2533 1.87989,-2.002 z m 0,5.2246 c -2.99482,2.767 -6.80341,4.1504 -11.42578,4.1504 -1.59507,0 -3.07619,-0.2278 -4.44336,-0.6836 -1.3672,-0.4557 -2.54721,-1.0986 -3.54004,-1.9287 -0.99285,-0.8301 -1.76596,-1.8229 -2.31934,-2.9785 -0.55339,-1.1556 -0.83008,-2.4333 -0.83008,-3.833 0,-7.6497 6.57552,-11.4746 19.72657,-11.4746 l 2.83203,0 c -3e-5,-1.4974 -0.0651,-2.7995 -0.19531,-3.9063 -0.13024,-1.1067 -0.44762,-2.0182 -0.95215,-2.7343 -0.50458,-0.7162 -1.27769,-1.2451 -2.31934,-1.5869 -1.04169,-0.3418 -2.49025,-0.5127 -4.3457,-0.5127 -5.20835,0 -7.87762,1.8555 -8.00781,5.5664 l -5.76172,0 c 0.45572,-6.7057 5.14322,-10.0586 14.0625,-10.05863 2.08331,3e-5 3.94692,0.17093 5.59082,0.51269 1.64385,0.34183 3.03545,0.96846 4.1748,1.87989 1.1393,0.91145 2.01006,2.16475 2.61231,3.75975 0.60218,1.5951 0.90329,3.6296 0.90332,6.1035 l 0,21.0938 -5.76172,0 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2839" />
+      <path
+         d="m 349.79995,1001.7661 c 2.5716,-3.05985 5.68032,-4.5898 9.32617,-4.58983 2.11586,3e-5 4.00388,0.3988 5.66406,1.19629 1.66013,0.79756 3.05987,1.92064 4.19922,3.36914 1.13929,1.4486 2.01006,3.2064 2.61231,5.2734 0.60218,2.0671 0.90328,4.3702 0.90332,6.9092 -4e-5,2.6367 -0.34183,5.0293 -1.02539,7.1778 -0.68363,2.1484 -1.64392,3.9794 -2.88086,5.4931 -1.23701,1.5137 -2.70185,2.6774 -4.39454,3.4912 -1.69273,0.8138 -3.53192,1.2207 -5.51757,1.2207 -3.51564,0 -6.47788,-1.1067 -8.88672,-3.3203 l 0,2.5391 -5.81055,0 0,-45.06838 5.81055,0 z m 0,20.9961 c 2.44139,2.6367 5.2897,3.9551 8.54492,3.9551 2.53904,0 4.53285,-1.058 5.98144,-3.1738 1.44855,-2.1159 2.17283,-5.3223 2.17286,-9.6192 -3e-5,-4.069 -0.68362,-7.1289 -2.05078,-9.1797 -1.36722,-2.0507 -3.32034,-3.0761 -5.85938,-3.0761 -3.19012,0 -6.1198,1.8717 -8.78906,5.6152 z"
+         style="font-family:Kartika;-inkscape-font-specification:Kartika"
+         id="path2841" />
+    </g>
+  </g>
+</svg>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (small).svg
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (small).svg	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/Resources/HeuristicLab/HeuristicLab Logo (small).svg	(revision 15895)
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="360"
+   height="360"
+   id="svg3726"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="hl_logo3.svg"
+   inkscape:export-filename="C:\Documents and Settings\Monika Kofler\Desktop\hl_logo3.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3728">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective3734" />
+    <inkscape:perspective
+       id="perspective3744"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="0"
+     inkscape:zoom="0.89571167"
+     inkscape:cx="185.88469"
+     inkscape:cy="215.40637"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="744"
+     inkscape:window-x="-4"
+     inkscape:window-y="-4"
+     inkscape:window-maximized="1"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3761"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3731">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-692.36218)"
+     style="display:inline">
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 135.97656,984.48581 15.31105,-84.8493 -88.282864,-0.3258 -14.65952,86.0025 -29.31903,-0.3258 23.78099,-132.91294 11.72762,-67.75955 0,10e-6 28.34173,0 -14.00798,86.32826 87.957084,10e-6 11.53189,-69.15743 -12.70625,0 34.4026,-44.53527 19.87179,44.53527 -12.70491,0 -15.96259,91.96114 -16.61411,91.0389 -28.6675,0 z"
+       id="path2844-7-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+    <path
+       style="fill:#f7931d;fill-opacity:1;stroke:#f7931d;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 304.64083,984.48581 0,12.2292 45.03885,-27.0386 -45.03885,-28.016 0,14.8254 -54.32005,-0.1662 -17.60601,0 2.94382,-21.2429 2.60881,-16.8715 8.46994,-51.79699 4.23497,-22.15215 9.7731,-59.94114 -28.668,0 -24.69352,145.68888 -8.78717,54.4818 44.88297,0 30.94787,2e-4 30.21329,0 -2e-5,0 z"
+       id="path2846-4-8"
+       sodipodi:nodetypes="ccccccccccccccccccc" />
+  </g>
+</svg>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 15895)
@@ -0,0 +1,1423 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18444
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Common.Resources {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class VSImageLibrary {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal VSImageLibrary() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Common.Resources.VSImageLibrary", typeof(VSImageLibrary).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ActualSize {
+            get {
+                object obj = ResourceManager.GetObject("ActualSize", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Add {
+            get {
+                object obj = ResourceManager.GetObject("Add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ArrowDown {
+            get {
+                object obj = ResourceManager.GetObject("ArrowDown", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ArrowUp {
+            get {
+                object obj = ResourceManager.GetObject("ArrowUp", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ArrowUpDown {
+            get {
+                object obj = ResourceManager.GetObject("ArrowUpDown", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Assembly {
+            get {
+                object obj = ResourceManager.GetObject("Assembly", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BatchRunPaused {
+            get {
+                object obj = ResourceManager.GetObject("BatchRunPaused", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BatchRunPrepared {
+            get {
+                object obj = ResourceManager.GetObject("BatchRunPrepared", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BatchRunStarted {
+            get {
+                object obj = ResourceManager.GetObject("BatchRunStarted", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BatchRunStopped {
+            get {
+                object obj = ResourceManager.GetObject("BatchRunStopped", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Breakpoint {
+            get {
+                object obj = ResourceManager.GetObject("Breakpoint", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BreakpointActive {
+            get {
+                object obj = ResourceManager.GetObject("BreakpointActive", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap BreakpointInactive {
+            get {
+                object obj = ResourceManager.GetObject("BreakpointInactive", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Cab {
+            get {
+                object obj = ResourceManager.GetObject("Cab", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Camera {
+            get {
+                object obj = ResourceManager.GetObject("Camera", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Checkout {
+            get {
+                object obj = ResourceManager.GetObject("Checkout", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Class {
+            get {
+                object obj = ResourceManager.GetObject("Class", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Clone {
+            get {
+                object obj = ResourceManager.GetObject("Clone", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Collapse {
+            get {
+                object obj = ResourceManager.GetObject("Collapse", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Comment {
+            get {
+                object obj = ResourceManager.GetObject("Comment", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Component {
+            get {
+                object obj = ResourceManager.GetObject("Component", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Constant {
+            get {
+                object obj = ResourceManager.GetObject("Constant", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Control {
+            get {
+                object obj = ResourceManager.GetObject("Control", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Copy {
+            get {
+                object obj = ResourceManager.GetObject("Copy", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Cut {
+            get {
+                object obj = ResourceManager.GetObject("Cut", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Database {
+            get {
+                object obj = ResourceManager.GetObject("Database", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap DatabaseModified {
+            get {
+                object obj = ResourceManager.GetObject("DatabaseModified", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Delegate {
+            get {
+                object obj = ResourceManager.GetObject("Delegate", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Delete {
+            get {
+                object obj = ResourceManager.GetObject("Delete", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap DeleteFolder {
+            get {
+                object obj = ResourceManager.GetObject("DeleteFolder", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Disconnect {
+            get {
+                object obj = ResourceManager.GetObject("Disconnect", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap DisplayInColor {
+            get {
+                object obj = ResourceManager.GetObject("DisplayInColor", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap DisplayInColorVertical {
+            get {
+                object obj = ResourceManager.GetObject("DisplayInColorVertical", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Document {
+            get {
+                object obj = ResourceManager.GetObject("Document", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Drive {
+            get {
+                object obj = ResourceManager.GetObject("Drive", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Edit {
+            get {
+                object obj = ResourceManager.GetObject("Edit", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap EditBrightnessContrast {
+            get {
+                object obj = ResourceManager.GetObject("EditBrightnessContrast", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap EditInformation {
+            get {
+                object obj = ResourceManager.GetObject("EditInformation", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap EditTable {
+            get {
+                object obj = ResourceManager.GetObject("EditTable", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Enum {
+            get {
+                object obj = ResourceManager.GetObject("Enum", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap EnumItem {
+            get {
+                object obj = ResourceManager.GetObject("EnumItem", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Error {
+            get {
+                object obj = ResourceManager.GetObject("Error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Event {
+            get {
+                object obj = ResourceManager.GetObject("Event", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Exception {
+            get {
+                object obj = ResourceManager.GetObject("Exception", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExecutablePaused {
+            get {
+                object obj = ResourceManager.GetObject("ExecutablePaused", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExecutablePrepared {
+            get {
+                object obj = ResourceManager.GetObject("ExecutablePrepared", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExecutableStarted {
+            get {
+                object obj = ResourceManager.GetObject("ExecutableStarted", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExecutableStopped {
+            get {
+                object obj = ResourceManager.GetObject("ExecutableStopped", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Expand {
+            get {
+                object obj = ResourceManager.GetObject("Expand", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExperimentPaused {
+            get {
+                object obj = ResourceManager.GetObject("ExperimentPaused", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExperimentPrepared {
+            get {
+                object obj = ResourceManager.GetObject("ExperimentPrepared", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExperimentStarted {
+            get {
+                object obj = ResourceManager.GetObject("ExperimentStarted", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ExperimentStopped {
+            get {
+                object obj = ResourceManager.GetObject("ExperimentStopped", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Field {
+            get {
+                object obj = ResourceManager.GetObject("Field", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap File {
+            get {
+                object obj = ResourceManager.GetObject("File", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Filter {
+            get {
+                object obj = ResourceManager.GetObject("Filter", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap FlagBlue {
+            get {
+                object obj = ResourceManager.GetObject("FlagBlue", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap FlagGreen {
+            get {
+                object obj = ResourceManager.GetObject("FlagGreen", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap FlagRed {
+            get {
+                object obj = ResourceManager.GetObject("FlagRed", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap FormulaEvaluator {
+            get {
+                object obj = ResourceManager.GetObject("FormulaEvaluator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Function {
+            get {
+                object obj = ResourceManager.GetObject("Function", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Gradient {
+            get {
+                object obj = ResourceManager.GetObject("Gradient", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Graph {
+            get {
+                object obj = ResourceManager.GetObject("Graph", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Help {
+            get {
+                object obj = ResourceManager.GetObject("Help", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap HiddenField {
+            get {
+                object obj = ResourceManager.GetObject("HiddenField", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap HighPriorityLarge {
+            get {
+                object obj = ResourceManager.GetObject("HighPriorityLarge", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Image {
+            get {
+                object obj = ResourceManager.GetObject("Image", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Information {
+            get {
+                object obj = ResourceManager.GetObject("Information", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap InformationLarge {
+            get {
+                object obj = ResourceManager.GetObject("InformationLarge", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Install {
+            get {
+                object obj = ResourceManager.GetObject("Install", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Interface {
+            get {
+                object obj = ResourceManager.GetObject("Interface", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Internet {
+            get {
+                object obj = ResourceManager.GetObject("Internet", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Library {
+            get {
+                object obj = ResourceManager.GetObject("Library", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Macro {
+            get {
+                object obj = ResourceManager.GetObject("Macro", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Map {
+            get {
+                object obj = ResourceManager.GetObject("Map", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MapItem {
+            get {
+                object obj = ResourceManager.GetObject("MapItem", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Method {
+            get {
+                object obj = ResourceManager.GetObject("Method", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MethodOverload {
+            get {
+                object obj = ResourceManager.GetObject("MethodOverload", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Module {
+            get {
+                object obj = ResourceManager.GetObject("Module", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MonitorLarge {
+            get {
+                object obj = ResourceManager.GetObject("MonitorLarge", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MoveFirst {
+            get {
+                object obj = ResourceManager.GetObject("MoveFirst", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MoveLast {
+            get {
+                object obj = ResourceManager.GetObject("MoveLast", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MoveNext {
+            get {
+                object obj = ResourceManager.GetObject("MoveNext", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap MovePrevious {
+            get {
+                object obj = ResourceManager.GetObject("MovePrevious", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Namespace {
+            get {
+                object obj = ResourceManager.GetObject("Namespace", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap NetworkCenterLarge {
+            get {
+                object obj = ResourceManager.GetObject("NetworkCenterLarge", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap NetworkConnections {
+            get {
+                object obj = ResourceManager.GetObject("NetworkConnections", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap NewDocument {
+            get {
+                object obj = ResourceManager.GetObject("NewDocument", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap NewFolder {
+            get {
+                object obj = ResourceManager.GetObject("NewFolder", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Nothing {
+            get {
+                object obj = ResourceManager.GetObject("Nothing", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Object {
+            get {
+                object obj = ResourceManager.GetObject("Object", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Open {
+            get {
+                object obj = ResourceManager.GetObject("Open", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Operator {
+            get {
+                object obj = ResourceManager.GetObject("Operator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap OrgChart {
+            get {
+                object obj = ResourceManager.GetObject("OrgChart", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Paste {
+            get {
+                object obj = ResourceManager.GetObject("Paste", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Pause {
+            get {
+                object obj = ResourceManager.GetObject("Pause", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Performance {
+            get {
+                object obj = ResourceManager.GetObject("Performance", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap PieChart {
+            get {
+                object obj = ResourceManager.GetObject("PieChart", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Play {
+            get {
+                object obj = ResourceManager.GetObject("Play", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Pointer {
+            get {
+                object obj = ResourceManager.GetObject("Pointer", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Print {
+            get {
+                object obj = ResourceManager.GetObject("Print", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap PrintPreview {
+            get {
+                object obj = ResourceManager.GetObject("PrintPreview", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Properties {
+            get {
+                object obj = ResourceManager.GetObject("Properties", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ProtectForm {
+            get {
+                object obj = ResourceManager.GetObject("ProtectForm", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap PublishToWeb {
+            get {
+                object obj = ResourceManager.GetObject("PublishToWeb", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap RadialChart {
+            get {
+                object obj = ResourceManager.GetObject("RadialChart", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Redo {
+            get {
+                object obj = ResourceManager.GetObject("Redo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Refresh {
+            get {
+                object obj = ResourceManager.GetObject("Refresh", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap RefreshDocument {
+            get {
+                object obj = ResourceManager.GetObject("RefreshDocument", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Remove {
+            get {
+                object obj = ResourceManager.GetObject("Remove", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Restart {
+            get {
+                object obj = ResourceManager.GetObject("Restart", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Save {
+            get {
+                object obj = ResourceManager.GetObject("Save", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap SaveAll {
+            get {
+                object obj = ResourceManager.GetObject("SaveAll", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap SaveAs {
+            get {
+                object obj = ResourceManager.GetObject("SaveAs", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Script {
+            get {
+                object obj = ResourceManager.GetObject("Script", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Sort {
+            get {
+                object obj = ResourceManager.GetObject("Sort", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap SortUp {
+            get {
+                object obj = ResourceManager.GetObject("SortUp", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Statistics {
+            get {
+                object obj = ResourceManager.GetObject("Statistics", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Stop {
+            get {
+                object obj = ResourceManager.GetObject("Stop", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Structure {
+            get {
+                object obj = ResourceManager.GetObject("Structure", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Table {
+            get {
+                object obj = ResourceManager.GetObject("Table", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Template {
+            get {
+                object obj = ResourceManager.GetObject("Template", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Timer {
+            get {
+                object obj = ResourceManager.GetObject("Timer", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap TrackBar {
+            get {
+                object obj = ResourceManager.GetObject("TrackBar", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Type {
+            get {
+                object obj = ResourceManager.GetObject("Type", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap TypeDef {
+            get {
+                object obj = ResourceManager.GetObject("TypeDef", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Undo {
+            get {
+                object obj = ResourceManager.GetObject("Undo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Union {
+            get {
+                object obj = ResourceManager.GetObject("Union", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap User {
+            get {
+                object obj = ResourceManager.GetObject("User", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap UserAccounts {
+            get {
+                object obj = ResourceManager.GetObject("UserAccounts", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ValueType {
+            get {
+                object obj = ResourceManager.GetObject("ValueType", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Warning {
+            get {
+                object obj = ResourceManager.GetObject("Warning", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Windows {
+            get {
+                object obj = ResourceManager.GetObject("Windows", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap Zoom {
+            get {
+                object obj = ResourceManager.GetObject("Zoom", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ZoomIn {
+            get {
+                object obj = ResourceManager.GetObject("ZoomIn", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ZoomOut {
+            get {
+                object obj = ResourceManager.GetObject("ZoomOut", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 15895)
@@ -0,0 +1,529 @@
+﻿<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="ActualSize" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_ActualSize.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Actions_Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ArrowDown" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Down.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ArrowUp" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Assembly" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Assembly.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Breakpoint" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Breakpoint.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BreakpointActive" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Breakpoint_Active.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BreakpointInactive" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Breakpoint_Inactive.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Cab" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Cab.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Checkout" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Checkout.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Class" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Class.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Clone" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Clone.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Collapse" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_Collapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Comment" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Comment.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Component" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Component.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Constant" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Constant.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Control" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Control.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Cut" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Cut.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Database" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Database.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="DatabaseModified" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Database_Modified.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Delegate" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Delegate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="DeleteFolder" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DeleteFolder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Disconnect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Disconnect.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="DisplayInColor" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Document" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Document.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Drive" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Drive.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Edit" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Edit.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="EditBrightnessContrast" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditBrightnessContrast.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="EditInformation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditInformation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="EditTable" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_EditTable.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Enum" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Enum.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="EnumItem" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_EnumItem.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Event" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Event.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Exception" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Exception.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BatchRunPrepared" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Prepared.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BatchRunStarted" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Started.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BatchRunPaused" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Paused.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="BatchRunStopped" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Stopped.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExperimentPrepared" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Prepared.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExperimentStarted" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Started.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExperimentPaused" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Paused.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExperimentStopped" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Experiment_Stopped.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExecutablePaused" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Paused.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExecutablePrepared" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Prepared.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExecutableStarted" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Started.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ExecutableStopped" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Executable_Stopped.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Expand" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_Expand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Field" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Field.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="File" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_File.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Filter" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_Filter.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FlagBlue" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FlagGreen" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Green.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FlagRed" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Flag_Red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FormulaEvaluator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_FormulaEvaluator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Function" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Function.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Gradient" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Gradient.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Graph" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Graph.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Help" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HiddenField" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_HiddenField.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HighPriorityLarge" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations&amp;Buttons_HighPriority_Large.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Image" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Image.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Information" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations_Information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Install" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Insall.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Interface" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Interface.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Internet" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Internet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Library" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Library.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Macro" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Macro.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Map" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Map.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MapItem" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_MapItem.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Method" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Method.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MethodOverload" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_MethodOverload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Module" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Module.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MoveFirst" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveFirst.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MoveLast" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveLast.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MoveNext" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MoveNext.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MovePrevious" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_MovePrevious.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Namespace" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Namespace.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="NetworkConnections" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_NetworkConnections.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="NewDocument" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_NewDocument.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="NewFolder" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_NewFolder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Nothing" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Nothing.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Object" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Object.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Operator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Operator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="OrgChart" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_OrgChart.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Paste" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Paste.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Pause" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Pause.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Performance" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Performance.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="PieChart" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PieChart.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Play" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Play.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Pointer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Print" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Print.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="PrintPreview" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PrintPreview.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Properties" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Properties.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ProtectForm" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_ProtectForm.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="PublishToWeb" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_PublishToWeb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="RadialChart" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_RadialChart.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Redo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Redo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="RefreshDocument" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_RefreshDocument.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Remove" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Actions_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Restart" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Restart.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Save" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SaveAll" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_SaveAll.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Script" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Sort" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Sort.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SortUp" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_SortUp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Statistics" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Statistics.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Stop" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Stop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Structure" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Structure.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Table" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Table.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Template.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Timer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Timer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="TrackBar" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_TrackBar.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Type" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Type.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="TypeDef" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_TypeDef.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Undo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Undo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Union" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_Union.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="User" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_User.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="UserAccounts" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_UserAccounts.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ValueType" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_ValueType.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Warning" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Warning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Windows" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Windows.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Zoom" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Zoom.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ZoomIn" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Zoom_In.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ZoomOut" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Zoom_Out.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="DisplayInColorVertical" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor_Vertical.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="InformationLarge" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Information_Large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MonitorLarge" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Monitor_Large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="NetworkCenterLarge" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Network_Center_Large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SaveAs" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_SaveAsHH.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Camera" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\camera.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ArrowUpDown" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.IntegratedMachineLearning.sln
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.IntegratedMachineLearning.sln	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.IntegratedMachineLearning.sln	(revision 15895)
@@ -0,0 +1,47 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3", "HeuristicLab.Networks.IntegratedOptimization.MachineLearning\HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3.csproj", "{F5581DE0-5972-4A73-B1F7-D308068E7CAC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization-3.3", "HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj", "{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}"
+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
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Release|x64.ActiveCfg = Release|Any CPU
+		{F5581DE0-5972-4A73-B1F7-D308068E7CAC}.Release|x86.ActiveCfg = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.ActiveCfg = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.Build.0 = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.ActiveCfg = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.Build.0 = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.ActiveCfg = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.Build.0 = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.ActiveCfg = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(Performance) = preSolution
+		HasPerformanceSessions = true
+	EndGlobalSection
+EndGlobal
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 15895)
@@ -0,0 +1,154 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Modeler</RootNamespace>
+    <AssemblyName>HeuristicLab.Modeler-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="IModelerUserInterfaceItemProvider.cs" />
+    <Compile Include="ModelerDockingMainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ModelerDockingMainForm.Designer.cs">
+      <DependentUpon>ModelerDockingMainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/IModelerUserInterfaceItemProvider.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/IModelerUserInterfaceItemProvider.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/IModelerUserInterfaceItemProvider.cs	(revision 15895)
@@ -0,0 +1,24 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Modeler {
+  public interface IModelerUserInterfaceItemProvider { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.Designer.cs	(revision 15895)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Modeler {
+  partial class ModelerDockingMainForm {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.SuspendLayout();
+      // 
+      // OptimizerMainForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(984, 714);
+      this.Name = "ModelerMainForm";
+      this.Text = "HeuristicLab Modeler";
+      this.Title = "HeuristicLab Modeler";
+      this.Icon = HeuristicLab.Common.Resources.HeuristicLab.Icon;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/ModelerDockingMainForm.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Modeler {
+  internal partial class ModelerDockingMainForm : DockingMainForm {
+    private string title;
+
+    public ModelerDockingMainForm()
+      : base() {
+      InitializeComponent();
+    }
+    public ModelerDockingMainForm(Type userInterfaceItemType)
+      : base(userInterfaceItemType) {
+      InitializeComponent();
+    }
+    public ModelerDockingMainForm(Type userInterfaceItemType, bool showContentInViewHost)
+      : this(userInterfaceItemType) {
+      this.ShowContentInViewHost = showContentInViewHost;
+    }
+
+    protected override void OnInitialized(EventArgs e) {
+      base.OnInitialized(e);
+
+      AssemblyFileVersionAttribute version = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).
+                                             Cast<AssemblyFileVersionAttribute>().FirstOrDefault();
+      title = "HeuristicLab Modeler";
+      if (version != null) title += " " + version.Version;
+      Title = title;
+
+      ContentManager.Initialize(new PersistenceContentManager());
+
+      WindowState = Properties.Settings.Default.ShowMaximized ? FormWindowState.Maximized : FormWindowState.Normal;
+    }
+
+    protected override void OnClosing(CancelEventArgs e) {
+      base.OnClosing(e);
+      if (MainFormManager.MainForm.Views.OfType<IContentView>().Any(v=>v.Content is IStorableContent)) {
+        if (MessageBox.Show(this, "Some views are still opened. If their content has not been saved, it will be lost after closing. Do you really want to close HeuristicLab Modeler?", "Close Modeler", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.No)
+          e.Cancel = true;
+      }
+    }
+    protected override void OnClosed(EventArgs e) {
+      base.OnClosed(e);
+      Properties.Settings.Default.ShowMaximized = WindowState == FormWindowState.Maximized;
+      Properties.Settings.Default.Save();
+    }
+
+    protected override void OnActiveViewChanged() {
+      base.OnActiveViewChanged();
+      UpdateTitle();
+    }
+
+    public override void UpdateTitle() {
+      if (InvokeRequired)
+        Invoke(new Action(UpdateTitle));
+      else {
+        IContentView activeView = ActiveView as IContentView;
+        if ((activeView != null) && (activeView.Content is IStorableContent)) {
+          IStorableContent content = (IStorableContent)activeView.Content;
+          Title = title + " [" + (string.IsNullOrEmpty(content.Filename) ? "Unsaved" : content.Filename) + "]";
+        } else {
+          Title = title;
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Modeler {
+  [Plugin("HeuristicLab.Modeler", "3.3.11.$WCREV$")]
+  [PluginFile("HeuristicLab.Modeler-3.3.dll", PluginFileType.Assembly)]
+//  [PluginDependency("HeuristicLab.Clients.Common", "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.Core.Views", "3.3")]
+//  [PluginDependency("HeuristicLab.Data", "3.3")]
+//  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+//  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+//  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+//  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+//  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+//  [PluginDependency("HeuristicLab.Clients.Access", "3.3")]
+  public class HeuristicLabModelerPlugin : PluginBase {
+  }
+
+  [Application("Modeler", "HeuristicLab Modeler 3.3.11.$WCREV$")]
+  internal class HeuristicLabModelerApplication : ApplicationBase {
+    public override void Run(ICommandLineArgument[] args) {
+      var mainForm = new ModelerDockingMainForm(typeof(IModelerUserInterfaceItemProvider));
+      mainForm.ShowContentInViewHost = true;
+      Application.Run(mainForm);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#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.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.Modeler")]
+[assembly: AssemblyDescription("HeuristicLab application for modeling optimization networks")]
+[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("d5f10701-286e-4220-a0b2-514fb587961a")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.Designer.cs	(revision 15895)
@@ -0,0 +1,38 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18444
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Modeler.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        public bool ShowMaximized {
+            get {
+                return ((bool)(this["ShowMaximized"]));
+            }
+            set {
+                this["ShowMaximized"] = value;
+            }
+        }
+    }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.settings
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.settings	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/Properties/Settings.settings	(revision 15895)
@@ -0,0 +1,9 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Modeler.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="ShowMaximized" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">True</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/app.config
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/app.config	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Modeler/3.3/app.config	(revision 15895)
@@ -0,0 +1,15 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.Modeler.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <HeuristicLab.Modeler.Properties.Settings>
+            <setting name="ShowMaximized" serializeAs="String">
+                <value>True</value>
+            </setting>
+        </HeuristicLab.Modeler.Properties.Settings>
+    </userSettings>
+</configuration>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3.csproj	(revision 15895)
@@ -0,0 +1,239 @@
+﻿<?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>{B364F111-5C05-4B28-9A29-F6A50E539003}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.IntegratedOptimization.LocationRouting</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.CMAEvolutionStrategy-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.CMAEvolutionStrategy-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.VehicleRouting-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.VehicleRouting-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="LrpNetwork.cs" />
+    <Compile Include="LrpNetwork2.cs" />
+    <Compile Include="LrpNetwork3.cs" />
+    <Compile Include="LrpNetwork4.cs" />
+    <Compile Include="LrpNetwork5.cs" />
+    <Compile Include="LrpOrchestratorNode.cs" />
+    <Compile Include="LrpOrchestratorNode2.cs" />
+    <Compile Include="LrpOrchestratorNode3.cs" />
+    <Compile Include="LrpOrchestratorNode4.cs" />
+    <Compile Include="LrpOrchestratorNode5.cs" />
+    <Compile Include="LrpUtils.cs" />
+    <Compile Include="LrpNetwork1.cs" />
+    <Compile Include="LrpOrchestratorNode1.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj">
+      <Project>{b6263d3e-dcaf-42b0-a440-3deef1ff0429}</Project>
+      <Name>HeuristicLab.Networks.IntegratedOptimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj">
+      <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
+      <Name>HeuristicLab.Networks-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.FacilityLocation.CplexSolver\3.3\HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.csproj">
+      <Project>{307df76a-9d9d-4d0a-bb67-deef934a70ff}</Project>
+      <Name>HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.FacilityLocation\3.3\HeuristicLab.Problems.FacilityLocation-3.3.csproj">
+      <Project>{aa9d05e4-eae1-45ca-97d2-275110a7e58d}</Project>
+      <Name>HeuristicLab.Problems.FacilityLocation-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork.cs	(revision 15895)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Core.Networks;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork", "An abstract base class for LRP optimization networks.")]
+  [StorableClass]
+  public abstract class LrpNetwork : Network {
+    #region
+    protected const string OrchestratorNodeName = "Orchestrator";
+    protected const string MetaSolverNodeName = "MetaSolver";
+    protected const string FlpSolverNodeName = "FlpSolver";
+    protected const string VrpSolverNodeName = "VrpSolver";
+    #endregion
+
+    #region Nodes
+    public LrpOrchestratorNode Orchestrator {
+      get { return (LrpOrchestratorNode)Nodes[OrchestratorNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(OrchestratorNodeName))
+          throw new InvalidOperationException("Orchestrator already set.");
+        Nodes.Add(value);
+      }
+    }
+
+    public OrchestratedAlgorithmNode MetaSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[MetaSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(MetaSolverNodeName))
+          throw new InvalidOperationException("MetaSolver already set.");
+        Nodes.Add(value);
+        RegisterEvents();
+      }
+    }
+
+    public OrchestratedAlgorithmNode FlpSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[FlpSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(FlpSolverNodeName))
+          throw new InvalidOperationException("FlpSolver already set.");
+        Nodes.Add(value);
+      }
+    }
+
+    public OrchestratedAlgorithmNode VrpSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[VrpSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(VrpSolverNodeName))
+          throw new InvalidOperationException("VrpSolver already set.");
+        Nodes.Add(value);
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected LrpNetwork(bool deserializing) : base(deserializing) { }
+    protected LrpNetwork(LrpNetwork original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    protected LrpNetwork() : this("LrpNetwork") { }
+    protected LrpNetwork(string name) : base(name) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      MetaSolver.AlgorithmChanged += MetaSolver_AlgorithmChanged;
+      RegisterAlgorithmEvents();
+    }
+
+    private void MetaSolver_AlgorithmChanged(object sender, EventArgs e) {
+      RegisterAlgorithmEvents();
+    }
+
+    private void RegisterAlgorithmEvents() {
+      var algorithm = MetaSolver.Algorithm;
+      if (algorithm == null) return;
+
+      algorithm.ExecutionStateChanged += (s, e) => OnExecutionStateChanged();
+      algorithm.ExecutionTimeChanged += (s, e) => OnExecutionTimeChanged();
+      algorithm.Prepared += (s, e) => OnPrepared();
+      algorithm.Started += (s, e) => OnStarted();
+      algorithm.Paused += (s, e) => OnPaused();
+      algorithm.Stopped += (s, e) => OnStopped();
+      algorithm.ExceptionOccurred += (s, e) => OnExceptionOccurred(e.Value);
+    }
+
+    #region IOptimizer Members
+    public RunCollection Runs { get { return MetaSolver.Algorithm.Runs; } }
+    public IEnumerable<IOptimizer> NestedOptimizers { get { yield break; } }
+    public ExecutionState ExecutionState { get { return MetaSolver.Algorithm.ExecutionState; } }
+    public TimeSpan ExecutionTime { get { return MetaSolver.Algorithm.ExecutionTime; } }
+
+    public void Prepare() { Prepare(false); }
+    public void Prepare(bool clearRuns) { Orchestrator.Prepare(clearRuns); }
+    public void Start() { Orchestrator.StartAsync(); }
+    public void Pause() { Orchestrator.Pause(); }
+    public void Stop() { Orchestrator.Stop(); }
+
+    public event EventHandler ExecutionStateChanged;
+    private void OnExecutionStateChanged() {
+      var handler = ExecutionStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      var handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Prepared;
+    private void OnPrepared() {
+      var handler = Prepared;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Started;
+    private void OnStarted() {
+      var handler = Started;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Paused;
+    private void OnPaused() {
+      var handler = Paused;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Stopped;
+    private void OnStopped() {
+      var handler = Stopped;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
+    private void OnExceptionOccurred(Exception exception) {
+      var handler = ExceptionOccurred;
+      if (handler != null) handler(this, new EventArgs<Exception>(exception));
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork1.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.FacilityLocation.CplexSolver;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork1", "Version 1 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class LrpNetwork1 : LrpNetwork, IOptimizer {
+    [StorableConstructor]
+    private LrpNetwork1(bool deserializing) : base(deserializing) { }
+    private LrpNetwork1(LrpNetwork1 original, Cloner cloner) : base(original, cloner) { }
+    public LrpNetwork1() : this("LrpNetwork1") { }
+    public LrpNetwork1(string name) : base(name) {
+      Orchestrator = new LrpOrchestratorNode1(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      FlpSolver = new OrchestratedAlgorithmNode(FlpSolverNodeName);
+      VrpSolver = new OrchestratedAlgorithmNode(VrpSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      var vp = new MinimizationVariegationProblem<RealVectorEncoding>();
+      cmaes.Problem = vp;
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var cplexSolver = new FLPCplexSolver();
+      cplexSolver.Problem = new FacilityLocationProblem();
+      cplexSolver.MaximumRuntimeParameter.Value.Value = TimeSpan.FromSeconds(3.0);
+      FlpSolver.Algorithm = cplexSolver;
+      Orchestrator.FlpSolverOrchestrationPort.ConnectedPort = FlpSolver.OrchestrationPort;
+
+      var ga = new GeneticAlgorithm();
+      ga.Problem = new VehicleRoutingProblem();
+      ga.PopulationSize.Value = 100;
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      ga.CrossoverParameter.Value = crossover;
+      ga.MaximumGenerations.Value = 100;
+      var mutator = ga.MutatorParameter.ValidValues.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      ga.MutatorParameter.Value = mutator;
+      var selector = ga.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      ga.SelectorParameter.Value = selector;
+      VrpSolver.Algorithm = ga;
+      Orchestrator.VrpSolverOrchestrationPort.ConnectedPort = VrpSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpNetwork1(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork2.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.FacilityLocation.CplexSolver;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork2", "Version 2 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class LrpNetwork2 : LrpNetwork, IOptimizer {
+    [StorableConstructor]
+    private LrpNetwork2(bool deserializing) : base(deserializing) { }
+    private LrpNetwork2(LrpNetwork2 original, Cloner cloner) : base(original, cloner) { }
+    public LrpNetwork2() : this("LrpNetwork2") { }
+    public LrpNetwork2(string name) : base(name) {
+      Orchestrator = new LrpOrchestratorNode2(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      FlpSolver = new OrchestratedAlgorithmNode(FlpSolverNodeName);
+      VrpSolver = new OrchestratedAlgorithmNode(VrpSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      var vp = new MinimizationVariegationProblem<RealVectorEncoding>();
+      cmaes.Problem = vp;
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var cplexSolver = new FLPCplexSolver();
+      cplexSolver.Problem = new FacilityLocationProblem();
+      cplexSolver.MaximumRuntimeParameter.Value.Value = TimeSpan.FromSeconds(3.0);
+      FlpSolver.Algorithm = cplexSolver;
+      Orchestrator.FlpSolverOrchestrationPort.ConnectedPort = FlpSolver.OrchestrationPort;
+
+      var ga = new GeneticAlgorithm();
+      ga.Problem = new VehicleRoutingProblem();
+      ga.PopulationSize.Value = 100;
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      ga.CrossoverParameter.Value = crossover;
+      ga.MaximumGenerations.Value = 100;
+      var mutator = ga.MutatorParameter.ValidValues.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      ga.MutatorParameter.Value = mutator;
+      var selector = ga.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      ga.SelectorParameter.Value = selector;
+      VrpSolver.Algorithm = ga;
+      Orchestrator.VrpSolverOrchestrationPort.ConnectedPort = VrpSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpNetwork2(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork3.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork3.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork3.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.FacilityLocation.CplexSolver;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork3", "Version 3 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class LrpNetwork3 : LrpNetwork, IOptimizer {
+    [StorableConstructor]
+    private LrpNetwork3(bool deserializing) : base(deserializing) { }
+    private LrpNetwork3(LrpNetwork3 original, Cloner cloner) : base(original, cloner) { }
+    public LrpNetwork3() : this("LrpNetwork3") { }
+    public LrpNetwork3(string name) : base(name) {
+      Orchestrator = new LrpOrchestratorNode3(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      FlpSolver = new OrchestratedAlgorithmNode(FlpSolverNodeName);
+      VrpSolver = new OrchestratedAlgorithmNode(VrpSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      var vp = new MinimizationVariegationProblem<RealVectorEncoding>();
+      cmaes.Problem = vp;
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var cplexSolver = new FLPCplexSolver { FlpVariant = FlpVariant.FLP_2 };
+      cplexSolver.Problem = new FacilityLocationProblem();
+      cplexSolver.MaximumRuntimeParameter.Value.Value = TimeSpan.FromSeconds(3.0);
+      FlpSolver.Algorithm = cplexSolver;
+      Orchestrator.FlpSolverOrchestrationPort.ConnectedPort = FlpSolver.OrchestrationPort;
+
+      var ga = new GeneticAlgorithm();
+      ga.Problem = new VehicleRoutingProblem();
+      ga.PopulationSize.Value = 100;
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      ga.CrossoverParameter.Value = crossover;
+      ga.MaximumGenerations.Value = 100;
+      var mutator = ga.MutatorParameter.ValidValues.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      ga.MutatorParameter.Value = mutator;
+      var selector = ga.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      ga.SelectorParameter.Value = selector;
+      VrpSolver.Algorithm = ga;
+      Orchestrator.VrpSolverOrchestrationPort.ConnectedPort = VrpSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpNetwork3(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork4.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork4.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork4.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.FacilityLocation.CplexSolver;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork4", "Version 4 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class LrpNetwork4 : LrpNetwork, IOptimizer {
+    [StorableConstructor]
+    private LrpNetwork4(bool deserializing) : base(deserializing) { }
+    private LrpNetwork4(LrpNetwork4 original, Cloner cloner) : base(original, cloner) { }
+    public LrpNetwork4() : this("LrpNetwork4") { }
+    public LrpNetwork4(string name) : base(name) {
+      Orchestrator = new LrpOrchestratorNode4(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      FlpSolver = new OrchestratedAlgorithmNode(FlpSolverNodeName);
+      VrpSolver = new OrchestratedAlgorithmNode(VrpSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      var vp = new MinimizationVariegationProblem<RealVectorEncoding>();
+      cmaes.Problem = vp;
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var cplexSolver = new FLPCplexSolver();
+      cplexSolver.Problem = new FacilityLocationProblem();
+      cplexSolver.MaximumRuntimeParameter.Value.Value = TimeSpan.FromSeconds(3.0);
+      FlpSolver.Algorithm = cplexSolver;
+      Orchestrator.FlpSolverOrchestrationPort.ConnectedPort = FlpSolver.OrchestrationPort;
+
+      var ga = new GeneticAlgorithm();
+      ga.Problem = new VehicleRoutingProblem();
+      ga.PopulationSize.Value = 100;
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      ga.CrossoverParameter.Value = crossover;
+      ga.MaximumGenerations.Value = 100;
+      var mutator = ga.MutatorParameter.ValidValues.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      ga.MutatorParameter.Value = mutator;
+      var selector = ga.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      ga.SelectorParameter.Value = selector;
+      VrpSolver.Algorithm = ga;
+      Orchestrator.VrpSolverOrchestrationPort.ConnectedPort = VrpSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpNetwork4(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork5.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork5.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpNetwork5.cs	(revision 15895)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.FacilityLocation.CplexSolver;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpNetwork5", "Version 5 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class LrpNetwork5 : LrpNetwork, IOptimizer {
+    [StorableConstructor]
+    private LrpNetwork5(bool deserializing) : base(deserializing) { }
+    private LrpNetwork5(LrpNetwork5 original, Cloner cloner) : base(original, cloner) { }
+    public LrpNetwork5() : this("LrpNetwork5") { }
+    public LrpNetwork5(string name) : base(name) {
+      Orchestrator = new LrpOrchestratorNode5(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      FlpSolver = new OrchestratedAlgorithmNode(FlpSolverNodeName);
+      VrpSolver = new OrchestratedAlgorithmNode(VrpSolverNodeName);
+
+      var metaSolver = new GeneticAlgorithm();
+      metaSolver.Problem = new MinimizationVariegationProblem<BinaryVectorEncoding>();
+      metaSolver.PopulationSize.Value = 20;
+      var c1 = metaSolver.CrossoverParameter.ValidValues.OfType<MultiBinaryVectorCrossover>().Single();
+      metaSolver.CrossoverParameter.Value = c1;
+      metaSolver.MaximumGenerations.Value = 80;
+      var m1 = metaSolver.MutatorParameter.ValidValues.OfType<SinglePositionBitflipManipulator>().Single();
+      metaSolver.MutatorParameter.Value = m1;
+      var s1 = metaSolver.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      metaSolver.SelectorParameter.Value = s1;
+      MetaSolver.Algorithm = metaSolver;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var flpSolver = new FLPCplexSolver();
+      flpSolver.Problem = new FacilityLocationProblem();
+      flpSolver.MaximumRuntimeParameter.Value.Value = TimeSpan.FromSeconds(3.0);
+      FlpSolver.Algorithm = flpSolver;
+      Orchestrator.FlpSolverOrchestrationPort.ConnectedPort = FlpSolver.OrchestrationPort;
+
+      var vrpSolver = new GeneticAlgorithm();
+      vrpSolver.Problem = new VehicleRoutingProblem();
+      vrpSolver.PopulationSize.Value = 100;
+      var c2 = vrpSolver.CrossoverParameter.ValidValues.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      vrpSolver.CrossoverParameter.Value = c2;
+      vrpSolver.MaximumGenerations.Value = 100;
+      var m2 = vrpSolver.MutatorParameter.ValidValues.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      vrpSolver.MutatorParameter.Value = m2;
+      var s2 = vrpSolver.SelectorParameter.ValidValues.OfType<TournamentSelector>().Single();
+      vrpSolver.SelectorParameter.Value = s2;
+      VrpSolver.Algorithm = vrpSolver;
+      Orchestrator.VrpSolverOrchestrationPort.ConnectedPort = VrpSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpNetwork5(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode.cs	(revision 15895)
@@ -0,0 +1,322 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode", "An abstract base class for orchestrators used in LRP optimization networks.")]
+  [StorableClass]
+  public abstract class LrpOrchestratorNode : OrchestratorNode {
+    #region Constants
+    protected const string InstanceParameterName = "Instance";
+    protected const string FlpParameterName = "FLP";
+    protected const string VrpParameterName = "VRP";
+    protected const string MetaSolverName = "MetaSolver";
+    protected const string FlpSolverName = "FlpSolver";
+    protected const string VrpSolverName = "VrpSolver";
+    protected const string OrchestrationPortNameSuffix = "OrchestrationPort";
+    protected const string EvaluationPortNameSuffix = "EvaluationPort";
+    #endregion
+
+    protected CancellationTokenSource cts;
+
+    [Storable]
+    protected int nrOfDepots, nrOfCustomers;
+    [Storable]
+    protected double[,] depotCoordinates = new double[0, 0], customerCoordinates = new double[0, 0];
+    [Storable]
+    protected LrpUtils.DistanceType distanceType;
+    [Storable]
+    protected double[] depotCapacities = new double[0], customerDemands = new double[0], depotCosts = new double[0];
+    [Storable]
+    protected double vehicleCapacity, vehicleCost;
+
+    #region Parameters
+    public IFixedValueParameter<TextFileValue> InstanceParameter {
+      get { return (IFixedValueParameter<TextFileValue>)Parameters[InstanceParameterName]; }
+    }
+
+    public IValueParameter<FacilityLocationProblem> FlpParameter {
+      get { return (IValueParameter<FacilityLocationProblem>)Parameters[FlpParameterName]; }
+    }
+
+    public IValueParameter<VehicleRoutingProblem> VrpParameter {
+      get { return (IValueParameter<VehicleRoutingProblem>)Parameters[VrpParameterName]; }
+    }
+    #endregion
+
+    #region Ports
+    public IMessagePort MetaSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[MetaSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = MetaSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += MetaSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort MetaSolverEvaluationPort {
+      get { return (IMessagePort)Ports[MetaSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = MetaSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+
+    public IMessagePort FlpSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[FlpSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = FlpSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += FlpSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort FlpSolverEvaluationPort {
+      get { return (IMessagePort)Ports[FlpSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = FlpSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+
+    public IMessagePort VrpSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[VrpSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = VrpSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += VrpSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort VrpSolverEvaluationPort {
+      get { return (IMessagePort)Ports[VrpSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = VrpSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected LrpOrchestratorNode(bool deserializing) : base(deserializing) { }
+    protected LrpOrchestratorNode(LrpOrchestratorNode original, Cloner cloner) : base(original, cloner) {
+      nrOfDepots = original.nrOfDepots;
+      nrOfCustomers = original.nrOfCustomers;
+      depotCoordinates = (double[,])original.depotCoordinates.Clone();
+      customerCoordinates = (double[,])original.customerCoordinates.Clone();
+      distanceType = original.distanceType;
+      depotCapacities = (double[])original.depotCapacities.Clone();
+      customerDemands = (double[])original.customerDemands.Clone();
+      depotCosts = (double[])original.depotCosts.Clone();
+      vehicleCapacity = original.vehicleCapacity;
+      vehicleCost = original.vehicleCost;
+
+      RegisterEvents();
+    }
+    protected LrpOrchestratorNode() : this("LrpOrchestratorNode") { }
+    protected LrpOrchestratorNode(string name) : base(name) {
+      Parameters.Add(new FixedValueParameter<TextFileValue>(InstanceParameterName));
+      Parameters.Add(new ValueParameter<FacilityLocationProblem>(FlpParameterName, new FacilityLocationProblem()));
+      Parameters.Add(new ValueParameter<VehicleRoutingProblem>(VrpParameterName, new VehicleRoutingProblem() { ProblemInstance = new CVRPProblemInstance() }));
+
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+      MetaSolverOrchestrationPort.ConnectedPortChanged += MetaSolverOrchestrationPort_ConnectedPortChanged;
+      FlpSolverOrchestrationPort.ConnectedPortChanged += FlpSolverOrchestrationPort_ConnectedPortChanged;
+      VrpSolverOrchestrationPort.ConnectedPortChanged += VrpSolverOrchestrationPort_ConnectedPortChanged;
+    }
+
+    protected virtual void InstanceParameter_Value_ToStringChanged(object sender, EventArgs e) {
+      string filePath = InstanceParameter.Value.Value;
+      LrpUtils.Import(filePath, out nrOfDepots, out nrOfCustomers,
+                                out depotCoordinates, out customerCoordinates,
+                                out distanceType,
+                                out depotCapacities, out customerDemands, out depotCosts,
+                                out vehicleCapacity, out vehicleCost);
+
+      var flp = FlpParameter.Value;
+      flp.CustomerDemandsParameter.Value = new DoubleArray(customerDemands);
+      flp.DeliveryCostsParameter.Value = new DoubleMatrix(LrpUtils.GetFlpDeliveryCosts(depotCoordinates, customerCoordinates, distanceType));
+      flp.DepotCapacitiesParameter.Value = new DoubleArray(depotCapacities);
+      flp.Encoding.Length = nrOfCustomers;
+      flp.OpeningCostsParameter.Value = new DoubleArray(depotCosts);
+
+      var vrpInstance = (CVRPProblemInstance)VrpParameter.Value.ProblemInstance;
+      vrpInstance.Capacity.Value = vehicleCapacity;
+      vrpInstance.FleetUsageFactor.Value = vehicleCost;
+      vrpInstance.OverloadPenalty.Value = vehicleCost * 1000.0;
+
+      var crossover = VrpParameter.Value.OperatorsParameter.Value.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      foreach (var c in crossover.Operators)
+        crossover.Operators.SetItemCheckedState(c, c.Name.StartsWith("Potvin"));
+      var mutator = VrpParameter.Value.OperatorsParameter.Value.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      foreach (var m in mutator.Operators)
+        mutator.Operators.SetItemCheckedState(m, Regex.IsMatch(m.Name, @"Potvin(One|Two).*"));
+
+      Prepare();
+    }
+
+    protected virtual void MetaSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (MetaSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = MetaSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      var hook = new HookOperator { Name = "Meta Eval Hook" };
+      hook.Parameters.Add(new LookupParameter<RealVector>("RealVector") { Hidden = true });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = true });
+      node.EvalHook = hook;
+
+      node.OrchestrationPort.CloneParametersFromPort(MetaSolverOrchestrationPort);
+      node.EvaluationPort.CloneParametersFromPort(MetaSolverEvaluationPort);
+      node.EvaluationPort.ConnectedPort = MetaSolverEvaluationPort;
+    }
+
+    protected virtual void FlpSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (FlpSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = FlpSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      node.OrchestrationPort.CloneParametersFromPort(FlpSolverOrchestrationPort);
+    }
+
+    protected virtual void VrpSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (VrpSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = VrpSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      node.OrchestrationPort.CloneParametersFromPort(VrpSolverOrchestrationPort);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      Results.Clear();
+    }
+
+    public override void Start() {
+      cts = new CancellationTokenSource();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Start);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    public override void Pause() {
+      cts.Cancel();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Pause);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+
+      var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+      vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+    }
+
+    public override void Stop() {
+      cts.Cancel();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+
+      var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+      vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+    }
+
+    protected override void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) {
+      var messageActions = new Dictionary<IMessagePort, Action<IMessage>>();
+      messageActions.Add(MetaSolverOrchestrationPort, MetaSolverOrchestrationPortMessage);
+      messageActions.Add(MetaSolverEvaluationPort, MetaSolverEvaluationPortMessage);
+      messageActions.Add(FlpSolverOrchestrationPort, FlpSolverOrchestrationPortMessage);
+      messageActions.Add(VrpSolverOrchestrationPort, VrpSolverOrchestrationPortMessage);
+
+      messageActions[port](message);
+
+      base.ProcessMessage(message, port, token);
+    }
+
+    #region MetaSolver Message Handling
+    protected virtual void MetaSolverOrchestrationPortMessage(IMessage message) { }
+
+    protected virtual void MetaSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+
+    #region FlpSolver Message Handling
+    protected virtual void FlpSolverOrchestrationPortMessage(IMessage message) { }
+
+    protected virtual void FlpSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+
+    #region VrpSolver Message Handling
+    protected virtual void VrpSolverOrchestrationPortMessage(IMessage message) { }
+
+    private void VrpSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode1.cs	(revision 15895)
@@ -0,0 +1,140 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode1", "Orchestrator for LRP optimization network version 1.")]
+  [StorableClass]
+  public sealed class LrpOrchestratorNode1 : LrpOrchestratorNode {
+    [StorableConstructor]
+    private LrpOrchestratorNode1(bool deserializing) : base(deserializing) { }
+    private LrpOrchestratorNode1(LrpOrchestratorNode1 original, Cloner cloner) : base(original, cloner) { }
+    public LrpOrchestratorNode1() : this("LrpOrchestratorNode1") { }
+    public LrpOrchestratorNode1(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MinimizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      FlpSolverOrchestrationPort = CreateOrchestrationPort<FacilityLocationProblem>(FlpSolverName + OrchestrationPortNameSuffix);
+      VrpSolverOrchestrationPort = CreateOrchestrationPort<VehicleRoutingProblem>(VrpSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpOrchestratorNode1(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MinimizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = nrOfCustomers * 2;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var flp = (FacilityLocationProblem)FlpParameter.Value.Clone();
+      var cc = (double[,])customerCoordinates.Clone();
+      for (int i = 0; i < nrOfCustomers; i++) {
+        cc[i, 0] = cc[i, 0] * factors[i * 2];
+        cc[i, 1] = cc[i, 1] * factors[i * 2 + 1];
+      }
+      flp.DeliveryCostsParameter.Value = new DoubleMatrix(LrpUtils.GetFlpDeliveryCosts(depotCoordinates, cc, distanceType));
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      flpMsg["Problem"] = flp;
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var flpResults = (ResultCollection)flpMsg["Results"];
+      var bestFlpSolution = (IntegerVector)flpResults["Best Solution"].Value;
+      var flpSolution = FlpParameter.Value.GetSolution(bestFlpSolution);
+
+      var depots = bestFlpSolution.Select((x, i) => Tuple.Create(x, i)).GroupBy(x => x.Item1, x => x.Item2);
+      var vrpSolutions = new ResultCollection(depots.Count());
+      foreach (var depot in depots.OrderBy(x => x.Key)) {
+        var depotIdx = depot.Key;
+        var customers = depot.ToArray();
+
+        var vrp = (VehicleRoutingProblem)VrpParameter.Value.Clone();
+        var vrpInstance = (CVRPProblemInstance)vrp.ProblemInstance;
+        var coordinates = LrpUtils.GetVrpCoordinates(depotCoordinates, customerCoordinates, new[] { depotIdx }, customers);
+        var distances = LrpUtils.GetVrpDistances(coordinates, distanceType);
+        vrpInstance.Coordinates = new DoubleMatrix(coordinates);
+        vrpInstance.DistanceMatrix = new DoubleMatrix(distances);
+        vrpInstance.Demand = new DoubleArray(new[] { 0.0 }.Concat(customers.Select(x => customerDemands[x])).ToArray());
+        vrpInstance.Vehicles.Value = customers.Length;
+
+        var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+        vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+        vrpMsg["Problem"] = vrp;
+        VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+        cts.Token.ThrowIfCancellationRequested();
+
+        var vrpResults = (ResultCollection)vrpMsg["Results"];
+        IResult bestVrpSolutionResult;
+        if (!vrpResults.TryGetValue("Best valid VRP Solution", out bestVrpSolutionResult)
+         && !vrpResults.TryGetValue("Best VRP Solution", out bestVrpSolutionResult)) {
+          // no best solution found ... throw?
+        }
+        var bestVrpSolution = (VRPSolution)bestVrpSolutionResult.Value.Clone();
+        vrpSolutions.Add(new Result("Depot " + depot.Key, bestVrpSolution));
+      }
+
+      #region Analyze
+      double objectiveValue = LrpUtils.Evaluate(flpSolution, vrpSolutions.Select(x => (VRPSolution)x.Value).ToArray());
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best LRP Quality", out bestQuality)) {
+        Results.Add(new Result("Best LRP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best FLP Solution", flpSolution));
+        Results.Add(new Result("Best VRP Solutions", vrpSolutions));
+      } else if (objectiveValue < ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best FLP Solution"].Value = flpSolution;
+        Results["Best VRP Solutions"].Value = vrpSolutions;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode2.cs	(revision 15895)
@@ -0,0 +1,140 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode2", "Orchestrator for LRP optimization network version 2.")]
+  [StorableClass]
+  public sealed class LrpOrchestratorNode2 : LrpOrchestratorNode {
+    [StorableConstructor]
+    private LrpOrchestratorNode2(bool deserializing) : base(deserializing) { }
+    private LrpOrchestratorNode2(LrpOrchestratorNode2 original, Cloner cloner) : base(original, cloner) { }
+    public LrpOrchestratorNode2() : this("LrpOrchestratorNode2") { }
+    public LrpOrchestratorNode2(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MinimizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      FlpSolverOrchestrationPort = CreateOrchestrationPort<FacilityLocationProblem>(FlpSolverName + OrchestrationPortNameSuffix);
+      VrpSolverOrchestrationPort = CreateOrchestrationPort<VehicleRoutingProblem>(VrpSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpOrchestratorNode2(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MinimizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = nrOfDepots * 2;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var flp = (FacilityLocationProblem)FlpParameter.Value.Clone();
+      var dc = (double[,])depotCoordinates.Clone();
+      for (int i = 0; i < nrOfDepots; i++) {
+        dc[i, 0] = dc[i, 0] * factors[i * 2];
+        dc[i, 1] = dc[i, 1] * factors[i * 2 + 1];
+      }
+      flp.DeliveryCostsParameter.Value = new DoubleMatrix(LrpUtils.GetFlpDeliveryCosts(dc, customerCoordinates, distanceType));
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      flpMsg["Problem"] = flp;
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var flpResults = (ResultCollection)flpMsg["Results"];
+      var bestFlpSolution = (IntegerVector)flpResults["Best Solution"].Value;
+      var flpSolution = FlpParameter.Value.GetSolution(bestFlpSolution);
+
+      var depots = bestFlpSolution.Select((x, i) => Tuple.Create(x, i)).GroupBy(x => x.Item1, x => x.Item2);
+      var vrpSolutions = new ResultCollection(depots.Count());
+      foreach (var depot in depots.OrderBy(x => x.Key)) {
+        var depotIdx = depot.Key;
+        var customers = depot.ToArray();
+
+        var vrp = (VehicleRoutingProblem)VrpParameter.Value.Clone();
+        var vrpInstance = (CVRPProblemInstance)vrp.ProblemInstance;
+        var coordinates = LrpUtils.GetVrpCoordinates(depotCoordinates, customerCoordinates, new[] { depotIdx }, customers);
+        var distances = LrpUtils.GetVrpDistances(coordinates, distanceType);
+        vrpInstance.Coordinates = new DoubleMatrix(coordinates);
+        vrpInstance.DistanceMatrix = new DoubleMatrix(distances);
+        vrpInstance.Demand = new DoubleArray(new[] { 0.0 }.Concat(customers.Select(x => customerDemands[x])).ToArray());
+        vrpInstance.Vehicles.Value = customers.Length;
+
+        var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+        vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+        vrpMsg["Problem"] = vrp;
+        VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+        cts.Token.ThrowIfCancellationRequested();
+
+        var vrpResults = (ResultCollection)vrpMsg["Results"];
+        IResult bestVrpSolutionResult;
+        if (!vrpResults.TryGetValue("Best valid VRP Solution", out bestVrpSolutionResult)
+         && !vrpResults.TryGetValue("Best VRP Solution", out bestVrpSolutionResult)) {
+          // no best solution found ... throw?
+        }
+        var bestVrpSolution = (VRPSolution)bestVrpSolutionResult.Value.Clone();
+        vrpSolutions.Add(new Result("Depot " + depot.Key, bestVrpSolution));
+      }
+
+      #region Analyze
+      double objectiveValue = LrpUtils.Evaluate(flpSolution, vrpSolutions.Select(x => (VRPSolution)x.Value).ToArray());
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best LRP Quality", out bestQuality)) {
+        Results.Add(new Result("Best LRP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best FLP Solution", flpSolution));
+        Results.Add(new Result("Best VRP Solutions", vrpSolutions));
+      } else if (objectiveValue < ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best FLP Solution"].Value = flpSolution;
+        Results["Best VRP Solutions"].Value = vrpSolutions;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode3.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode3.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode3.cs	(revision 15895)
@@ -0,0 +1,192 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode3", "Orchestrator for LRP optimization network version 3.")]
+  [StorableClass]
+  public sealed class LrpOrchestratorNode3 : LrpOrchestratorNode {
+    [StorableConstructor]
+    private LrpOrchestratorNode3(bool deserializing) : base(deserializing) { }
+    private LrpOrchestratorNode3(LrpOrchestratorNode3 original, Cloner cloner) : base(original, cloner) { }
+    public LrpOrchestratorNode3() : this("LrpOrchestratorNode3") { }
+    public LrpOrchestratorNode3(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MinimizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      FlpSolverOrchestrationPort = CreateOrchestrationPort<FacilityLocationProblem>(FlpSolverName + OrchestrationPortNameSuffix);
+      VrpSolverOrchestrationPort = CreateOrchestrationPort<VehicleRoutingProblem>(VrpSolverName + OrchestrationPortNameSuffix);
+
+      VrpParameter.Value.ProblemInstance = new MDCVRPProblemInstance();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpOrchestratorNode3(this, cloner);
+    }
+
+    protected override void InstanceParameter_Value_ToStringChanged(object sender, EventArgs e) {
+      string filePath = InstanceParameter.Value.Value;
+      LrpUtils.Import(filePath, out nrOfDepots, out nrOfCustomers,
+                                out depotCoordinates, out customerCoordinates,
+                                out distanceType,
+                                out depotCapacities, out customerDemands, out depotCosts,
+                                out vehicleCapacity, out vehicleCost);
+
+      var flp = FlpParameter.Value;
+      flp.CustomerDemandsParameter.Value = new DoubleArray(customerDemands);
+      flp.DeliveryCostsParameter.Value = new DoubleMatrix(LrpUtils.GetFlpDeliveryCosts(depotCoordinates, customerCoordinates, distanceType));
+      flp.DepotCapacitiesParameter.Value = new DoubleArray(depotCapacities);
+      flp.Encoding.Length = nrOfCustomers;
+      flp.OpeningCostsParameter.Value = new DoubleArray(depotCosts);
+
+      var vrpInstance = (MDCVRPProblemInstance)VrpParameter.Value.ProblemInstance;
+      vrpInstance.Demand = new DoubleArray(customerDemands);
+      vrpInstance.FleetUsageFactor.Value = vehicleCost;
+      vrpInstance.OverloadPenalty.Value = vehicleCost * 1000.0;
+
+      var crossover = VrpParameter.Value.OperatorsParameter.Value.OfType<MultiVRPSolutionCrossover>().Single(x => x.Name == "MultiVRPSolutionCrossover");
+      foreach (var c in crossover.Operators)
+        crossover.Operators.SetItemCheckedState(c, c.Name.StartsWith("Potvin"));
+      var mutator = VrpParameter.Value.OperatorsParameter.Value.OfType<MultiVRPSolutionManipulator>().Single(x => x.Name == "MultiVRPSolutionManipulator");
+      foreach (var m in mutator.Operators)
+        mutator.Operators.SetItemCheckedState(m, Regex.IsMatch(m.Name, @"Potvin(One|Two).*"));
+
+      Prepare();
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MinimizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = nrOfDepots;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var flp = (FacilityLocationProblem)FlpParameter.Value.Clone();
+      var dc = (double[])depotCosts.Clone();
+      for (int i = 0; i < nrOfDepots; i++)
+        dc[i] = dc[i] * factors[i];
+      flp.OpeningCostsParameter.Value = new DoubleArray(dc);
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      flpMsg["Problem"] = flp;
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var flpResults = (ResultCollection)flpMsg["Results"];
+      var bestFlpSolution = (IntegerVector)flpResults["Best Solution"].Value;
+      var flpSolution = FlpParameter.Value.GetSolution(bestFlpSolution);
+
+      var depots = new HashSet<int>(bestFlpSolution).OrderBy(x => x).ToArray();
+      var customers = Enumerable.Range(0, bestFlpSolution.Length).ToArray();
+
+      var vrp = (VehicleRoutingProblem)VrpParameter.Value.Clone();
+      var vrpInstance = (MDCVRPProblemInstance)vrp.ProblemInstance;
+      var coordinates = LrpUtils.GetVrpCoordinates(depotCoordinates, customerCoordinates, depots, customers);
+      var distances = LrpUtils.GetVrpDistances(coordinates, distanceType);
+
+      var capacities = new Dictionary<int, double[]>();
+      for (int i = 0; i < depots.Length; i++) {
+        double depotCapacity = depotCapacities[depots[i]];
+        double nrOfVehicles = depotCapacity / vehicleCapacity;
+        int nrOfTotalVehicles = (int)Math.Ceiling(nrOfVehicles);
+        int nrOfFullVehicles = (int)Math.Floor(nrOfVehicles);
+        double[] vehicleCapacities = Enumerable.Repeat(vehicleCapacity, nrOfTotalVehicles).ToArray();
+        if (nrOfFullVehicles < nrOfTotalVehicles)
+          vehicleCapacities[nrOfTotalVehicles - 1] = depotCapacity - nrOfFullVehicles * vehicleCapacity;
+        capacities.Add(i, vehicleCapacities);
+      }
+
+      vrpInstance.Capacity = new DoubleArray(capacities.OrderBy(x => x.Key).SelectMany(x => x.Value).ToArray());
+      vrpInstance.Coordinates = new DoubleMatrix(coordinates);
+      vrpInstance.Depots.Value = depots.Length;
+      vrpInstance.DistanceMatrix = new DoubleMatrix(distances);
+      vrpInstance.VehicleDepotAssignment = new IntArray(capacities.OrderBy(x => x.Key).SelectMany((x, i) => Enumerable.Repeat(i, x.Value.Length)).ToArray());
+      vrpInstance.Vehicles.Value = vrpInstance.VehicleDepotAssignment.Length;
+
+      var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+      vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      vrpMsg["Problem"] = vrp;
+      VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var vrpResults = (ResultCollection)vrpMsg["Results"];
+      IResult bestVrpSolutionResult;
+      if (!vrpResults.TryGetValue("Best valid VRP Solution", out bestVrpSolutionResult)
+       && !vrpResults.TryGetValue("Best VRP Solution", out bestVrpSolutionResult)) {
+        // no best solution found ... throw?
+      }
+      var vrpSolution = (VRPSolution)bestVrpSolutionResult.Value.Clone();
+
+      #region Analyze
+      double objectiveValue = LrpUtils.Evaluate(flpSolution, new[] { vrpSolution });
+      bool[] usedDepots = new bool[depots.Length];
+      foreach (var tour in vrpSolution.Solution.GetTours()) {
+        int tourIdx = vrpSolution.Solution.GetTourIndex(tour);
+        int vehicleIdx = vrpSolution.Solution.GetVehicleAssignment(tourIdx);
+        int depotIdx = vrpInstance.VehicleDepotAssignment[vehicleIdx];
+        usedDepots[depotIdx] = true;
+      }
+      for (int i = 0; i < usedDepots.Length; i++)
+        if (!usedDepots[i]) objectiveValue -= flpSolution.OpeningCosts[depots[i]];
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best LRP Quality", out bestQuality)) {
+        Results.Add(new Result("Best LRP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best FLP Solution", flpSolution));
+        Results.Add(new Result("Best VRP Solution", vrpSolution));
+      } else if (objectiveValue < ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best FLP Solution"].Value = flpSolution;
+        Results["Best VRP Solution"].Value = vrpSolution;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode4.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode4.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode4.cs	(revision 15895)
@@ -0,0 +1,138 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode4", "Orchestrator for LRP optimization network version 4.")]
+  [StorableClass]
+  public sealed class LrpOrchestratorNode4 : LrpOrchestratorNode {
+    [StorableConstructor]
+    private LrpOrchestratorNode4(bool deserializing) : base(deserializing) { }
+    private LrpOrchestratorNode4(LrpOrchestratorNode4 original, Cloner cloner) : base(original, cloner) { }
+    public LrpOrchestratorNode4() : this("LrpOrchestratorNode4") { }
+    public LrpOrchestratorNode4(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MinimizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      FlpSolverOrchestrationPort = CreateOrchestrationPort<FacilityLocationProblem>(FlpSolverName + OrchestrationPortNameSuffix);
+      VrpSolverOrchestrationPort = CreateOrchestrationPort<VehicleRoutingProblem>(VrpSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpOrchestratorNode4(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MinimizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = nrOfDepots;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var flp = (FacilityLocationProblem)FlpParameter.Value.Clone();
+      var dc = (double[])depotCosts.Clone();
+      for (int i = 0; i < nrOfDepots; i++)
+        dc[i] = dc[i] * factors[i];
+      flp.OpeningCostsParameter.Value = new DoubleArray(dc);
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      flpMsg["Problem"] = flp;
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var flpResults = (ResultCollection)flpMsg["Results"];
+      var bestFlpSolution = (IntegerVector)flpResults["Best Solution"].Value;
+      var flpSolution = FlpParameter.Value.GetSolution(bestFlpSolution);
+
+      var depots = bestFlpSolution.Select((x, i) => Tuple.Create(x, i)).GroupBy(x => x.Item1, x => x.Item2);
+      var vrpSolutions = new ResultCollection(depots.Count());
+      foreach (var depot in depots.OrderBy(x => x.Key)) {
+        var depotIdx = depot.Key;
+        var customers = depot.ToArray();
+
+        var vrp = (VehicleRoutingProblem)VrpParameter.Value.Clone();
+        var vrpInstance = (CVRPProblemInstance)vrp.ProblemInstance;
+        var coordinates = LrpUtils.GetVrpCoordinates(depotCoordinates, customerCoordinates, new[] { depotIdx }, customers);
+        var distances = LrpUtils.GetVrpDistances(coordinates, distanceType);
+        vrpInstance.Coordinates = new DoubleMatrix(coordinates);
+        vrpInstance.DistanceMatrix = new DoubleMatrix(distances);
+        vrpInstance.Demand = new DoubleArray(new[] { 0.0 }.Concat(customers.Select(x => customerDemands[x])).ToArray());
+        vrpInstance.Vehicles.Value = customers.Length;
+
+        var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+        vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+        vrpMsg["Problem"] = vrp;
+        VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+        cts.Token.ThrowIfCancellationRequested();
+
+        var vrpResults = (ResultCollection)vrpMsg["Results"];
+        IResult bestVrpSolutionResult;
+        if (!vrpResults.TryGetValue("Best valid VRP Solution", out bestVrpSolutionResult)
+         && !vrpResults.TryGetValue("Best VRP Solution", out bestVrpSolutionResult)) {
+          // no best solution found ... throw?
+        }
+        var bestVrpSolution = (VRPSolution)bestVrpSolutionResult.Value.Clone();
+        vrpSolutions.Add(new Result("Depot " + depot.Key, bestVrpSolution));
+      }
+
+      #region Analyze
+      double objectiveValue = LrpUtils.Evaluate(flpSolution, vrpSolutions.Select(x => (VRPSolution)x.Value).ToArray());
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best LRP Quality", out bestQuality)) {
+        Results.Add(new Result("Best LRP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best FLP Solution", flpSolution));
+        Results.Add(new Result("Best VRP Solutions", vrpSolutions));
+      } else if (objectiveValue < ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best FLP Solution"].Value = flpSolution;
+        Results["Best VRP Solutions"].Value = vrpSolutions;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode5.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode5.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpOrchestratorNode5.cs	(revision 15895)
@@ -0,0 +1,172 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  [Item("LrpOrchestratorNode5", "Orchestrator for LRP optimization network version 5.")]
+  [StorableClass]
+  public sealed class LrpOrchestratorNode5 : LrpOrchestratorNode {
+    [StorableConstructor]
+    private LrpOrchestratorNode5(bool deserializing) : base(deserializing) { }
+    private LrpOrchestratorNode5(LrpOrchestratorNode5 original, Cloner cloner) : base(original, cloner) { }
+    public LrpOrchestratorNode5() : this("LrpOrchestratorNode5") { }
+    public LrpOrchestratorNode5(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MinimizationVariegationProblem<BinaryVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<BinaryVector>(MetaSolverName + EvaluationPortNameSuffix, "BinaryVector", "Quality");
+      FlpSolverOrchestrationPort = CreateOrchestrationPort<FacilityLocationProblem>(FlpSolverName + OrchestrationPortNameSuffix);
+      VrpSolverOrchestrationPort = CreateOrchestrationPort<VehicleRoutingProblem>(VrpSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LrpOrchestratorNode5(this, cloner);
+    }
+
+    protected override void MetaSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (MetaSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = MetaSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      var hook = new HookOperator { Name = "Meta Eval Hook" };
+      hook.Parameters.Add(new LookupParameter<BinaryVector>("BinaryVector") { Hidden = true });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = true });
+      node.EvalHook = hook;
+
+      node.OrchestrationPort.CloneParametersFromPort(MetaSolverOrchestrationPort);
+      node.EvaluationPort.CloneParametersFromPort(MetaSolverEvaluationPort);
+      node.EvaluationPort.ConnectedPort = MetaSolverEvaluationPort;
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MinimizationVariegationProblem<BinaryVectorEncoding>();
+      problem.Encoding.Length = nrOfDepots;
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var selection = (BinaryVector)message["BinaryVector"];
+      var inverse = selection.Select((x, i) => Tuple.Create(x, i)).Where(x => x.Item1).Select(x => x.Item2).ToArray();
+      if (!inverse.Any()) {
+        ((DoubleValue)message["Quality"]).Value = double.MaxValue;
+        return;
+      }
+
+      var flp = (FacilityLocationProblem)FlpParameter.Value.Clone();
+      double[,] newDepotCoordinates = new double[inverse.Length, 2];
+      double[] newDepotCosts = new double[inverse.Length];
+      double[] newDepotCapacities = new double[inverse.Length];
+
+      int newIdx = 0;
+      for (int oldIdx = 0; oldIdx < selection.Length; oldIdx++) {
+        if (!selection[oldIdx]) continue;
+        newDepotCoordinates[newIdx, 0] = depotCoordinates[oldIdx, 0];
+        newDepotCoordinates[newIdx, 1] = depotCoordinates[oldIdx, 1];
+        newDepotCosts[newIdx] = depotCosts[oldIdx];
+        newDepotCapacities[newIdx] = depotCapacities[oldIdx];
+        ++newIdx;
+      }
+      flp.OpeningCostsParameter.Value = new DoubleArray(newDepotCosts);
+      flp.DepotCapacitiesParameter.Value = new DoubleArray(newDepotCapacities);
+      flp.DeliveryCostsParameter.Value = new DoubleMatrix(LrpUtils.GetFlpDeliveryCosts(newDepotCoordinates, customerCoordinates, distanceType));
+
+      var flpMsg = FlpSolverOrchestrationPort.PrepareMessage();
+      flpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      flpMsg["Problem"] = flp;
+      FlpSolverOrchestrationPort.SendMessage(flpMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var flpResults = (ResultCollection)flpMsg["Results"];
+      var bestFlpSolution = (IntegerVector)flpResults["Best Solution"].Value;
+      var flpSolution = flp.GetSolution(bestFlpSolution);
+
+      var depots = bestFlpSolution.Select((x, i) => Tuple.Create(inverse[x], i)).GroupBy(x => x.Item1, x => x.Item2);
+      var vrpSolutions = new ResultCollection(depots.Count());
+      foreach (var depot in depots.OrderBy(x => x.Key)) {
+        var depotIdx = depot.Key;
+        var customers = depot.ToArray();
+
+        var vrp = (VehicleRoutingProblem)VrpParameter.Value.Clone();
+        var vrpInstance = (CVRPProblemInstance)vrp.ProblemInstance;
+        var coordinates = LrpUtils.GetVrpCoordinates(depotCoordinates, customerCoordinates, new[] { depotIdx }, customers);
+        var distances = LrpUtils.GetVrpDistances(coordinates, distanceType);
+        vrpInstance.Coordinates = new DoubleMatrix(coordinates);
+        vrpInstance.DistanceMatrix = new DoubleMatrix(distances);
+        vrpInstance.Demand = new DoubleArray(new[] { 0.0 }.Concat(customers.Select(x => customerDemands[x])).ToArray());
+        vrpInstance.Vehicles.Value = customers.Length;
+
+        var vrpMsg = VrpSolverOrchestrationPort.PrepareMessage();
+        vrpMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+        vrpMsg["Problem"] = vrp;
+        VrpSolverOrchestrationPort.SendMessage(vrpMsg);
+        cts.Token.ThrowIfCancellationRequested();
+
+        var vrpResults = (ResultCollection)vrpMsg["Results"];
+        IResult bestVrpSolutionResult;
+        if (!vrpResults.TryGetValue("Best valid VRP Solution", out bestVrpSolutionResult)
+         && !vrpResults.TryGetValue("Best VRP Solution", out bestVrpSolutionResult)) {
+          // no best solution found ... throw?
+        }
+        var bestVrpSolution = (VRPSolution)bestVrpSolutionResult.Value.Clone();
+        vrpSolutions.Add(new Result("Depot " + depot.Key, bestVrpSolution));
+      }
+
+      #region Analyze
+      double objectiveValue = LrpUtils.Evaluate(flpSolution, vrpSolutions.Select(x => (VRPSolution)x.Value).ToArray());
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best LRP Quality", out bestQuality)) {
+        Results.Add(new Result("Best LRP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best FLP Solution", flpSolution));
+        Results.Add(new Result("Best VRP Solutions", vrpSolutions));
+      } else if (objectiveValue < ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best FLP Solution"].Value = flpSolution;
+        Results["Best VRP Solutions"].Value = vrpSolutions;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpUtils.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpUtils.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/LrpUtils.cs	(revision 15895)
@@ -0,0 +1,175 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Problems.FacilityLocation;
+using HeuristicLab.Problems.VehicleRouting;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.LocationRouting {
+  public static class LrpUtils {
+    public enum DistanceType {
+      Unknown = int.MinValue,
+      CEIL_2D = 0,
+      EUC_2D = 1,
+    }
+
+    public static readonly Dictionary<DistanceType, Func<double[,], int, double[,], int, double>> DistanceFuncs;
+
+    static LrpUtils() {
+      DistanceFuncs = new Dictionary<DistanceType, Func<double[,], int, double[,], int, double>>();
+      DistanceFuncs.Add(DistanceType.EUC_2D, (d, i, c, j) => Math.Sqrt(Math.Pow(d[i, 0] - c[j, 0], 2.0) + Math.Pow(d[i, 1] - c[j, 1], 2.0)));
+      DistanceFuncs.Add(DistanceType.CEIL_2D, (d, i, c, j) => Math.Ceiling(DistanceFuncs[DistanceType.EUC_2D](d, i, c, j) * 100));
+    }
+
+    public static void Import(string filePath, out int nrOfDepots,
+                                               out int nrOfCustomers,
+                                               out double[,] depotCoordinates,
+                                               out double[,] customerCoordinates,
+                                               out DistanceType distanceType,
+                                               out double[] depotCapacities,
+                                               out double[] customerDemands,
+                                               out double[] depotCosts,
+                                               out double vehicleCapacity,
+                                               out double vehicleCost) {
+      nrOfDepots = 0; nrOfCustomers = 0;
+      depotCoordinates = new double[0, 0]; customerCoordinates = new double[0, 0];
+      distanceType = DistanceType.Unknown;
+      depotCapacities = new double[0]; customerDemands = new double[0]; depotCosts = new double[0];
+      vehicleCapacity = 0.0; vehicleCost = 0.0;
+
+      int dataIndex = 0;
+
+      using (var fs = new FileStream(filePath, FileMode.Open))
+      using (var sr = new StreamReader(fs)) {
+        string input;
+        while ((input = sr.ReadLine()) != null) {
+          int commentCol = input.IndexOf("//");
+          input = input.Substring(0, commentCol >= 0 ? commentCol : input.Length);
+
+          if (string.IsNullOrEmpty(input)) continue;
+
+          switch (dataIndex) {
+            case 0:
+              int.TryParse(input, out nrOfCustomers);
+              customerCoordinates = new double[nrOfCustomers, 2];
+              customerDemands = new double[nrOfCustomers];
+              ++dataIndex;
+              break;
+            case 1:
+              int.TryParse(input, out nrOfDepots);
+              depotCoordinates = new double[nrOfDepots, 2];
+              depotCapacities = new double[nrOfDepots];
+              depotCosts = new double[nrOfDepots];
+              ++dataIndex;
+              break;
+            case 2:
+              for (int i = 0; i < nrOfDepots; i++) {
+                string[] coords = input.Split('\t');
+                double x; double.TryParse(coords[0], out x);
+                double y; double.TryParse(coords[1], out y);
+                depotCoordinates[i, 0] = x;
+                depotCoordinates[i, 1] = y;
+                if (i < nrOfDepots - 1)
+                  input = sr.ReadLine();
+              }
+              ++dataIndex;
+              break;
+            case 3:
+              for (int i = 0; i < nrOfCustomers; i++) {
+                string[] coords = input.Split('\t');
+                double x; double.TryParse(coords[0], out x);
+                double y; double.TryParse(coords[1], out y);
+                customerCoordinates[i, 0] = x;
+                customerCoordinates[i, 1] = y;
+                if (i < nrOfCustomers - 1)
+                  input = sr.ReadLine();
+              }
+              ++dataIndex;
+              break;
+            case 4:
+              double.TryParse(input, out vehicleCapacity); ++dataIndex;
+              break;
+            case 5:
+              for (int i = 0; i < nrOfDepots; i++) {
+                double capacity; double.TryParse(input, out capacity);
+                depotCapacities[i] = capacity;
+                if (i < nrOfDepots - 1)
+                  input = sr.ReadLine();
+              }
+              ++dataIndex;
+              break;
+            case 6:
+              for (int i = 0; i < nrOfCustomers; i++) {
+                double demand; double.TryParse(input, out demand);
+                customerDemands[i] = demand;
+                if (i < nrOfCustomers - 1)
+                  input = sr.ReadLine();
+              }
+              ++dataIndex;
+              break;
+            case 7:
+              for (int i = 0; i < nrOfDepots; i++) {
+                double cost; double.TryParse(input, out cost);
+                depotCosts[i] = cost;
+                if (i < nrOfDepots - 1)
+                  input = sr.ReadLine();
+              }
+              ++dataIndex;
+              break;
+            case 8: double.TryParse(input, out vehicleCost); ++dataIndex; break;
+            case 9: Enum.TryParse(input, out distanceType); break;
+          }
+        }
+      }
+    }
+
+    public static double[,] GetFlpDeliveryCosts(double[,] depotCoordinates, double[,] customerCoordinates, DistanceType distanceType) {
+      int nrOfDepots = depotCoordinates.GetLength(0), nrOfCustomers = customerCoordinates.GetLength(0);
+      var deliveryCosts = new double[nrOfDepots, nrOfCustomers];
+
+      for (int i = 0; i < nrOfDepots; i++)
+        for (int j = 0; j < nrOfCustomers; j++)
+          deliveryCosts[i, j] = DistanceFuncs[distanceType](depotCoordinates, i, customerCoordinates, j);
+
+      return deliveryCosts;
+    }
+
+    public static double[,] GetVrpCoordinates(double[,] depotCoordinates, double[,] customerCoordinates, int[] depots, int[] customers) {
+      var coordinates = new double[depots.Length + customers.Length, 2];
+
+      for (int i = 0; i < depots.Length; i++) {
+        coordinates[i, 0] = depotCoordinates[depots[i], 0];
+        coordinates[i, 1] = depotCoordinates[depots[i], 1];
+      }
+      for (int i = 0; i < customers.Length; i++) {
+        coordinates[i + depots.Length, 0] = customerCoordinates[customers[i], 0];
+        coordinates[i + depots.Length, 1] = customerCoordinates[customers[i], 1];
+      }
+
+      return coordinates;
+    }
+
+    public static double[,] GetVrpDistances(double[,] depotCoordinates, double[,] customerCoordinates, int[] depots, int[] customers, DistanceType distanceType) {
+      var coordinates = GetVrpCoordinates(depotCoordinates, customerCoordinates, depots, customers);
+      return GetVrpDistances(coordinates, distanceType);
+    }
+
+    public static double[,] GetVrpDistances(double[,] coordinates, DistanceType distanceType) {
+      int nrOfNodes = coordinates.GetLength(0);
+      var distances = new double[nrOfNodes, nrOfNodes];
+
+      for (int i = 1; i < nrOfNodes; i++)
+        for (int j = 0; j < i; j++)
+          distances[i, j] = distances[j, i] = DistanceFuncs[distanceType](coordinates, i, coordinates, j);
+
+      return distances;
+    }
+
+    public static double Evaluate(FacilityLocationSolution flpSolution, VRPSolution[] vrpSolutions) {
+      if (flpSolution.TotalOverbookedCapacityParameter.Value.Value > 0.0)
+        return flpSolution.FitnessValueParameter.Value.Value + vrpSolutions.Sum(x => x.Quality.Value);
+      else
+        return flpSolution.TotalOpeningCostsParameter.Value.Value + vrpSolutions.Sum(x => x.Quality.Value);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Networks.IntegratedOptimization.LocationRouting {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.IntegratedOptimization.LocationRouting plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.IntegratedOptimization.LocationRouting", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Algorithms.CMAEvolutionStrategy", "3.4")]
+  [PluginDependency("HeuristicLab.Algorithms.GeneticAlgorithm", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.IntegratedOptimization", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.FacilityLocation", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.FacilityLocation.CplexSolver", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.VehicleRouting", "3.4")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public class HeuristicLabNetworksIntegratedOptimizationLocationRoutingPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.LocationRouting/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Networks.IntegratedOptimization.LocationRouting")]
+[assembly: AssemblyDescription("Classes for integrated optimization of the Location Routing Problem")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeursiticLab")]
+[assembly: AssemblyCopyright("(c) 2002-2017 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("b364f111-5c05-4b28-9a29-f6a50e539003")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionNetwork.cs	(revision 15895)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.MachineLearning {
+  [Item("Feature Selection Network 2", "")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class FeatureSelectionNetwork : Network {
+    [StorableConstructor]
+    private FeatureSelectionNetwork(bool deserializing) : base(deserializing) { }
+
+    private FeatureSelectionNetwork(FeatureSelectionNetwork original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FeatureSelectionNetwork(this, cloner);
+    }
+
+    [Storable]
+    private readonly OrchestratedAlgorithmNode FeatureSelectionAlgorithmNode;
+    [Storable]
+    private readonly OrchestratedAlgorithmNode RegressionAlgorithmNode;
+    [Storable]
+    private readonly FeatureSelectionOrchestrator Orchestrator;
+
+    public FeatureSelectionNetwork()
+      : base() {
+      Orchestrator = new FeatureSelectionOrchestrator(this);
+      Nodes.Add(Orchestrator);
+
+      var featureSelectionAlgorithm = CreateFeatureSelectionAlgorithm();
+      //TODO configure FeatureSelectionProblem
+
+      FeatureSelectionAlgorithmNode = new OrchestratedAlgorithmNode("Feature Selection");
+      FeatureSelectionAlgorithmNode.Algorithm = featureSelectionAlgorithm;
+      FeatureSelectionAlgorithmNode.EvaluationPort.ConnectedPort = Orchestrator.FeatureSelectionEvaluationPort;
+      FeatureSelectionAlgorithmNode.EvaluationPort.CloneParametersFromPort(Orchestrator.FeatureSelectionEvaluationPort);
+      Nodes.Add(FeatureSelectionAlgorithmNode);
+
+      var regressionAlgorithm = CreateRegressionAlgorithm();
+      RegressionAlgorithmNode = new OrchestratedAlgorithmNode("Regression");
+      RegressionAlgorithmNode.Algorithm = regressionAlgorithm;
+      Orchestrator.RegressionOrchestrationPort.ConnectedPort = RegressionAlgorithmNode.OrchestrationPort;
+      RegressionAlgorithmNode.OrchestrationPort.CloneParametersFromPort(Orchestrator.RegressionOrchestrationPort);
+      Nodes.Add(RegressionAlgorithmNode);
+    }
+
+    private IAlgorithm CreateFeatureSelectionAlgorithm() {
+      var problem = new OrchestratedBinaryProblem(Orchestrator, 0, false);
+      problem.Encoding.SolutionCreator = new RandomBinaryVectorCreator() { TrueProbability = new DoubleValue(0.2) };
+
+      var osga = new OffspringSelectionGeneticAlgorithm();
+      osga.Problem = problem;
+      osga.PopulationSize.Value = 100;
+      osga.ComparisonFactorLowerBound.Value = 1;
+      osga.ComparisonFactorUpperBound.Value = 1;
+      osga.SuccessRatio.Value = 1.0;
+      osga.MutationProbability.Value = 0.15;
+      osga.Mutator = osga.MutatorParameter.ValidValues.OfType<SomePositionsBitflipManipulator>().First();
+      return osga;
+    }
+
+    private static IAlgorithm CreateRegressionAlgorithm() {
+      var linreg = new LinearRegression();
+      return linreg;
+    }
+
+
+    public void Prepare() { Prepare(false); }
+    public void Prepare(bool clearRuns) {
+      var msg = FeatureSelectionAlgorithmNode.OrchestrationPort.PrepareMessage();
+      if (clearRuns)
+        msg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns);
+      else
+        msg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare);
+      FeatureSelectionAlgorithmNode.OrchestrationPort.ReceiveMessage(msg, new CancellationToken());
+    }
+
+    public void Start() {
+      var problem = (OrchestratedBinaryProblem)FeatureSelectionAlgorithmNode.Algorithm.Problem;
+      problem.Encoding.Length = Orchestrator.RegressionProblemData.AllowedInputVariables.Count();
+
+      var msg = FeatureSelectionAlgorithmNode.OrchestrationPort.PrepareMessage();
+      msg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Start);
+      FeatureSelectionAlgorithmNode.OrchestrationPort.ReceiveMessage(msg, new CancellationToken());
+    }
+    public void Pause() {
+      var msg = FeatureSelectionAlgorithmNode.OrchestrationPort.PrepareMessage();
+      msg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Pause);
+      FeatureSelectionAlgorithmNode.OrchestrationPort.ReceiveMessage(msg, new CancellationToken());
+    }
+    public void Stop() {
+      var msg = FeatureSelectionAlgorithmNode.OrchestrationPort.PrepareMessage();
+      msg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      FeatureSelectionAlgorithmNode.OrchestrationPort.ReceiveMessage(msg, new CancellationToken());
+      RegressionAlgorithmNode.Algorithm.Runs.Clear();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionOrchestrator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionOrchestrator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/FeatureSelectionOrchestrator.cs	(revision 15895)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.MachineLearning {
+  [StorableClass]
+  public sealed class FeatureSelectionOrchestrator : OrchestratorNode {
+    private const string REGRESSION_ORCHESTRATION_PORT_NAME = "Regression algorithm orchestration port";
+    private const string FEATURE_SELECTION_EVALUATION_PORT_NAME = "Feature selection evaluation port";
+    private const string REGRESSION_PROBLEM_PARAMETER_NAME = "Regression Problem Data";
+
+    public IMessagePort RegressionOrchestrationPort {
+      get { return (IMessagePort)Ports[REGRESSION_ORCHESTRATION_PORT_NAME]; }
+    }
+    public IMessagePort FeatureSelectionEvaluationPort {
+      get { return (IMessagePort)Ports[FEATURE_SELECTION_EVALUATION_PORT_NAME]; }
+    }
+
+    public IValueParameter<IRegressionProblemData> ProblemDataParameter {
+      get { return (IValueParameter<IRegressionProblemData>)Parameters[REGRESSION_PROBLEM_PARAMETER_NAME]; }
+    }
+
+    public IRegressionProblemData RegressionProblemData {
+      get { return ProblemDataParameter.Value; }
+      set { ProblemDataParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    private FeatureSelectionOrchestrator(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterPortEvents();
+    }
+
+    private FeatureSelectionOrchestrator(FeatureSelectionOrchestrator original, Cloner cloner)
+      : base(original, cloner) {
+      network = cloner.Clone(original.network);
+      RegisterPortEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new FeatureSelectionOrchestrator(this, cloner); }
+
+    //TODO remove network reference;
+    //TODO move regression problem to network
+    [Storable]
+    private readonly FeatureSelectionNetwork network;
+
+    public FeatureSelectionOrchestrator(FeatureSelectionNetwork network)
+      : base() {
+      var featureSelectionPort = CreateEvaluationPort<BinaryVector>(FEATURE_SELECTION_EVALUATION_PORT_NAME, "BinaryVector", "Quality");
+      Ports.Add(featureSelectionPort);
+
+      var regressionPort = CreateOrchestrationPort<IRegressionProblem>(REGRESSION_ORCHESTRATION_PORT_NAME);
+      Ports.Add(regressionPort);
+
+      this.network = network;
+
+      Parameters.Add(new ValueParameter<IRegressionProblemData>(REGRESSION_PROBLEM_PARAMETER_NAME, "", new RegressionProblemData()));
+      RegisterPortEvents();
+    }
+
+    private void RegisterPortEvents() {
+      FeatureSelectionEvaluationPort.MessageReceived += (s, e) => FeatureSelectionEvaluationPort_MessageReceived(e.Value, e.Value2);
+    }
+
+    private void FeatureSelectionEvaluationPort_MessageReceived(IMessage evaluationMessage, CancellationToken token) {
+      var problemData = (IRegressionProblemData)RegressionProblemData.Clone();
+      var binaryVector = (BinaryVector)evaluationMessage["BinaryVector"];
+      binaryVector.ElementNames = problemData.InputVariables.CheckedItems.Select(variable => variable.Value.Value);
+
+      var allowedVariables = problemData.InputVariables.CheckedItems.Zip(binaryVector,
+        (variable, allowed) => new { VariableName = variable.Value, Allowed = allowed });
+
+      foreach (var allowedVariable in allowedVariables)
+        problemData.InputVariables.SetItemCheckedState(allowedVariable.VariableName, allowedVariable.Allowed);
+
+      var orchestrationMessage = RegressionOrchestrationPort.PrepareMessage();
+      orchestrationMessage["Problem"] = new RegressionProblem() { ProblemData = problemData };
+      orchestrationMessage["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns);
+      RegressionOrchestrationPort.SendMessage(orchestrationMessage, token);
+
+      var startMessage = RegressionOrchestrationPort.PrepareMessage();
+      startMessage["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Start);
+      RegressionOrchestrationPort.SendMessage(startMessage, token);
+
+      var results = (ResultCollection)startMessage["Results"];
+
+      var regressionSolution = results.Select(r => r.Value).OfType<IRegressionSolution>().First();
+      double quality = regressionSolution.TestMeanAbsoluteError;
+
+      UpdatedResults(binaryVector, regressionSolution);
+      evaluationMessage["Quality"] = new DoubleValue(quality);
+    }
+
+    private void UpdatedResults(BinaryVector binaryVector, IRegressionSolution solution) {
+      if (!Results.ContainsKey("Best Vector")) Results.Add(new Result("Best Vector", typeof(BinaryVector)));
+      if (!Results.ContainsKey("Best Solution")) Results.Add(new Result("Best Solution", typeof(IRegressionSolution)));
+
+      var previousBestVector = (BinaryVector)Results["Best Vector"].Value;
+      var prevoiusBestSolution = (IRegressionSolution)Results["Best Solution"].Value;
+
+      //check if better vector & solution has been found
+      if (prevoiusBestSolution != null && prevoiusBestSolution.TestMeanAbsoluteError <= solution.TestMeanAbsoluteError)
+        return;
+
+      Results["Best Vector"].Value = binaryVector;
+      Results["Best Solution"].Value = solution;
+    }
+
+
+    //TODO Remove methods
+    public override void Pause() { network.Pause(); }
+    public override void Prepare(bool clearRuns = false) { network.Prepare(clearRuns); Results.Clear(); }
+    public override void Start() { network.Start(); }
+    public override void Stop() { network.Stop(); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3.csproj	(revision 15895)
@@ -0,0 +1,216 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{F5581DE0-5972-4A73-B1F7-D308068E7CAC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.IntegratedOptimization.MachineLearning</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\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="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Networks-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Networks-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FeatureSelectionNetwork.cs" />
+    <Compile Include="FeatureSelectionOrchestrator.cs" />
+    <Compile Include="OrchestratedBinaryProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj">
+      <Project>{b6263d3e-dcaf-42b0-a440-3deef1ff0429}</Project>
+      <Name>HeuristicLab.Networks.IntegratedOptimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/OrchestratedBinaryProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/OrchestratedBinaryProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/OrchestratedBinaryProblem.cs	(revision 15895)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.MachineLearning {
+  [StorableClass]
+  [Creatable("Optimization Networks")]
+  public sealed class OrchestratedBinaryProblem : SingleObjectiveBasicProblem<BinaryVectorEncoding> {
+
+    [Storable]
+    private readonly bool maximization;
+    public override bool Maximization { get { return maximization; } }
+
+    [Storable]
+    public FeatureSelectionOrchestrator Orchestrator { get; private set; }
+
+    [StorableConstructor]
+    private OrchestratedBinaryProblem(bool deserializing) : base(deserializing) { }
+    private OrchestratedBinaryProblem(OrchestratedBinaryProblem original, Cloner cloner)
+      : base(original, cloner) {
+      this.maximization = original.maximization;
+      this.Orchestrator = cloner.Clone(original.Orchestrator);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrchestratedBinaryProblem(this, cloner);
+    }
+
+    public OrchestratedBinaryProblem(FeatureSelectionOrchestrator orchestator, int binaryVectorLength, bool maximization)
+      : base() {
+      Orchestrator = orchestator;
+      Encoding.Length = binaryVectorLength;
+      this.maximization = maximization;
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var msg = Orchestrator.FeatureSelectionEvaluationPort.PrepareMessage();
+      msg["BinaryVector"] = individual.BinaryVector();
+      Orchestrator.FeatureSelectionEvaluationPort.ReceiveMessage(msg, new CancellationToken());
+      var quality = (DoubleValue)msg["Quality"];
+      return quality.Value;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.MachineLearning {
+  [Plugin("HeuristicLab.Networks.IntegratedOptimization.MachineLearning", "3.3.12.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.IntegratedOptimization.MachineLearning-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  public class HeuristicLabVisualizationPlugin : PluginBase { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.MachineLearning/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Networks.IntegratedOptimization.MachineLearning")]
+[assembly: AssemblyDescription("Optimization Networks for integrated machine learning problems.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2017 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("9497c2aa-515e-411b-a0af-ce439e6cf326")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3.csproj	(revision 15895)
@@ -0,0 +1,216 @@
+﻿<?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>{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.IntegratedOptimization.TravelingThief</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.IntegratedOptimization.TravelingThief-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.CMAEvolutionStrategy-3.4">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.CMAEvolutionStrategy-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.LocalSearch-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.LocalSearch-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Networks-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Networks-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Binary-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Binary-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Knapsack-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Knapsack-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TravelingSalesman-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.TravelingSalesman-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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="Problems\BinaryKnapsackProblem.cs" />
+    <Compile Include="Problems\LootProfitProblem.cs" />
+    <Compile Include="Problems\TourProfitProblem.cs" />
+    <Compile Include="Problems\TravelingThiefProblem.cs" />
+    <Compile Include="TtpNetwork.cs" />
+    <Compile Include="TtpNetwork1.cs" />
+    <Compile Include="TtpNetwork2.cs" />
+    <Compile Include="TtpNetwork3.cs" />
+    <Compile Include="TtpOrchestratorNode.cs" />
+    <Compile Include="TtpOrchestratorNode1.cs" />
+    <Compile Include="TtpOrchestratorNode2.cs" />
+    <Compile Include="TtpOrchestratorNode3.cs" />
+    <Compile Include="TtpUtils.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj">
+      <Project>{b6263d3e-dcaf-42b0-a440-3deef1ff0429}</Project>
+      <Name>HeuristicLab.Networks.IntegratedOptimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Networks.IntegratedOptimization.TravelingThief {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.IntegratedOptimization plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.IntegratedOptimization.TravelingThief", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Algorithms.CMAEvolutionStrategy", "3.4")]
+  [PluginDependency("HeuristicLab.Algorithms.LocalSearch", "3.3")]
+  [PluginDependency("HeuristicLab.Algorithms.ParameterlessPopulationPyramid", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.IntegratedOptimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Binary", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Knapsack", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.TravelingSalesman", "3.3")]
+  public class HeuristicLabNetworksIntegratedOptimizationTravelingThiefPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/BinaryKnapsackProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/BinaryKnapsackProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/BinaryKnapsackProblem.cs	(revision 15895)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("Binary Knapsack Problem (BKSP)", "Represents a problem whose objective is to maximize the number of true values.")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 999)]
+  [StorableClass]
+  public class BinaryKnapsackProblem : BinaryProblem {
+    private const string KnapsackCapacityParameterName = "KnapsackCapacity";
+    private const string WeightsParameterParameterName = "Weights";
+    private const string ValuesParameterParameterName = "Values";
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    #region Parameter Properties
+    public IValueParameter<IntValue> KnapsackCapacityParameter {
+      get { return (IValueParameter<IntValue>)Parameters[KnapsackCapacityParameterName]; }
+    }
+    public IValueParameter<IntArray> WeightsParameter {
+      get { return (IValueParameter<IntArray>)Parameters[WeightsParameterParameterName]; }
+    }
+    public IValueParameter<IntArray> ValuesParameter {
+      get { return (IValueParameter<IntArray>)Parameters[ValuesParameterParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public IntValue KnapsackCapacity {
+      get { return KnapsackCapacityParameter.Value; }
+      set { KnapsackCapacityParameter.Value = value; }
+    }
+    public IntArray Weights {
+      get { return WeightsParameter.Value; }
+      set { WeightsParameter.Value = value; }
+    }
+    public IntArray Values {
+      get { return ValuesParameter.Value; }
+      set { ValuesParameter.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected BinaryKnapsackProblem(bool deserializing) : base(deserializing) { }
+    protected BinaryKnapsackProblem(BinaryKnapsackProblem original, Cloner cloner) : base(original, cloner) { }
+    public BinaryKnapsackProblem() : base() {
+      Encoding.Length = 5;
+      Parameters.Add(new ValueParameter<IntValue>("KnapsackCapacity", "Capacity of the Knapsack.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<IntArray>("Weights", "The weights of the items.", new IntArray(5)));
+      Parameters.Add(new ValueParameter<IntArray>("Values", "The values of the items.", new IntArray(5)));
+
+      InitializeRandomKnapsackInstance();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinaryKnapsackProblem(this, cloner);
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      var itemWeights = Weights;
+      var itemValues = Values;
+      var weight = 0;
+      var value = 0;
+      for (var i = 0; i < vector.Length; i++) {
+        if (!vector[i]) continue;
+        weight += itemWeights[i];
+        value += itemValues[i];
+      }
+      var cap = KnapsackCapacity.Value;
+      // assuming only positive values in the knapsack, maximizing in negative
+      // range makes solutions feasible, in positive range increases their value
+      return weight <= cap ? value : cap - weight;
+    }
+
+    private void InitializeRandomKnapsackInstance() {
+      var rand = new System.Random();
+
+      var itemCount = (int)Math.Pow(2, rand.Next(5, 10));
+      Weights = new IntArray(itemCount);
+      Values = new IntArray(itemCount);
+
+      double totalWeight = 0;
+
+      for (var i = 0; i < itemCount; i++) {
+        var value = rand.Next(1, 50);
+        var weight = rand.Next(1, 50);
+
+        Values[i] = value;
+        Weights[i] = weight;
+        totalWeight += weight;
+      }
+
+      KnapsackCapacity = new IntValue((int)Math.Round(0.6 * totalWeight));
+      Encoding.Length = itemCount;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/LootProfitProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/LootProfitProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/LootProfitProblem.cs	(revision 15895)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("Loot Profit Problem", "Represents a problem whose objective is to optimize a TTP loot for fixed TTP tour.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 999)]
+  [StorableClass]
+  public class LootProfitProblem : BinaryProblem {
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    [Storable]
+    public TravelingSalesmanProblem Tsp { get; set; }
+    [Storable]
+    public BinaryKnapsackProblem Ksp { get; set; }
+    [Storable]
+    public Permutation FixedTspSolution { get; set; }
+    [Storable]
+    public Dictionary<int, int[]> Availability { get; set; }
+    [Storable]
+    public double RentingRatio { get; set; }
+    [Storable]
+    public double MinSpeed { get; set; }
+    [Storable]
+    public double MaxSpeed { get; set; }
+
+    [StorableConstructor]
+    protected LootProfitProblem(bool deserializing) : base(deserializing) { }
+    protected LootProfitProblem(LootProfitProblem original, Cloner cloner) : base(original, cloner) {
+      Tsp = cloner.Clone(original.Tsp);
+      Ksp = cloner.Clone(original.Ksp);
+      FixedTspSolution = cloner.Clone(original.FixedTspSolution);
+      Availability = original.Availability != null ? original.Availability.ToDictionary(k => k.Key, v => (int[])v.Value.Clone()) : null;
+      RentingRatio = original.RentingRatio;
+      MinSpeed = original.MinSpeed;
+      MaxSpeed = original.MaxSpeed;
+    }
+    public LootProfitProblem() : base() {
+      Encoding.Length = 5;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LootProfitProblem(this, cloner);
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      return TtpUtils.Evaluate(Tsp, FixedTspSolution.ToArray(),
+                               Ksp, vector.ToArray(),
+                               Availability, RentingRatio, MinSpeed, MaxSpeed);
+    }
+
+    public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      while (true) {
+        var neighbor = individual.Copy();
+        SinglePositionBitflipManipulator.Apply(random, neighbor.BinaryVector());
+        yield return neighbor;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TourProfitProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TourProfitProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TourProfitProblem.cs	(revision 15895)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("Tour Profit Problem", "Represents a problem whose objective is to optimize a TTP tour for fixed TTP loot.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 999)]
+  [StorableClass]
+  public class TourProfitProblem : SingleObjectiveBasicProblem<PermutationEncoding> {
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    [Storable]
+    public TravelingSalesmanProblem Tsp { get; set; }
+    [Storable]
+    public BinaryKnapsackProblem Ksp { get; set; }
+    [Storable]
+    public BinaryVector FixedKspSolution { get; set; }
+    [Storable]
+    public Dictionary<int, int[]> Availability { get; set; }
+    [Storable]
+    public double RentingRatio { get; set; }
+    [Storable]
+    public double MinSpeed { get; set; }
+    [Storable]
+    public double MaxSpeed { get; set; }
+
+    [StorableConstructor]
+    protected TourProfitProblem(bool deserializing) : base(deserializing) { }
+    protected TourProfitProblem(TourProfitProblem original, Cloner cloner) : base(original, cloner) {
+      Tsp = cloner.Clone(original.Tsp);
+      Ksp = cloner.Clone(original.Ksp);
+      FixedKspSolution = cloner.Clone(original.FixedKspSolution);
+      Availability = original.Availability != null ? original.Availability.ToDictionary(k => k.Key, v => (int[])v.Value.Clone()) : null;
+      RentingRatio = original.RentingRatio;
+      MinSpeed = original.MinSpeed;
+      MaxSpeed = original.MaxSpeed;
+    }
+    public TourProfitProblem() : base() {
+      Encoding.Length = 5;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TourProfitProblem(this, cloner);
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      return TtpUtils.Evaluate(Tsp, individual.Permutation().ToArray(),
+                               Ksp, FixedKspSolution.ToArray(),
+                               Availability, RentingRatio, MinSpeed, MaxSpeed);
+    }
+
+    public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      while (true) {
+        var neighbor = individual.Copy();
+        switch (random.Next(7)) {
+          case 0: InsertionManipulator.Apply(random, neighbor.Permutation()); break;
+          case 1: InversionManipulator.Apply(random, neighbor.Permutation()); break;
+          case 2: ScrambleManipulator.Apply(random, neighbor.Permutation()); break;
+          case 3: Swap2Manipulator.Apply(random, neighbor.Permutation()); break;
+          case 4: Swap3Manipulator.Apply(random, neighbor.Permutation()); break;
+          case 5: TranslocationInversionManipulator.Apply(random, neighbor.Permutation()); break;
+          case 6: TranslocationManipulator.Apply(random, neighbor.Permutation()); break;
+        }
+        yield return neighbor;
+      }
+    }
+
+    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 TSP Solution"))
+        results.Add(new Result("Best TSP Solution", typeof(Permutation)));
+      results["Best TSP Solution"].Value = (IItem)best.Permutation().Clone();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TravelingThiefProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TravelingThiefProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Problems/TravelingThiefProblem.cs	(revision 15895)
@@ -0,0 +1,153 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("Traveling Thief Problem (TTP)", "")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 999)]
+  [StorableClass]
+  public sealed class TravelingThiefProblem : SingleObjectiveBasicProblem<MultiEncoding> {
+    private const string InstanceParameterName = "Instance";
+
+    [Storable]
+    private Dictionary<int, int[]> availability;
+    [Storable]
+    private double minSpeed, maxSpeed, rentingRatio;
+    [Storable]
+    private TravelingSalesmanProblem tsp;
+    [Storable]
+    private BinaryKnapsackProblem ksp;
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    public IFixedValueParameter<TextFileValue> InstanceParameter {
+      get { return (IFixedValueParameter<TextFileValue>)Parameters[InstanceParameterName]; }
+    }
+
+    [StorableConstructor]
+    private TravelingThiefProblem(bool deserializing) : base(deserializing) { }
+    private TravelingThiefProblem(TravelingThiefProblem original, Cloner cloner) : base(original, cloner) {
+      if (original.availability != null) availability = original.availability.ToDictionary(k => k.Key, v => (int[])v.Value.Clone());
+      minSpeed = original.minSpeed;
+      maxSpeed = original.maxSpeed;
+      rentingRatio = original.rentingRatio;
+      tsp = cloner.Clone(original.tsp);
+      ksp = cloner.Clone(original.ksp);
+
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+    }
+    public TravelingThiefProblem() {
+      Parameters.Add(new FixedValueParameter<TextFileValue>(InstanceParameterName));
+
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+
+      Encoding.Add(new BinaryVectorEncoding("loot"))
+              .Add(new PermutationEncoding("tour"));
+    }
+
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+    }
+
+    private void InstanceParameter_Value_ToStringChanged(object sender, EventArgs e) {
+      string filePath = InstanceParameter.Value.Value;
+
+      TtpUtils.DistanceType distanceType;
+      double[,] tspCoordinates;
+      int kspCapacity;
+      int[] kspItemValues, kspItemWeights;
+      int[] ttpAvailability;
+
+      TtpUtils.Import(filePath, out tspCoordinates, out distanceType,
+                                out kspCapacity, out kspItemValues, out kspItemWeights,
+                                out ttpAvailability, out minSpeed, out maxSpeed, out rentingRatio);
+
+      this.availability = TtpUtils.GetAvailability(ttpAvailability);
+
+      tsp = new TravelingSalesmanProblem();
+      tsp.Coordinates = new DoubleMatrix(tspCoordinates);
+      tsp.DistanceMatrix = new DistanceMatrix(TtpUtils.GetDistances(tsp.Coordinates, distanceType));
+
+      ksp = new BinaryKnapsackProblem();
+      ksp.KnapsackCapacity.Value = kspCapacity;
+      ksp.Encoding.Length = kspItemValues.Length;
+      ksp.Values = new IntArray(kspItemValues);
+      ksp.Weights = new IntArray(kspItemWeights);
+
+      Encoding.Encodings.OfType<BinaryVectorEncoding>().Single().Length = ksp.Encoding.Length;
+      Encoding.Encodings.OfType<PermutationEncoding>().Single().Length = tsp.Coordinates.Rows;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TravelingThiefProblem(this, cloner);
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var binaryVector = individual.BinaryVector();
+      var permutation = individual.Permutation();
+      return TtpUtils.Evaluate(tsp, permutation.ToArray(), ksp, binaryVector.ToArray(), availability, rentingRatio, minSpeed, maxSpeed);
+    }
+
+    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() : orderedIndividuals.First();
+      var bestIndividual = best.Individual;
+      var bestQuality = best.Quality;
+
+      if (!results.ContainsKey("Best TTP Quality")) {
+        results.Add(new Result("Best TTP Quality", typeof(DoubleValue)));
+        results.Add(new Result("Best Tour", typeof(PathTSPTour)));
+        results.Add(new Result("Best Loot", typeof(KnapsackSolution)));
+      }
+      results["Best TTP Quality"].Value = new DoubleValue(bestQuality);
+      results["Best Tour"].Value = new PathTSPTour(
+        (DoubleMatrix)tsp.Coordinates.Clone(),
+        (Permutation)bestIndividual.Permutation().Clone(),
+        new DoubleValue(double.NaN)
+      );
+      results["Best Loot"].Value = new KnapsackSolution(
+        (BinaryVector)bestIndividual.BinaryVector().Clone(),
+        new DoubleValue(double.NaN),
+        (IntValue)ksp.KnapsackCapacity.Clone(),
+        (IntArray)ksp.Weights.Clone(),
+        (IntArray)ksp.Values.Clone()
+      );
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Networks.IntegratedOptimization.TravelingThief")]
+[assembly: AssemblyDescription("Classes for integrated optimization of the Traveling Thief Problem")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeursiticLab")]
+[assembly: AssemblyCopyright("(c) 2002-2017 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("0259b7dd-1e4f-4838-9859-a1d428fa2ab4")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork.cs	(revision 15895)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Core.Networks;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpNetwork", "An abstract base class for TTP optimization networks.")]
+  [StorableClass]
+  public abstract class TtpNetwork : Network, IOptimizer {
+    #region Constants
+    protected const string OrchestratorNodeName = "Orchestrator";
+    protected const string MetaSolverNodeName = "MetaSolver";
+    protected const string TspSolverNodeName = "TspSolver";
+    protected const string KspSolverNodeName = "KspSolver";
+    #endregion
+
+    #region Nodes
+    public TtpOrchestratorNode Orchestrator {
+      get { return (TtpOrchestratorNode)Nodes[OrchestratorNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(OrchestratorNodeName))
+          throw new InvalidOperationException("Orchestrator already set.");
+        Nodes.Add(value);
+      }
+    }
+
+    public OrchestratedAlgorithmNode MetaSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[MetaSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(MetaSolverNodeName))
+          throw new InvalidOperationException("MetaSolver already set.");
+        Nodes.Add(value);
+        RegisterEvents();
+      }
+    }
+
+    public OrchestratedAlgorithmNode TspSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[TspSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(TspSolverNodeName))
+          throw new InvalidOperationException("TspSolver already set.");
+        Nodes.Add(value);
+      }
+    }
+
+    public OrchestratedAlgorithmNode KspSolver {
+      get { return (OrchestratedAlgorithmNode)Nodes[KspSolverNodeName]; }
+      protected set {
+        if (Nodes.ContainsKey(KspSolverNodeName))
+          throw new InvalidOperationException("KspSolver already set.");
+        Nodes.Add(value);
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected TtpNetwork(bool deserializing) : base(deserializing) { }
+    protected TtpNetwork(TtpNetwork original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    protected TtpNetwork() : this("TtpNetwork") { }
+    protected TtpNetwork(string name) : base(name) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      MetaSolver.AlgorithmChanged += MetaSolver_AlgorithmChanged;
+      RegisterAlgorithmEvents();
+    }
+
+    private void MetaSolver_AlgorithmChanged(object sender, EventArgs e) {
+      RegisterAlgorithmEvents();
+    }
+
+    private void RegisterAlgorithmEvents() {
+      var algorithm = MetaSolver.Algorithm;
+      if (algorithm == null) return;
+
+      algorithm.ExecutionStateChanged += (s, e) => OnExecutionStateChanged();
+      algorithm.ExecutionTimeChanged += (s, e) => OnExecutionTimeChanged();
+      algorithm.Prepared += (s, e) => OnPrepared();
+      algorithm.Started += (s, e) => OnStarted();
+      algorithm.Paused += (s, e) => OnPaused();
+      algorithm.Stopped += (s, e) => OnStopped();
+      algorithm.ExceptionOccurred += (s, e) => OnExceptionOccurred(e.Value);
+    }
+
+    #region IOptimizer Members
+    public RunCollection Runs { get { return MetaSolver.Algorithm.Runs; } }
+    public IEnumerable<IOptimizer> NestedOptimizers { get { yield break; } }
+    public ExecutionState ExecutionState { get { return MetaSolver.Algorithm.ExecutionState; } }
+    public TimeSpan ExecutionTime { get { return MetaSolver.Algorithm.ExecutionTime; } }
+
+    public void Prepare() { Prepare(false); }
+    public void Prepare(bool clearRuns) { Orchestrator.Prepare(clearRuns); }
+    public void Start() { Orchestrator.StartAsync(); }
+    public void Pause() { Orchestrator.Pause(); }
+    public void Stop() { Orchestrator.Stop(); }
+
+    public event EventHandler ExecutionStateChanged;
+    private void OnExecutionStateChanged() {
+      var handler = ExecutionStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      var handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Prepared;
+    private void OnPrepared() {
+      var handler = Prepared;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Started;
+    private void OnStarted() {
+      var handler = Started;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Paused;
+    private void OnPaused() {
+      var handler = Paused;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler Stopped;
+    private void OnStopped() {
+      var handler = Stopped;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
+    private void OnExceptionOccurred(Exception exception) {
+      var handler = ExceptionOccurred;
+      if (handler != null) handler(this, new EventArgs<Exception>(exception));
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork1.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.LocalSearch;
+using HeuristicLab.Algorithms.ParameterlessPopulationPyramid;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpNetwork1", "Version 1 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class TtpNetwork1 : TtpNetwork {
+    [StorableConstructor]
+    private TtpNetwork1(bool deserializing) : base(deserializing) { }
+    private TtpNetwork1(TtpNetwork1 original, Cloner cloner) : base(original, cloner) { }
+    public TtpNetwork1() : this("TtpNetwork1") { }
+    public TtpNetwork1(string name) : base(name) {
+      Orchestrator = new TtpOrchestratorNode1(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      TspSolver = new OrchestratedAlgorithmNode(TspSolverNodeName);
+      KspSolver = new OrchestratedAlgorithmNode(KspSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      cmaes.Problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var ls = new LocalSearch();
+      ls.Problem = new TourProfitProblem();
+      ls.MaximumIterations.Value = 100;
+      ls.SampleSize.Value = 2000;
+      TspSolver.Algorithm = ls;
+      Orchestrator.TspSolverOrchestrationPort.ConnectedPort = TspSolver.OrchestrationPort;
+
+      var p3 = new ParameterlessPopulationPyramid();
+      p3.Problem = Orchestrator.KspParameter.Value;
+      p3.MaximumRuntime = 3;
+      KspSolver.Algorithm = p3;
+      Orchestrator.KspSolverOrchestrationPort.ConnectedPort = KspSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpNetwork1(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork2.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.LocalSearch;
+using HeuristicLab.Algorithms.ParameterlessPopulationPyramid;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpNetwork2", "Version 2 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class TtpNetwork2 : TtpNetwork {
+    [StorableConstructor]
+    private TtpNetwork2(bool deserializing) : base(deserializing) { }
+    private TtpNetwork2(TtpNetwork2 original, Cloner cloner) : base(original, cloner) { }
+    public TtpNetwork2() : this("TtpNetwork2") { }
+    public TtpNetwork2(string name) : base(name) {
+      Orchestrator = new TtpOrchestratorNode2(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      TspSolver = new OrchestratedAlgorithmNode(TspSolverNodeName);
+      KspSolver = new OrchestratedAlgorithmNode(KspSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      cmaes.Problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var ls = new LocalSearch();
+      ls.Problem = Orchestrator.TspParameter.Value;
+      ls.MaximumIterations.Value = 100;
+      ls.SampleSize.Value = 2000;
+      TspSolver.Algorithm = ls;
+      Orchestrator.TspSolverOrchestrationPort.ConnectedPort = TspSolver.OrchestrationPort;
+
+      var p3 = new ParameterlessPopulationPyramid();
+      p3.Problem = new LootProfitProblem();
+      p3.MaximumRuntime = 3;
+      KspSolver.Algorithm = p3;
+      Orchestrator.KspSolverOrchestrationPort.ConnectedPort = KspSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpNetwork2(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork3.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork3.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpNetwork3.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Algorithms.CMAEvolutionStrategy;
+using HeuristicLab.Algorithms.LocalSearch;
+using HeuristicLab.Algorithms.ParameterlessPopulationPyramid;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpNetwork3", "Version 3 of a TTP optimization network.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class TtpNetwork3 : TtpNetwork {
+    [StorableConstructor]
+    private TtpNetwork3(bool deserializing) : base(deserializing) { }
+    private TtpNetwork3(TtpNetwork3 original, Cloner cloner) : base(original, cloner) { }
+    public TtpNetwork3() : this("TtpNetwork3") { }
+    public TtpNetwork3(string name) : base(name) {
+      Orchestrator = new TtpOrchestratorNode3(OrchestratorNodeName);
+      MetaSolver = new OrchestratedAlgorithmNode(MetaSolverNodeName);
+      TspSolver = new OrchestratedAlgorithmNode(TspSolverNodeName);
+      KspSolver = new OrchestratedAlgorithmNode(KspSolverNodeName);
+
+      var cmaes = new CMAEvolutionStrategy();
+      cmaes.Problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      var cmaAnalyzer = cmaes.Analyzer.Operators.OfType<CMAAnalyzer>().Single();
+      cmaes.Analyzer.Operators.SetItemCheckedState(cmaAnalyzer, true);
+      cmaes.MaximumGenerations = 80;
+      MetaSolver.Algorithm = cmaes;
+      Orchestrator.MetaSolverOrchestrationPort.ConnectedPort = MetaSolver.OrchestrationPort;
+
+      var ls = new LocalSearch();
+      ls.Problem = Orchestrator.TspParameter.Value;
+      ls.MaximumIterations.Value = 100;
+      ls.SampleSize.Value = 2000;
+      TspSolver.Algorithm = ls;
+      Orchestrator.TspSolverOrchestrationPort.ConnectedPort = TspSolver.OrchestrationPort;
+
+      var p3 = new ParameterlessPopulationPyramid();
+      p3.Problem = Orchestrator.KspParameter.Value;
+      p3.MaximumRuntime = 3;
+      KspSolver.Algorithm = p3;
+      Orchestrator.KspSolverOrchestrationPort.ConnectedPort = KspSolver.OrchestrationPort;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpNetwork3(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode.cs	(revision 15895)
@@ -0,0 +1,333 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpOrchestratorNode", "An abstract base class for orchestrators used in TTP optimization networks.")]
+  [StorableClass]
+  public abstract class TtpOrchestratorNode : OrchestratorNode {
+    #region Constants
+    protected const string InstanceParameterName = "Instance";
+    protected const string TspParameterName = "TSP";
+    protected const string KspParameterName = "KSP";
+    protected const string AvailabilityParameterName = "Availability";
+    protected const string MinSpeedParameterName = "MinSpeed";
+    protected const string MaxSpeedParameterName = "MaxSpeed";
+    protected const string RentingRatioParameterName = "RentingRatio";
+    protected const string MetaSolverName = "MetaSolver";
+    protected const string TspSolverName = "TspSolver";
+    protected const string KspSolverName = "KspSolver";
+    protected const string OrchestrationPortNameSuffix = "OrchestrationPort";
+    protected const string EvaluationPortNameSuffix = "EvaluationPort";
+    #endregion
+
+    protected CancellationTokenSource cts;
+
+    [Storable]
+    protected double[,] tspCoordinates = new double[0, 0];
+    [Storable]
+    protected TtpUtils.DistanceType distanceType;
+    [Storable]
+    protected int kspCapacity;
+    [Storable]
+    protected int[] kspItemWeights = new int[0], kspItemValues = new int[0], ttpAvailability = new int[0];
+    [Storable]
+    protected double ttpMinSpeed, ttpMaxSpeed, ttpRentingRatio;
+
+    #region Parameters
+    public IFixedValueParameter<TextFileValue> InstanceParameter {
+      get { return (IFixedValueParameter<TextFileValue>)Parameters[InstanceParameterName]; }
+    }
+
+    public IValueParameter<TravelingSalesmanProblem> TspParameter {
+      get { return (IValueParameter<TravelingSalesmanProblem>)Parameters[TspParameterName]; }
+    }
+
+    public IValueParameter<BinaryKnapsackProblem> KspParameter {
+      get { return (IValueParameter<BinaryKnapsackProblem>)Parameters[KspParameterName]; }
+    }
+
+    public IValueParameter<IntArray> AvailabilityParameter {
+      get { return (IValueParameter<IntArray>)Parameters[AvailabilityParameterName]; }
+    }
+
+    public IValueParameter<DoubleValue> MinSpeedParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[MinSpeedParameterName]; }
+    }
+
+    public IValueParameter<DoubleValue> MaxSpeedParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[MaxSpeedParameterName]; }
+    }
+
+    public IValueParameter<DoubleValue> RentingRatioParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[RentingRatioParameterName]; }
+    }
+    #endregion
+
+    #region Ports
+    public IMessagePort MetaSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[MetaSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = MetaSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += MetaSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort MetaSolverEvaluationPort {
+      get { return (IMessagePort)Ports[MetaSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = MetaSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+
+    public IMessagePort TspSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[TspSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = TspSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += TspSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort TspSolverEvaluationPort {
+      get { return (IMessagePort)Ports[TspSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = TspSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+
+    public IMessagePort KspSolverOrchestrationPort {
+      get { return (IMessagePort)Ports[KspSolverName + OrchestrationPortNameSuffix]; }
+      protected set {
+        string portName = KspSolverName + OrchestrationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+        value.ConnectedPortChanged += KspSolverOrchestrationPort_ConnectedPortChanged;
+      }
+    }
+
+    public IMessagePort KspSolverEvaluationPort {
+      get { return (IMessagePort)Ports[KspSolverName + EvaluationPortNameSuffix]; }
+      protected set {
+        string portName = KspSolverName + EvaluationPortNameSuffix;
+        if (Ports.ContainsKey(portName))
+          throw new InvalidOperationException(portName + " already set.");
+        Ports.Add(value);
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected TtpOrchestratorNode(bool deserializing) : base(deserializing) { }
+    protected TtpOrchestratorNode(TtpOrchestratorNode original, Cloner cloner) : base(original, cloner) {
+      tspCoordinates = (double[,])original.tspCoordinates.Clone();
+      kspCapacity = original.kspCapacity;
+      kspItemWeights = (int[])original.kspItemWeights.Clone();
+      kspItemValues = (int[])original.kspItemValues.Clone();
+      ttpAvailability = (int[])original.ttpAvailability.Clone();
+      ttpMinSpeed = original.ttpMinSpeed;
+      ttpMaxSpeed = original.ttpMaxSpeed;
+      ttpRentingRatio = original.ttpRentingRatio;
+
+      RegisterEvents();
+    }
+    protected TtpOrchestratorNode() : this("TtpOrchestratorNode") { }
+    protected TtpOrchestratorNode(string name) : base(name) {
+      Parameters.Add(new FixedValueParameter<TextFileValue>(InstanceParameterName));
+      Parameters.Add(new ValueParameter<TravelingSalesmanProblem>(TspParameterName, new TravelingSalesmanProblem()));
+      Parameters.Add(new ValueParameter<BinaryKnapsackProblem>(KspParameterName, new BinaryKnapsackProblem()));
+      Parameters.Add(new ValueParameter<IntArray>(AvailabilityParameterName));
+      Parameters.Add(new ValueParameter<DoubleValue>(MinSpeedParameterName, new DoubleValue(0.1)));
+      Parameters.Add(new ValueParameter<DoubleValue>(MaxSpeedParameterName, new DoubleValue(1.0)));
+      Parameters.Add(new ValueParameter<DoubleValue>(RentingRatioParameterName, new DoubleValue(0.5)));
+
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;
+      MetaSolverOrchestrationPort.ConnectedPortChanged += MetaSolverOrchestrationPort_ConnectedPortChanged;
+      TspSolverOrchestrationPort.ConnectedPortChanged += TspSolverOrchestrationPort_ConnectedPortChanged;
+      KspSolverOrchestrationPort.ConnectedPortChanged += KspSolverOrchestrationPort_ConnectedPortChanged;
+    }
+
+    private void InstanceParameter_Value_ToStringChanged(object sender, EventArgs e) {
+      string filePath = InstanceParameter.Value.Value;
+      TtpUtils.Import(filePath, out tspCoordinates, out distanceType,
+                                out kspCapacity, out kspItemValues, out kspItemWeights,
+                                out ttpAvailability, out ttpMinSpeed, out ttpMaxSpeed, out ttpRentingRatio);
+
+      var tsp = TspParameter.Value;
+      tsp.Coordinates = new DoubleMatrix(tspCoordinates);
+      tsp.DistanceMatrix = new DistanceMatrix(TtpUtils.GetDistances(tsp.Coordinates, distanceType));
+
+      var ksp = KspParameter.Value;
+      ksp.KnapsackCapacity.Value = kspCapacity;
+      ksp.Encoding.Length = kspItemValues.Length;
+      ksp.Values = new IntArray(kspItemValues);
+      ksp.Weights = new IntArray(kspItemWeights);
+
+      AvailabilityParameter.Value = new IntArray(ttpAvailability);
+      MinSpeedParameter.Value.Value = ttpMinSpeed;
+      MaxSpeedParameter.Value.Value = ttpMaxSpeed;
+      RentingRatioParameter.Value.Value = ttpRentingRatio;
+
+      Prepare();
+    }
+
+    protected virtual void MetaSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (MetaSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = MetaSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      var hook = new HookOperator { Name = "Meta Eval Hook" };
+      hook.Parameters.Add(new LookupParameter<RealVector>("RealVector") { Hidden = true });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = true });
+      node.EvalHook = hook;
+
+      node.OrchestrationPort.CloneParametersFromPort(MetaSolverOrchestrationPort);
+      node.EvaluationPort.CloneParametersFromPort(MetaSolverEvaluationPort);
+      node.EvaluationPort.ConnectedPort = MetaSolverEvaluationPort;
+    }
+
+    protected virtual void TspSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (TspSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = TspSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      node.OrchestrationPort.CloneParametersFromPort(TspSolverOrchestrationPort);
+    }
+
+    protected virtual void KspSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {
+      if (KspSolverOrchestrationPort.ConnectedPort == null) return;
+
+      var node = KspSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;
+      if (node == null) return;
+
+      node.OrchestrationPort.CloneParametersFromPort(KspSolverOrchestrationPort);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      Results.Clear();
+    }
+
+    public override void Start() {
+      cts = new CancellationTokenSource();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Start);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    public override void Pause() {
+      cts.Cancel();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Pause);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+
+      var tspMsg = TspSolverOrchestrationPort.PrepareMessage();
+      tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      TspSolverOrchestrationPort.SendMessage(tspMsg);
+
+      var kspMsg = KspSolverOrchestrationPort.PrepareMessage();
+      kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      KspSolverOrchestrationPort.SendMessage(kspMsg);
+    }
+
+    public override void Stop() {
+      cts.Cancel();
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+
+      var tspMsg = TspSolverOrchestrationPort.PrepareMessage();
+      tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      TspSolverOrchestrationPort.SendMessage(tspMsg);
+
+      var kspMsg = KspSolverOrchestrationPort.PrepareMessage();
+      kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);
+      KspSolverOrchestrationPort.SendMessage(kspMsg);
+    }
+
+    protected override void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) {
+      var messageActions = new Dictionary<IMessagePort, Action<IMessage>>();
+      messageActions.Add(MetaSolverOrchestrationPort, MetaSolverOrchestrationPortMessage);
+      messageActions.Add(MetaSolverEvaluationPort, MetaSolverEvaluationPortMessage);
+      messageActions.Add(TspSolverOrchestrationPort, TspSolverOrchestrationPortMessage);
+      messageActions.Add(KspSolverOrchestrationPort, KspSolverOrchestrationPortMessage);
+
+      messageActions[port](message);
+
+      base.ProcessMessage(message, port, token);
+    }
+
+    #region MetaSolver Message Handling
+    protected virtual void MetaSolverOrchestrationPortMessage(IMessage message) { }
+
+    protected virtual void MetaSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+
+    #region TspSolver Message Handling
+    protected virtual void TspSolverOrchestrationPortMessage(IMessage message) { }
+
+    protected virtual void TspSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+
+    #region KspSolver Message Handling
+    protected virtual void KspSolverOrchestrationPortMessage(IMessage message) { }
+
+    private void KspSolverEvaluationPortMessage(IMessage message) { }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode1.cs	(revision 15895)
@@ -0,0 +1,134 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpOrchestratorNode1", "Orchestrator for TTP optimization network version 1.")]
+  [StorableClass]
+  public sealed class TtpOrchestratorNode1 : TtpOrchestratorNode {
+    [StorableConstructor]
+    private TtpOrchestratorNode1(bool deserializing) : base(deserializing) { }
+    private TtpOrchestratorNode1(TtpOrchestratorNode1 original, Cloner cloner) : base(original, cloner) { }
+    public TtpOrchestratorNode1() : this("TtpOrchestratorNode1") { }
+    public TtpOrchestratorNode1(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MaximizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      TspSolverOrchestrationPort = CreateOrchestrationPort<TourProfitProblem>(TspSolverName + OrchestrationPortNameSuffix);
+      KspSolverOrchestrationPort = CreateOrchestrationPort<BinaryKnapsackProblem>(KspSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpOrchestratorNode1(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = KspParameter.Value.Length;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var ksp = (BinaryKnapsackProblem)KspParameter.Value.Clone();
+      for (int i = 0; i < ksp.Values.Length; i++)
+        ksp.Values[i] = (int)Math.Ceiling(ksp.Values[i] * factors[i]);
+
+      var kspMsg = KspSolverOrchestrationPort.PrepareMessage();
+      kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      kspMsg["Problem"] = ksp;
+      KspSolverOrchestrationPort.SendMessage(kspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var kspResults = (ResultCollection)kspMsg["Results"];
+      var bestKspSolution = (BinaryVector)kspResults["Best Solution"].Value.Clone();
+      var kspCapacity = (IntValue)KspParameter.Value.KnapsackCapacity.Clone();
+      var kspPenalty = new DoubleValue(0.0);
+      var kspWeights = (IntArray)KspParameter.Value.Weights.Clone();
+      var kspValues = (IntArray)KspParameter.Value.Values.Clone();
+      var bestKspQuality = KnapsackEvaluator.Apply(bestKspSolution, kspCapacity, kspPenalty, kspWeights, kspValues).Quality;
+      var loot = new KnapsackSolution(bestKspSolution, bestKspQuality, kspCapacity, kspWeights, kspValues);
+
+      var availability = TtpUtils.GetAvailability(AvailabilityParameter.Value.ToArray());
+
+      var tspMsg = TspSolverOrchestrationPort.PrepareMessage();
+      tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      var tpp = new TourProfitProblem {
+        Tsp = (TravelingSalesmanProblem)TspParameter.Value.Clone(),
+        Ksp = (BinaryKnapsackProblem)KspParameter.Value.Clone(),
+        FixedKspSolution = bestKspSolution,
+        Availability = availability,
+        RentingRatio = RentingRatioParameter.Value.Value,
+        MinSpeed = MinSpeedParameter.Value.Value,
+        MaxSpeed = MaxSpeedParameter.Value.Value,
+      };
+      tpp.Encoding.Length = TspParameter.Value.Coordinates.Rows;
+      tspMsg["Problem"] = tpp;
+      TspSolverOrchestrationPort.SendMessage(tspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var tspResults = (ResultCollection)tspMsg["Results"];
+      var bestTspSolution = (Permutation)tspResults["Best TSP Solution"].Value.Clone();
+      var coordinates = (DoubleMatrix)TspParameter.Value.Coordinates.Clone();
+      var tour = new PathTSPTour(coordinates, bestTspSolution, new DoubleValue(TSPCoordinatesPathEvaluator.Apply(new TSPEuclideanPathEvaluator(), coordinates, bestTspSolution)));
+
+      #region Analyze
+      double objectiveValue = TtpUtils.Evaluate(TspParameter.Value, tour.Permutation.ToArray(), KspParameter.Value, loot.BinaryVector.ToArray(),
+        availability, RentingRatioParameter.Value.Value, MinSpeedParameter.Value.Value, MaxSpeedParameter.Value.Value);
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best TTP Quality", out bestQuality)) {
+        Results.Add(new Result("Best TTP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best Tour", tour));
+        Results.Add(new Result("Best Loot", loot));
+      } else if (objectiveValue > ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best Tour"].Value = tour;
+        Results["Best Loot"].Value = loot;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode2.cs	(revision 15895)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpOrchestratorNode2", "Orchestrator for TTP optimization network version 2.")]
+  [StorableClass]
+  public sealed class TtpOrchestratorNode2 : TtpOrchestratorNode {
+    [StorableConstructor]
+    private TtpOrchestratorNode2(bool deserializing) : base(deserializing) { }
+    private TtpOrchestratorNode2(TtpOrchestratorNode2 original, Cloner cloner) : base(original, cloner) { }
+    public TtpOrchestratorNode2() : this("TtpOrchestratorNode2") { }
+    public TtpOrchestratorNode2(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MaximizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      TspSolverOrchestrationPort = CreateOrchestrationPort<TravelingSalesmanProblem>(TspSolverName + OrchestrationPortNameSuffix);
+      KspSolverOrchestrationPort = CreateOrchestrationPort<LootProfitProblem>(KspSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpOrchestratorNode2(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = TspParameter.Value.Coordinates.Rows * 2;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+
+      var tsp = (TravelingSalesmanProblem)TspParameter.Value.Clone();
+      for (int i = 0; i < tsp.Coordinates.Rows; i++) {
+        tsp.Coordinates[i, 0] = (int)Math.Ceiling(tsp.Coordinates[i, 0] * factors[i * 2]);
+        tsp.Coordinates[i, 1] = (int)Math.Ceiling(tsp.Coordinates[i, 1] * factors[i * 2 + 1]);
+      }
+      tsp.DistanceMatrix = new DistanceMatrix(TtpUtils.GetDistances(tsp.Coordinates, distanceType));
+
+      var tspMsg = TspSolverOrchestrationPort.PrepareMessage();
+      tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      tspMsg["Problem"] = tsp;
+      TspSolverOrchestrationPort.SendMessage(tspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var tspResults = (ResultCollection)tspMsg["Results"];
+      var bestTspSolution = (PathTSPTour)tspResults["Best TSP Solution"].Value.Clone();
+      var coordinates = (DoubleMatrix)TspParameter.Value.Coordinates.Clone();
+      var tour = new PathTSPTour(coordinates, bestTspSolution.Permutation, new DoubleValue(TSPCoordinatesPathEvaluator.Apply(new TSPEuclideanPathEvaluator(), coordinates, bestTspSolution.Permutation)));
+
+      var availability = TtpUtils.GetAvailability(AvailabilityParameter.Value.ToArray());
+
+      var kspMsg = KspSolverOrchestrationPort.PrepareMessage();
+      kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      var lpp = new LootProfitProblem {
+        Tsp = (TravelingSalesmanProblem)TspParameter.Value.Clone(),
+        Ksp = (BinaryKnapsackProblem)KspParameter.Value.Clone(),
+        FixedTspSolution = bestTspSolution.Permutation,
+        Availability = availability,
+        RentingRatio = RentingRatioParameter.Value.Value,
+        MinSpeed = MinSpeedParameter.Value.Value,
+        MaxSpeed = MaxSpeedParameter.Value.Value,
+      };
+      lpp.Encoding.Length = KspParameter.Value.Length;
+      kspMsg["Problem"] = lpp;
+      KspSolverOrchestrationPort.SendMessage(kspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var kspResults = (ResultCollection)kspMsg["Results"];
+      var bestKspSolution = (BinaryVector)kspResults["Best Solution"].Value.Clone();
+      var kspCapacity = (IntValue)KspParameter.Value.KnapsackCapacity.Clone();
+      var kspPenalty = new DoubleValue(0.0);
+      var kspWeights = (IntArray)KspParameter.Value.Weights.Clone();
+      var kspValues = (IntArray)KspParameter.Value.Values.Clone();
+      var bestKspQuality = KnapsackEvaluator.Apply(bestKspSolution, kspCapacity, kspPenalty, kspWeights, kspValues).Quality;
+      var loot = new KnapsackSolution(bestKspSolution, bestKspQuality, kspCapacity, kspWeights, kspValues);
+
+      #region Analyze
+      double objectiveValue = TtpUtils.Evaluate(TspParameter.Value, tour.Permutation.ToArray(), KspParameter.Value, loot.BinaryVector.ToArray(),
+        availability, RentingRatioParameter.Value.Value, MinSpeedParameter.Value.Value, MaxSpeedParameter.Value.Value);
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best TTP Quality", out bestQuality)) {
+        Results.Add(new Result("Best TTP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best Tour", tour));
+        Results.Add(new Result("Best Loot", loot));
+      } else if (objectiveValue > ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best Tour"].Value = tour;
+        Results["Best Loot"].Value = loot;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode3.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode3.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode3.cs	(revision 15895)
@@ -0,0 +1,131 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  [Item("TtpOrchestratorNode3", "Orchestrator for TTP optimization network version 3.")]
+  [StorableClass]
+  public sealed class TtpOrchestratorNode3 : TtpOrchestratorNode {
+    [StorableConstructor]
+    private TtpOrchestratorNode3(bool deserializing) : base(deserializing) { }
+    private TtpOrchestratorNode3(TtpOrchestratorNode3 original, Cloner cloner) : base(original, cloner) { }
+    public TtpOrchestratorNode3() : this("TtpOrchestratorNode3") { }
+    public TtpOrchestratorNode3(string name) : base(name) {
+      MetaSolverOrchestrationPort = CreateOrchestrationPort<MaximizationVariegationProblem<RealVectorEncoding>>(MetaSolverName + OrchestrationPortNameSuffix);
+      MetaSolverEvaluationPort = CreateEvaluationPort<RealVector>(MetaSolverName + EvaluationPortNameSuffix, "RealVector", "Quality");
+      TspSolverOrchestrationPort = CreateOrchestrationPort<TravelingSalesmanProblem>(TspSolverName + OrchestrationPortNameSuffix);
+      KspSolverOrchestrationPort = CreateOrchestrationPort<BinaryKnapsackProblem>(KspSolverName + OrchestrationPortNameSuffix);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TtpOrchestratorNode3(this, cloner);
+    }
+
+    public override void Prepare(bool clearRuns = false) {
+      base.Prepare(clearRuns);
+
+      var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();
+      var msgFlags = OrchestrationMessage.Prepare | OrchestrationMessage.SetEvalHook;
+      if (clearRuns) msgFlags |= OrchestrationMessage.ClearRuns;
+      metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(msgFlags);
+      var problem = new MaximizationVariegationProblem<RealVectorEncoding>();
+      problem.Encoding.Length = KspParameter.Value.Length + TspParameter.Value.Coordinates.Rows * 2;
+      problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });
+      metaMsg["Problem"] = problem;
+      MetaSolverOrchestrationPort.SendMessage(metaMsg);
+    }
+
+    #region MetaSolver Message Handling
+    protected override void MetaSolverEvaluationPortMessage(IMessage message) {
+      var factors = (RealVector)message["RealVector"];
+      int fi = 0;
+
+      var ksp = (BinaryKnapsackProblem)KspParameter.Value.Clone();
+      while (fi < ksp.Values.Length) {
+        ksp.Values[fi] = (int)Math.Ceiling(ksp.Values[fi] * factors[fi]);
+        ++fi;
+      }
+
+      var kspMsg = KspSolverOrchestrationPort.PrepareMessage();
+      kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      kspMsg["Problem"] = ksp;
+      KspSolverOrchestrationPort.SendMessage(kspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var kspResults = (ResultCollection)kspMsg["Results"];
+      var bestKspSolution = (BinaryVector)kspResults["Best Solution"].Value.Clone();
+      var kspCapacity = (IntValue)KspParameter.Value.KnapsackCapacity.Clone();
+      var kspPenalty = new DoubleValue(0.0);
+      var kspWeights = (IntArray)KspParameter.Value.Weights.Clone();
+      var kspValues = (IntArray)KspParameter.Value.Values.Clone();
+      var bestKspQuality = KnapsackEvaluator.Apply(bestKspSolution, kspCapacity, kspPenalty, kspWeights, kspValues).Quality;
+      var loot = new KnapsackSolution(bestKspSolution, bestKspQuality, kspCapacity, kspWeights, kspValues);
+
+      var tsp = (TravelingSalesmanProblem)TspParameter.Value.Clone();
+      for (int j = 0; j < tsp.Coordinates.Rows; j++) {
+        tsp.Coordinates[j, 0] = (int)Math.Ceiling(tsp.Coordinates[j, 0] * factors[fi + j * 2]);
+        tsp.Coordinates[j, 1] = (int)Math.Ceiling(tsp.Coordinates[j, 1] * factors[fi + j * 2 + 1]);
+      }
+      tsp.DistanceMatrix = new DistanceMatrix(TtpUtils.GetDistances(tsp.Coordinates, distanceType));
+
+      var tspMsg = TspSolverOrchestrationPort.PrepareMessage();
+      tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start);
+      tspMsg["Problem"] = tsp;
+      TspSolverOrchestrationPort.SendMessage(tspMsg);
+      cts.Token.ThrowIfCancellationRequested();
+
+      var tspResults = (ResultCollection)tspMsg["Results"];
+      var bestTspSolution = (PathTSPTour)tspResults["Best TSP Solution"].Value.Clone();
+      var coordinates = (DoubleMatrix)TspParameter.Value.Coordinates.Clone();
+      var tour = new PathTSPTour(coordinates, bestTspSolution.Permutation, new DoubleValue(TSPCoordinatesPathEvaluator.Apply(new TSPEuclideanPathEvaluator(), coordinates, bestTspSolution.Permutation)));
+
+      #region Analyze
+      double objectiveValue = TtpUtils.Evaluate(TspParameter.Value, tour.Permutation.ToArray(), KspParameter.Value, loot.BinaryVector.ToArray(),
+        TtpUtils.GetAvailability(AvailabilityParameter.Value.ToArray()), RentingRatioParameter.Value.Value, MinSpeedParameter.Value.Value, MaxSpeedParameter.Value.Value);
+      ((DoubleValue)message["Quality"]).Value = objectiveValue;
+
+      IResult bestQuality;
+      if (!Results.TryGetValue("Best TTP Quality", out bestQuality)) {
+        Results.Add(new Result("Best TTP Quality", new DoubleValue(objectiveValue)));
+        Results.Add(new Result("Best Tour", tour));
+        Results.Add(new Result("Best Loot", loot));
+      } else if (objectiveValue > ((DoubleValue)bestQuality.Value).Value) {
+        ((DoubleValue)bestQuality.Value).Value = objectiveValue;
+        Results["Best Tour"].Value = tour;
+        Results["Best Loot"].Value = loot;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpUtils.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpUtils.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpUtils.cs	(revision 15895)
@@ -0,0 +1,135 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief {
+  public static class TtpUtils {
+    public enum DistanceType {
+      Unknown = int.MinValue,
+      CEIL_2D = 0,
+      EUC_2D = 1,
+    }
+
+    public static void Import(string filePath, out double[,] tspCoordinates,
+                                               out DistanceType distanceType,
+                                               out int kspCapacity,
+                                               out int[] kspItemValues,
+                                               out int[] kspItemWeights,
+                                               out int[] ttpAvailability,
+                                               out double ttpMinSpeed,
+                                               out double ttpMaxSpeed,
+                                               out double ttpRentingRatio) {
+      int nrOfCities = 0, nrOfItems = 0; kspCapacity = 0;
+      ttpMinSpeed = 0.0; ttpMaxSpeed = 0.0; ttpRentingRatio = 0.0;
+      distanceType = DistanceType.Unknown;
+
+      using (var fs = new FileStream(filePath, FileMode.Open))
+      using (var sr = new StreamReader(fs)) {
+        string input;
+        while ((input = sr.ReadLine()) != null && !input.Contains("NODE_COORD_SECTION")) {
+          if (input.Contains("DIMENSION:")) int.TryParse(input.Replace("DIMENSION:", string.Empty), out nrOfCities);
+          if (input.Contains("NUMBER OF ITEMS:")) int.TryParse(input.Replace("NUMBER OF ITEMS:", string.Empty), out nrOfItems);
+          if (input.Contains("CAPACITY OF KNAPSACK:")) int.TryParse(input.Replace("CAPACITY OF KNAPSACK:", string.Empty), out kspCapacity);
+          if (input.Contains("MIN SPEED:")) double.TryParse(input.Replace("MIN SPEED:", string.Empty), out ttpMinSpeed);
+          if (input.Contains("MAX SPEED:")) double.TryParse(input.Replace("MAX SPEED:", string.Empty), out ttpMaxSpeed);
+          if (input.Contains("RENTING RATIO:")) double.TryParse(input.Replace("RENTING RATIO:", string.Empty), out ttpRentingRatio);
+          if (input.Contains("EDGE_WEIGHT_TYPE:")) Enum.TryParse(input.Replace("EDGE_WEIGHT_TYPE:", string.Empty), out distanceType);
+        }
+
+        tspCoordinates = new double[nrOfCities, 2];
+        kspItemValues = new int[nrOfItems];
+        kspItemWeights = new int[nrOfItems];
+        ttpAvailability = new int[nrOfItems];
+
+        // read cities
+        while ((input = sr.ReadLine()) != null && !input.Contains("ITEMS SECTION")) {
+          string[] data = input.Split('\t');
+          int index; double x, y;
+          int.TryParse(data[0], out index);
+          double.TryParse(data[1], out x);
+          double.TryParse(data[2], out y);
+          tspCoordinates[index - 1, 0] = x;
+          tspCoordinates[index - 1, 1] = y;
+        }
+        // read items
+        while ((input = sr.ReadLine()) != null) {
+          string[] data = input.Split('\t');
+          int index, value, weight, city;
+          int.TryParse(data[0], out index);
+          int.TryParse(data[1], out value);
+          int.TryParse(data[2], out weight);
+          int.TryParse(data[3], out city);
+          kspItemValues[index - 1] = value;
+          kspItemWeights[index - 1] = weight;
+          ttpAvailability[index - 1] = city - 1;
+        }
+      }
+    }
+
+    public static double Evaluate(TravelingSalesmanProblem tsp, int[] tour, BinaryKnapsackProblem ksp, bool[] loot, Dictionary<int, int[]> availability, double rentingRatio, double minSpeed, double maxSpeed) {
+      double collectedWeight = 0.0;
+      double objectiveValue = 0.0;
+      double infeasibleBaseLine = -1000000.0;
+      double speedCoefficient = (maxSpeed - minSpeed) / ksp.KnapsackCapacity.Value;
+
+      int hideoutIdx = 0;
+      while (tour[hideoutIdx] != 0) hideoutIdx++;
+      int cityIdx = (hideoutIdx + 1) % tour.Length;
+      int lastCityIdx = hideoutIdx;
+
+      while (cityIdx != hideoutIdx) {
+        double oldCollectedWeight = collectedWeight;
+
+        foreach (var itemIdx in availability[tour[cityIdx]]) {
+          if (!loot[itemIdx]) continue;
+          collectedWeight += ksp.Weights[itemIdx];
+          objectiveValue += ksp.Values[itemIdx];
+        }
+
+        objectiveValue -= tsp.DistanceMatrix[tour[lastCityIdx], tour[cityIdx]] * rentingRatio / (maxSpeed - speedCoefficient * oldCollectedWeight);
+        lastCityIdx = cityIdx;
+        cityIdx = (cityIdx + 1) % tour.Length;
+      }
+
+      objectiveValue -= tsp.DistanceMatrix[tour[lastCityIdx], tour[hideoutIdx]] * rentingRatio / (maxSpeed - speedCoefficient * collectedWeight);
+
+      bool feasible = collectedWeight <= ksp.KnapsackCapacity.Value;
+      if (!feasible) objectiveValue = infeasibleBaseLine - collectedWeight;
+
+      return objectiveValue;
+    }
+
+    public static Dictionary<int, int[]> GetAvailability(int[] availability) {
+      return availability.Select((c, i) => Tuple.Create(c, i)).GroupBy(x => x.Item1).ToDictionary(k => k.Key, v => v.Select(x => x.Item2).ToArray());
+    }
+
+    public static double[,] GetDistances(DoubleMatrix coordinates, DistanceType distanceType) {
+      int nrOfNodes = coordinates.Rows;
+      var distances = new double[nrOfNodes, nrOfNodes];
+
+      for (int i = 1; i < nrOfNodes; i++)
+        for (int j = 0; j < i; j++)
+          distances[i, j] = distances[j, i] = Distance(coordinates, i, j, distanceType);
+
+      return distances;
+    }
+
+    private static double Distance(DoubleMatrix coordinates, int fromIdx, int toIdx, DistanceType distanceType) {
+      double fromX = coordinates[fromIdx, 0];
+      double fromY = coordinates[fromIdx, 1];
+      double toX = coordinates[toIdx, 0];
+      double toY = coordinates[toIdx, 1];
+
+      double distance = Math.Sqrt((toX - fromX) * (toX - fromX) + (toY - fromY) * (toY - fromY));
+
+      switch (distanceType) {
+        case DistanceType.CEIL_2D: return (int)Math.Ceiling(distance);
+        case DistanceType.EUC_2D: return distance;
+        default: return double.NaN;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/HeuristicLab.Networks.IntegratedOptimization.Views-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/HeuristicLab.Networks.IntegratedOptimization.Views-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/HeuristicLab.Networks.IntegratedOptimization.Views-3.3.csproj	(revision 15895)
@@ -0,0 +1,204 @@
+﻿<?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>{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.IntegratedOptimization.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.IntegratedOptimization.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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </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\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <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>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="OrchestratorNodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OrchestratorNodeView.Designer.cs">
+      <DependentUpon>OrchestratorNodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj">
+      <Project>{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}</Project>
+      <Name>HeuristicLab.Networks.IntegratedOptimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.Views\3.3\HeuristicLab.Networks.Views-3.3.csproj">
+      <Project>{792B263D-92BA-453A-BFDF-261511C2F63B}</Project>
+      <Name>HeuristicLab.Networks.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj">
+      <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
+      <Name>HeuristicLab.Networks-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,219 @@
+﻿namespace HeuristicLab.Networks.IntegratedOptimization.Views {
+  partial class OrchestratorNodeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.resultCollectionView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.startButton = new System.Windows.Forms.Button();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.prepareButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 462);
+      this.tabControl.TabIndex = 3;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(637, 436);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.AllowEditingOfHiddenParameters = true;
+      this.parameterCollectionView.Caption = "ParameterCollection View";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parameterCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.ReadOnly = false;
+      this.parameterCollectionView.ShowDetails = true;
+      this.parameterCollectionView.Size = new System.Drawing.Size(631, 430);
+      this.parameterCollectionView.TabIndex = 0;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 436);
+      this.portsTabPage.TabIndex = 1;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(631, 430);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Controls.Add(this.resultCollectionView);
+      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultsTabPage.Name = "resultsTabPage";
+      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.resultsTabPage.Size = new System.Drawing.Size(637, 436);
+      this.resultsTabPage.TabIndex = 2;
+      this.resultsTabPage.Text = "Results";
+      this.resultsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // resultCollectionView
+      // 
+      this.resultCollectionView.Caption = "ResultCollection View";
+      this.resultCollectionView.Content = null;
+      this.resultCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.resultCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.resultCollectionView.Name = "resultCollectionView";
+      this.resultCollectionView.ReadOnly = true;
+      this.resultCollectionView.ShowDetails = true;
+      this.resultCollectionView.Size = new System.Drawing.Size(631, 430);
+      this.resultCollectionView.TabIndex = 0;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Location = new System.Drawing.Point(0, 494);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(23, 23);
+      this.startButton.TabIndex = 4;
+      this.startButton.Text = "Start";
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Location = new System.Drawing.Point(29, 494);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(23, 23);
+      this.pauseButton.TabIndex = 5;
+      this.pauseButton.Text = "Pause";
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Location = new System.Drawing.Point(58, 494);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(23, 23);
+      this.stopButton.TabIndex = 6;
+      this.stopButton.Text = "Stop";
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // prepareButton
+      // 
+      this.prepareButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.prepareButton.Location = new System.Drawing.Point(87, 494);
+      this.prepareButton.Name = "prepareButton";
+      this.prepareButton.Size = new System.Drawing.Size(23, 23);
+      this.prepareButton.TabIndex = 7;
+      this.prepareButton.Text = "Prepare";
+      this.prepareButton.UseVisualStyleBackColor = true;
+      this.prepareButton.Click += new System.EventHandler(this.prepareButton_Click);
+      // 
+      // OrchestratorNodeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.prepareButton);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.pauseButton);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.tabControl);
+      this.Name = "OrchestratorNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.pauseButton, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.prepareButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private System.Windows.Forms.TabPage portsTabPage;
+    private Core.Networks.Views.PortCollectionView portCollectionView;
+    private System.Windows.Forms.Button startButton;
+    private Core.Views.ParameterCollectionView parameterCollectionView;
+    private System.Windows.Forms.TabPage resultsTabPage;
+    private Optimization.Views.ResultCollectionView resultCollectionView;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button prepareButton;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/OrchestratorNodeView.cs	(revision 15895)
@@ -0,0 +1,54 @@
+﻿using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.Views {
+  [View("OrchestratorNode View")]
+  [Content(typeof(OrchestratorNode), true)]
+  [Content(typeof(IOrchestratorNode), false)]
+  public partial class OrchestratorNodeView : NetworkItemView {
+    public new IOrchestratorNode Content {
+      get { return (IOrchestratorNode)base.Content; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        parameterCollectionView.Content = null;
+        portCollectionView.Content = null;
+        resultCollectionView.Content = null;
+      } else {
+        parameterCollectionView.Content = Content.Parameters;
+        portCollectionView.Content = Content.Ports;
+        resultCollectionView.Content = Content.Results;
+      }
+    }
+
+    public OrchestratorNodeView() {
+      InitializeComponent();
+      startButton.Text = string.Empty;
+      startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      pauseButton.Text = string.Empty;
+      pauseButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pause;
+      stopButton.Text = string.Empty;
+      stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      prepareButton.Text = string.Empty;
+      prepareButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Restart;
+    }
+
+    private void startButton_Click(object sender, System.EventArgs e) {
+      Content.StartAsync();
+    }
+
+    private void pauseButton_Click(object sender, System.EventArgs e) {
+      Content.PauseAsync();
+    }
+
+    private void stopButton_Click(object sender, System.EventArgs e) {
+      Content.StopAsync();
+    }
+
+    private void prepareButton_Click(object sender, System.EventArgs e) {
+      Content.PrepareAsync(false);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Networks.IntegratedOptimization.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.IntegratedOptimization.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.IntegratedOptimization.Views", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.IntegratedOptimization.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.IntegratedOptimization", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  public class HeuristicLabNetworksIntegratedOptimizationViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-201 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Networks.IntegratedOptimization.Views")]
+[assembly: AssemblyDescription("Views for integrated optimization with optimization networks")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("b7cbe751-c7ef-45ce-a59d-d8a5bbe6ca3e")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/HeuristicLab.Networks.IntegratedOptimization-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/HeuristicLab.Networks.IntegratedOptimization-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/HeuristicLab.Networks.IntegratedOptimization-3.3.csproj	(revision 15895)
@@ -0,0 +1,163 @@
+﻿<?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>{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.IntegratedOptimization</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.IntegratedOptimization-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Networks-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Networks-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="IOrchestratorNode.cs" />
+    <Compile Include="MaximizationVariegationProblem.cs" />
+    <Compile Include="MinimizationVariegationProblem.cs" />
+    <Compile Include="OrchestratedAlgorithmNode.cs" />
+    <Compile Include="OrchestrationMessage.cs" />
+    <Compile Include="OrchestratorNode.cs" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.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/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/IOrchestratorNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/IOrchestratorNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/IOrchestratorNode.cs	(revision 15895)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Threading.Tasks;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  public interface IOrchestratorNode : INode {
+    IKeyedItemCollection<string, IParameter> Parameters { get; }
+    ResultCollection Results { get; }
+
+    void Prepare(bool clearRuns = false);
+    Task PrepareAsync(bool clearRuns = false);
+    void Start();
+    Task StartAsync();
+    void Pause();
+    Task PauseAsync();
+    void Stop();
+    Task StopAsync();
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/KSPSolver.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/KSPSolver.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/KSPSolver.cs	(revision 15895)
@@ -0,0 +1,10 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  class KSPSolver {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MaximizationVariegationProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MaximizationVariegationProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MaximizationVariegationProblem.cs	(revision 15895)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  [Item("Maximization Variegation Problem", "")]
+  [StorableClass]
+  public class MaximizationVariegationProblem<TEncoding> : SingleObjectiveBasicProblem<TEncoding> where TEncoding : class, IEncoding {
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    protected MaximizationVariegationProblem(bool deserializing) : base(deserializing) { }
+    protected MaximizationVariegationProblem(MaximizationVariegationProblem<TEncoding> original, Cloner cloner) : base(original, cloner) { }
+    public MaximizationVariegationProblem() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MaximizationVariegationProblem<TEncoding>(this, cloner);
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) { return 0.0; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MinimizationVariegationProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MinimizationVariegationProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/MinimizationVariegationProblem.cs	(revision 15895)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  [Item("Minimization Variegation Problem", "")]
+  [StorableClass]
+  public class MinimizationVariegationProblem<TEncoding> : SingleObjectiveBasicProblem<TEncoding> where TEncoding : class, IEncoding {
+    public override bool Maximization {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected MinimizationVariegationProblem(bool deserializing) : base(deserializing) { }
+    protected MinimizationVariegationProblem(MinimizationVariegationProblem<TEncoding> original, Cloner cloner) : base(original, cloner) { }
+    public MinimizationVariegationProblem() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MinimizationVariegationProblem<TEncoding>(this, cloner);
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) { return 0.0; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratedAlgorithmNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratedAlgorithmNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratedAlgorithmNode.cs	(revision 15895)
@@ -0,0 +1,244 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  [Item("OrchestratedAlgorithmNode", "A node of a network which contains a HeuristicLab algorithm and can be orchestrated by an orchestrator.")]
+  [StorableClass]
+  public class OrchestratedAlgorithmNode : AlgorithmNode {
+    #region Constants
+    private const string OrchestrationPortName = "OrchestrationPort";
+    private const string EvaluationPortName = "EvaluationPort";
+    #endregion
+
+    private bool sendResultMessage = true;
+
+    #region Ports
+    public IMessagePort OrchestrationPort {
+      get { return (IMessagePort)Ports[OrchestrationPortName]; }
+    }
+    public IMessagePort EvaluationPort {
+      get { return (IMessagePort)Ports[EvaluationPortName]; }
+    }
+    #endregion
+
+    [Storable]
+    private IHookOperator evalHook;
+    public IHookOperator EvalHook {
+      get { return evalHook; }
+      set {
+        if (evalHook == value) return;
+        evalHook = value;
+        evalHook.Port = EvaluationPort;
+      }
+    }
+
+    [StorableConstructor]
+    protected OrchestratedAlgorithmNode(bool deserializing) : base(deserializing) { }
+    protected OrchestratedAlgorithmNode(OrchestratedAlgorithmNode original, Cloner cloner)
+      : base(original, cloner) {
+      EvalHook = cloner.Clone(original.EvalHook);
+      RegisterEvents();
+    }
+    public OrchestratedAlgorithmNode() : this("OrchestratedAlgorithmNode") { }
+    public OrchestratedAlgorithmNode(string name)
+      : base(name) {
+      Ports.Add(CreateOrchestrationPort<IProblem>(OrchestrationPortName));
+      Ports.Add(CreateEvaluationPort<IItem>(EvaluationPortName, "Solution", "Quality"));
+
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrchestratedAlgorithmNode(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      OrchestrationPort.MessageReceived += OrchestrationPort_MessageReceived;
+    }
+
+    protected IMessagePort CreateOrchestrationPort<T>(string portName) where T : class, IProblem {
+      var orchestrationPort = new MessagePort(portName);
+      orchestrationPort.Parameters.Add(new PortParameter<EnumValue<OrchestrationMessage>>("OrchestrationMessage") {
+        Type = PortParameterType.Input
+      });
+      orchestrationPort.Parameters.Add(new PortParameter<T>("Problem") {
+        Type = PortParameterType.Input
+      });
+      orchestrationPort.Parameters.Add(new PortParameter<ResultCollection>("Results") {
+        Type = PortParameterType.Output
+      });
+      return orchestrationPort;
+    }
+
+    protected IMessagePort CreateEvaluationPort<T>(string portName, string solutionName, string qualityName) where T : class, IItem {
+      var evaluationPort = new MessagePort(portName);
+      evaluationPort.Parameters.Add(new PortParameter<T>(solutionName) {
+        Type = PortParameterType.Output
+      });
+      evaluationPort.Parameters.Add(new PortParameter<DoubleValue>(qualityName) {
+        Type = PortParameterType.Input | PortParameterType.Output
+      });
+      return evaluationPort;
+    }
+
+    #region Port Events
+    private void OrchestrationPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var requestMessage = e.Value;
+      var messageFlags = ((EnumValue<OrchestrationMessage>)requestMessage["OrchestrationMessage"]).Value;
+
+      #region Prepare
+      if (messageFlags.HasFlag(OrchestrationMessage.Prepare)) {
+        switch (Algorithm.ExecutionState) {
+          case ExecutionState.Prepared:
+          case ExecutionState.Paused:
+          case ExecutionState.Stopped:
+            var problem = (IProblem)requestMessage["Problem"];
+            if (problem != null) {
+              problem = (IProblem)problem.Clone();
+
+              var heuristicOptimizationProblem = problem as IHeuristicOptimizationProblem;
+              if (heuristicOptimizationProblem != null && messageFlags.HasFlag(OrchestrationMessage.SetEvalHook)) {
+                var instEval = heuristicOptimizationProblem.Evaluator as InstrumentedOperator;
+                if (instEval != null && EvalHook != null) instEval.AfterExecutionOperators.Add(EvalHook);
+              }
+
+              IParameter analyzerParameter = null;
+              IMultiAnalyzer multiAnalyzer = null;
+              var checkedStates = new Dictionary<Type, bool>();
+              if (Algorithm.Parameters.TryGetValue("Analyzer", out analyzerParameter)) {
+                multiAnalyzer = analyzerParameter.ActualValue as IMultiAnalyzer;
+                foreach (var item in multiAnalyzer.Operators)
+                  checkedStates.Add(item.GetType(), multiAnalyzer.Operators.ItemChecked(item));
+              }
+
+              Algorithm.Problem = problem;
+
+              if (multiAnalyzer != null) {
+                if (Algorithm.Parameters.TryGetValue("Analyzer", out analyzerParameter)) {
+                  multiAnalyzer = analyzerParameter.ActualValue as IMultiAnalyzer;
+                  if (multiAnalyzer != null && checkedStates.Any()) {
+                    foreach (var analyzer in multiAnalyzer.Operators) {
+                      bool checkedState;
+                      if (!checkedStates.TryGetValue(analyzer.GetType(), out checkedState))
+                        checkedState = analyzer.EnabledByDefault;
+                      multiAnalyzer.Operators.SetItemCheckedState(analyzer, checkedState);
+                    }
+                  }
+                }
+              }
+            }
+
+
+            Algorithm.Prepare(messageFlags.HasFlag(OrchestrationMessage.ClearRuns));
+            break;
+        }
+      }
+      #endregion
+
+      #region Start
+      if (messageFlags.HasFlag(OrchestrationMessage.Start)) {
+        switch (Algorithm.ExecutionState) {
+          case ExecutionState.Prepared:
+          case ExecutionState.Paused:
+            var trigger = new ManualResetEvent(false);
+            Exception ex = null;
+
+            EventHandler onStopped = null;
+            EventHandler<EventArgs<Exception>> onExceptionOccurred = null;
+            Algorithm.Stopped += onStopped = (src, args) => {
+              Algorithm.Stopped -= onStopped;
+              Algorithm.ExceptionOccurred -= onExceptionOccurred;
+              trigger.Set();
+            };
+            Algorithm.ExceptionOccurred += onExceptionOccurred = (src, args) => {
+              Algorithm.Stopped -= onStopped;
+              Algorithm.ExceptionOccurred -= onExceptionOccurred;
+              ex = args.Value;
+              trigger.Set();
+            };
+
+            Algorithm.Start();
+            trigger.WaitOne();
+
+            if (ex != null) throw ex;
+
+            if (sendResultMessage) {
+              requestMessage["Results"] = (ResultCollection)Algorithm.Results.Clone();
+              var responseMessage = OrchestrationPort.PrepareMessage();
+              responseMessage["Results"] = (ResultCollection)Algorithm.Results.Clone();
+              OrchestrationPort.SendMessage(responseMessage);
+            } else sendResultMessage = true;
+            break;
+        }
+      }
+      #endregion
+
+      #region Pause
+      if (messageFlags.HasFlag(OrchestrationMessage.Pause)) {
+        if (Algorithm.ExecutionState == ExecutionState.Started) {
+          sendResultMessage = false;
+          try {
+            Algorithm.Pause();
+          } catch (InvalidOperationException) {
+            // ExecutionState might have changed since we accepted the message
+          }
+        }
+      }
+      #endregion
+
+      #region Stop
+      if (messageFlags.HasFlag(OrchestrationMessage.Stop)) {
+        switch (Algorithm.ExecutionState) {
+          case ExecutionState.Started:
+          case ExecutionState.Paused:
+            try {
+              Algorithm.Stop();
+            } catch (InvalidOperationException) {
+              // ExecutionState might have changed since we accepted the message
+            } catch (NullReferenceException) {
+              // BasicAlgorithm might have stopped since we accepted the message
+              // CancellationTokenSource is null in this case
+            }
+            break;
+        }
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestrationMessage.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestrationMessage.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestrationMessage.cs	(revision 15895)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  [Flags]
+  public enum OrchestrationMessage {
+    Unknown = 0,
+    Prepare = 1,
+    Start = 1 << 1,       // 2
+    Pause = 1 << 2,       // 4
+    Stop = 1 << 3,        // 8
+    SetEvalHook = 1 << 8, // 256
+    ClearRuns = 1 << 9,   // 512
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratorNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratorNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/OrchestratorNode.cs	(revision 15895)
@@ -0,0 +1,168 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  [Item("OrchestratorNode", "An orchestrator node.")]
+  [StorableClass]
+  public abstract class OrchestratorNode : Node, IOrchestratorNode {
+    [Storable]
+    private ParameterCollection parameters;
+    protected ParameterCollection Parameters {
+      get { return parameters; }
+    }
+    private ReadOnlyKeyedItemCollection<string, IParameter> readOnlyParameters;
+    IKeyedItemCollection<string, IParameter> IOrchestratorNode.Parameters {
+      get {
+        if (readOnlyParameters == null) readOnlyParameters = parameters.AsReadOnly();
+        return readOnlyParameters;
+      }
+    }
+
+    [Storable]
+    private ResultCollection results;
+    public ResultCollection Results {
+      get { return results; }
+    }
+
+    [StorableConstructor]
+    protected OrchestratorNode(bool deserializing) : base(deserializing) { }
+    protected OrchestratorNode(OrchestratorNode original, Cloner cloner) : base(original, cloner) {
+      results = cloner.Clone(original.results);
+      parameters = cloner.Clone(original.parameters);
+      readOnlyParameters = null;
+      RegisterEvents();
+    }
+
+    protected OrchestratorNode() : base("OrchestratorNode") {
+      results = new ResultCollection();
+      parameters = new ParameterCollection();
+      readOnlyParameters = null;
+    }
+    protected OrchestratorNode(string name) : base(name) {
+      results = new ResultCollection();
+      parameters = new ParameterCollection();
+      readOnlyParameters = null;
+    }
+    protected OrchestratorNode(string name, string description) : base(name, description) {
+      results = new ResultCollection();
+      parameters = new ParameterCollection();
+      readOnlyParameters = null;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      foreach (var p in Ports) RegisterPortEvents(p);
+    }
+
+    protected IMessagePort CreateOrchestrationPort<T>(string portName) where T : class, IProblem {
+      var orchestrationPort = new MessagePort(portName);
+      orchestrationPort.Parameters.Add(new PortParameter<EnumValue<OrchestrationMessage>>("OrchestrationMessage") {
+        Type = PortParameterType.Output
+      });
+      orchestrationPort.Parameters.Add(new PortParameter<T>("Problem") {
+        Type = PortParameterType.Output
+      });
+      orchestrationPort.Parameters.Add(new PortParameter<ResultCollection>("Results") {
+        Type = PortParameterType.Input
+      });
+      return orchestrationPort;
+    }
+
+    protected IMessagePort CreateEvaluationPort<T>(string portName, string solutionName, string qualityName) where T : class, IItem {
+      var evaluationPort = new MessagePort(portName);
+      evaluationPort.Parameters.Add(new PortParameter<T>(solutionName) {
+        Type = PortParameterType.Input
+      });
+      evaluationPort.Parameters.Add(new PortParameter<DoubleValue>(qualityName) {
+        Type = PortParameterType.Input | PortParameterType.Output
+      });
+      return evaluationPort;
+    }
+
+    protected virtual void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) { }
+
+    public abstract void Prepare(bool clearRuns = false);
+    public async Task PrepareAsync(bool clearRuns = false) { await Task.Run(() => Prepare(clearRuns)); }
+    public abstract void Start();
+    public async Task StartAsync() { await Task.Run(() => Start()); }
+    public abstract void Pause();
+    public async Task PauseAsync() { await Task.Run(() => Pause()); }
+    public abstract void Stop();
+    public async Task StopAsync() { await Task.Run(() => Stop()); }
+
+    #region Events
+    protected override void Ports_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsAdded(sender, e);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsRemoved(sender, e);
+      foreach (var p in e.Items)
+        DeregisterPortEvents(p);
+    }
+    protected override void Ports_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsReplaced(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_CollectionReset(object sender, CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_CollectionReset(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    private void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      ProcessMessage(e.Value, (IMessagePort)sender, e.Value2);
+    }
+    #endregion
+
+    #region Port Events
+    protected virtual void RegisterPortEvents(IPort port) {
+      var mp = port as IMessagePort;
+      if (mp != null)
+        mp.MessageReceived += MessagePort_MessageReceived;
+    }
+    protected virtual void DeregisterPortEvents(IPort port) {
+      var mp = port as IMessagePort;
+      if (mp != null)
+        mp.MessageReceived -= MessagePort_MessageReceived;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Networks.IntegratedOptimization {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.IntegratedOptimization plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.IntegratedOptimization", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.IntegratedOptimization-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabNetworksIntegratedOptimizationPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Networks.IntegratedOptimization")]
+[assembly: AssemblyDescription("Classes for integrated optimization with optimization networks")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeursiticLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("b6263d3e-dcaf-42b0-a440-3deef1ff0429")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/TSPSolver.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/TSPSolver.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization/3.3/TSPSolver.cs	(revision 15895)
@@ -0,0 +1,10 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Networks.IntegratedOptimization {
+  class TSPSolver {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddNodesChartMode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddNodesChartMode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddNodesChartMode.cs	(revision 15895)
@@ -0,0 +1,133 @@
+﻿#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.Drawing.Drawing2D;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
+  public class AddNodesChartMode : ChartMode {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public override Image Image { get { return VSImageLibrary.RadialChart; } }
+    public override string Text { get { return "Add &Nodes"; } }
+    public override string ToolTipText { get { return "Add Nodes"; } }
+
+    public AddNodesChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      try {
+        if (!(chartControl.Tag is IUserDefinedNetwork)) return;
+
+        chartControl.RefreshPicture();
+
+        var size = new Size(200, 100);
+
+        using (var graphics = chartControl.CreatePictureGraphics())
+        using (var pen = new Pen(Color.Gray) { DashStyle = DashStyle.Dash }) {
+          graphics.DrawRectangle(pen,
+            (int)Math.Round(e.X - size.Width * 0.5),
+            (int)Math.Round(e.Y - size.Height * 0.5),
+            size.Width,
+            size.Height);
+        }
+
+      } finally {
+        chartControl.UpdatePicture();
+        base.HandleOnMouseMove(sender, e);
+      }
+    }
+
+    public override void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var network = chartControl.Tag as IUserDefinedNetwork;
+            if (network == null) return;
+
+            var node = CreateNode(network);
+            if (node == null) return;
+
+            var center = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var size = chartControl.Chart.TransformPixelToWorld(new Size(100, 50));
+            var lowerLeft = center - new Offset(size);
+            var upperRight = center + new Offset(size);
+            node.VisualProperties = new NodeVisualProperties {
+              LowerLeft = new Point2D<double>(lowerLeft.X, lowerLeft.Y),
+              UpperRight = new Point2D<double>(upperRight.X, upperRight.Y)
+            };
+            network.Nodes.Add(node);
+            break;
+        }
+      } finally {
+        base.HandleOnMouseDown(sender, e);
+      }
+    }
+
+    public override void HandleOnMouseLeave(object sender, EventArgs e) {
+      chartControl.RefreshPicture();
+      base.HandleOnMouseLeave(sender, e);
+    }
+
+    #region Helpers
+    protected virtual INode CreateNode(INetwork network) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Node";
+        typeSelectorDialog.TypeSelector.Caption = "Available Nodes";
+        typeSelectorDialog.TypeSelector.Configure(typeof(INode), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(chartControl) == DialogResult.OK) {
+        try {
+          var n = (INode)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          n.Name = GetUniqueName(n.Name, network);
+          return n;
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(chartControl, ex);
+        }
+      }
+      return null;
+    }
+
+    protected virtual string GetUniqueName(string originalName, INetwork network) {
+      if (!network.Nodes.ContainsKey(originalName))
+        return originalName;
+
+      string name;
+      int index = 0;
+      do {
+        index++;
+        name = originalName + index;
+      } while (network.Nodes.ContainsKey(name));
+      return name;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddPortsChartMode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddPortsChartMode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/AddPortsChartMode.cs	(revision 15895)
@@ -0,0 +1,141 @@
+﻿#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.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
+  public class AddPortsChartMode : ChartMode {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public override Image Image { get { return VSImageLibrary.Interface; } }
+    public override string Text { get { return "Add Por&ts"; } }
+    public override string ToolTipText { get { return "Add Ports"; } }
+
+    public AddPortsChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      try {
+        if (!(chartControl.Tag is IUserDefinedNetwork)) return;
+
+        chartControl.RefreshPicture();
+
+        var nodeRectangles = chartControl.Chart.GetAllPrimitives(e.Location).OfType<NodeRectangle>();
+        var nodeRectangle = nodeRectangles.FirstOrDefault();
+        if (nodeRectangle == null) return;
+
+        var size = chartControl.Chart.TransformWorldToPixel(nodeRectangle.Size);
+        var ll = chartControl.Chart.TransformWorldToPixel(nodeRectangle.LowerLeft);
+        var ur = chartControl.Chart.TransformWorldToPixel(nodeRectangle.UpperRight);
+
+        var node = nodeRectangle.NetworkItem;
+        bool nodeValid = node is IAlgorithmNode || node is IUserDefinedNode;
+
+        using (var graphics = chartControl.CreatePictureGraphics())
+        using (var pen = new Pen(nodeValid ? Color.Green : Color.Red) { Width = 2f }) {
+          graphics.DrawRectangle(pen,
+            ll.X,
+            ur.Y,
+            size.Width,
+            size.Height);
+        }
+      } finally {
+        chartControl.UpdatePicture();
+        base.HandleOnMouseMove(sender, e);
+      }
+    }
+
+    public override void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            if (!(chartControl.Tag is IUserDefinedNetwork)) return;
+
+            var nodeRectangles = chartControl.Chart.GetAllPrimitives(e.Location).OfType<NodeRectangle>();
+            var nodeRectangle = nodeRectangles.FirstOrDefault();
+            if (nodeRectangle == null) return;
+
+            var node = nodeRectangle.NetworkItem;
+            bool nodeValid = node is IAlgorithmNode || node is IUserDefinedNode;
+            if (!nodeValid) return;
+
+            var port = CreatePort(node);
+            if (port == null) return;
+
+            var algNode = node as IAlgorithmNode;
+            if (algNode != null) {
+              algNode.Ports.Add(port);
+              return;
+            }
+
+            var userDefNode = (IUserDefinedNode)node;
+            userDefNode.Ports.Add(port);
+            break;
+        }
+      } finally {
+        base.HandleOnMouseDown(sender, e);
+      }
+    }
+
+    #region Helpers
+    protected virtual IPort CreatePort(INode node) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Port";
+        typeSelectorDialog.TypeSelector.Caption = "Available Ports";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IPort), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(chartControl) == DialogResult.OK) {
+        try {
+          var n = (IPort)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          n.Name = GetUniqueName(n.Name, node);
+          return n;
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(chartControl, ex);
+        }
+      }
+      return null;
+    }
+
+    protected virtual string GetUniqueName(string originalName, INode node) {
+      if (!node.Ports.ContainsKey(originalName))
+        return originalName;
+
+      string name;
+      int index = 0;
+      do {
+        index++;
+        name = originalName + index;
+      } while (node.Ports.ContainsKey(name));
+      return name;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/ConnectPortsChartMode.cs	(revision 15895)
@@ -0,0 +1,153 @@
+﻿#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.Drawing.Drawing2D;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization.Views.ChartModes {
+  public class ConnectPortsChartMode : ChartMode {
+    protected PortRectangle startPortRectangle, endPortRectangle;
+
+    public override Image Image { get { return VSImageLibrary.OrgChart; } }
+    public override string Text { get { return "&Connect Ports"; } }
+    public override string ToolTipText { get { return "Connect Ports"; } }
+
+    public ConnectPortsChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      try {
+        if (!(chartControl.Tag is IUserDefinedNetwork)) return;
+
+        chartControl.RefreshPicture();
+
+        var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+        var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>();
+        var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive));
+        var currentPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation));
+
+        // TODO: highlight allowed port connections only
+
+        using (var graphics = chartControl.CreatePictureGraphics()) {
+          Point startLocation = Point.Empty;
+          if (startPortRectangle != null) {
+            DrawCircleAroundPortRectangle(graphics, startPortRectangle, startPortRectangle.NetworkItem is IConnectablePort);
+            startLocation = chartControl.Chart.TransformWorldToPixel(startPortRectangle.Point);
+          }
+
+          Point endLocation = e.Location;
+          if (currentPortRectangle != null && (startPortRectangle != null || e.Button == MouseButtons.None)) {
+            DrawCircleAroundPortRectangle(graphics, currentPortRectangle, currentPortRectangle.NetworkItem is IConnectablePort);
+            endLocation = chartControl.Chart.TransformWorldToPixel(currentPortRectangle.Point);
+          }
+
+          bool connectionValid = startPortRectangle != null && startPortRectangle.NetworkItem is IConnectablePort;
+          connectionValid &= currentPortRectangle == null || currentPortRectangle.NetworkItem is IConnectablePort;
+
+          if (startPortRectangle != null)
+            DrawLineBetweenLocations(graphics, startLocation, endLocation, connectionValid);
+        }
+      } finally {
+        chartControl.UpdatePicture();
+        base.HandleOnMouseMove(sender, e);
+      }
+    }
+
+    public override void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      try {
+        var network = chartControl.Tag as IUserDefinedNetwork;
+        if (network == null) return;
+
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>();
+            var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive));
+            startPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation));
+            break;
+        }
+      } finally {
+        base.HandleOnMouseDown(sender, e);
+      }
+    }
+
+    public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
+      try {
+        var network = chartControl.Tag as IUserDefinedNetwork;
+        if (network == null) return;
+
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>();
+            var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive));
+            endPortRectangle = (PortRectangle)portRectangles.FirstOrDefault(x => x.ContainsPoint(worldLocation));
+
+            if (startPortRectangle == endPortRectangle || startPortRectangle == null || endPortRectangle == null) {
+              startPortRectangle = null;
+              endPortRectangle = null;
+              return;
+            }
+
+            var startPort = (IConnectablePort)startPortRectangle.NetworkItem;
+            var endPort = (IConnectablePort)endPortRectangle.NetworkItem;
+
+            // TODO: check if port connection is allowed
+
+            startPort.ConnectedPort = endPort;
+
+            startPortRectangle = null;
+            endPortRectangle = null;
+            break;
+        }
+      } finally {
+        base.HandleOnMouseUp(sender, e);
+      }
+    }
+
+    #region Helpers
+    protected virtual void DrawCircleAroundPortRectangle(Graphics graphics, PortRectangle portRectangle, bool valid) {
+      var centerP = chartControl.Chart.TransformWorldToPixel(portRectangle.Point);
+      int a = (int)Math.Round(portRectangle.Size.Width / 2.0 * Math.Sqrt(2));
+      int b = (int)Math.Round(portRectangle.Size.Height / 2.0 * Math.Sqrt(2));
+
+      using (var pen = new Pen(valid ? Color.Green : Color.Red) { Width = 2f }) {
+        graphics.DrawEllipse(pen,
+          centerP.X - a,
+          centerP.Y - b,
+          a * 2,
+          b * 2);
+      }
+    }
+
+    protected virtual void DrawLineBetweenLocations(Graphics graphics, Point startLocation, Point endLocation, bool valid) {
+      using (var pen = new Pen(valid ? Color.Green : Color.Red) { DashStyle = DashStyle.Dash, Width = 2f })
+        graphics.DrawLine(pen, startLocation.X, startLocation.Y, endLocation.X, endLocation.Y);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/SelectChartMode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/SelectChartMode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/ChartModes/SelectChartMode.cs	(revision 15895)
@@ -0,0 +1,194 @@
+﻿#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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
+  public class SelectChartMode : Visualization.SelectChartMode {
+    protected PortRectangle selectedPortRectangle;
+    protected NodeRectangle constrainingNodeRectangle;
+
+    public SelectChartMode(ChartControl control) : base(control) { }
+
+    protected override void OnDeselected() {
+      try {
+        chartControl.SuspendRendering();
+        if (selectedPortRectangle != null) {
+          selectedPortRectangle.Selected = false;
+          selectedPortRectangle = null;
+          constrainingNodeRectangle = null;
+        }
+      } finally {
+        chartControl.ResumeRendering();
+        base.OnDeselected();
+      }
+    }
+
+    public override void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            chartControl.SuspendRendering();
+
+            if (selectedPortRectangle != null) {
+              selectedPortRectangle.Selected = false;
+              selectedPortRectangle = null;
+              constrainingNodeRectangle = null;
+            }
+
+            var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>();
+            foreach (var nodeRectangle in nodeRectangles) {
+              var node = nodeRectangle.NetworkItem;
+              var portRectangles = node.Ports.Select(nodeRectangle.GetPortPrimitive).OfType<PortRectangle>();
+              foreach (var portRectangle in portRectangles) {
+                portRectangle.Selected = selectedPortRectangle == null && portRectangle.ContainsPoint(worldLocation);
+                if (portRectangle.Selected) {
+                  selectedPortRectangle = portRectangle;
+                  constrainingNodeRectangle = nodeRectangle;
+                  break;
+                }
+              }
+            }
+
+            if (selectedPortRectangle != null)
+              foreach (var sp in chartControl.Chart.Group.SelectedPrimitives) {
+                sp.Selected = false;
+                OnSelectedPrimitivesChanged();
+              } else base.HandleOnMouseDown(sender, e);
+            break;
+        }
+      } finally {
+        chartControl.ResumeRendering();
+      }
+    }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      if (selectedPortRectangle != null) {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var point = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var lowerLeft = constrainingNodeRectangle.LowerLeft;
+            var upperRight = constrainingNodeRectangle.UpperRight;
+
+            if (point.X < lowerLeft.X) point.X = lowerLeft.X;
+            else if (point.X > upperRight.X) point.X = upperRight.X;
+            if (point.Y < lowerLeft.Y) point.Y = lowerLeft.Y;
+            else if (point.Y > upperRight.Y) point.Y = upperRight.Y;
+
+            double dS = lowerLeft.Y - point.Y;
+            double dW = lowerLeft.X - point.X;
+
+            double dX = upperRight.X - point.X; // dE
+            if (Math.Abs(dX) > Math.Abs(dW)) dX = dW;
+            double dY = upperRight.Y - point.Y; // dN
+            if (Math.Abs(dY) > Math.Abs(dS)) dY = dS;
+
+            var offset = Offset.Empty;
+            if (Math.Abs(dX) < Math.Abs(dY)) offset.DX = dX;
+            else offset.DY = dY;
+
+            point = point + offset;
+            offset = point - selectedPortRectangle.Point;
+            try {
+              chartControl.SuspendRendering();
+              selectedPortRectangle.Move(offset);
+            } finally { chartControl.ResumeRendering(); }
+            break;
+        }
+      } else
+        base.HandleOnMouseMove(sender, e);
+      previousLocation = e.Location;
+    }
+
+    public override void HandleOnMouseDoubleClick(object sender, MouseEventArgs e) {
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var nodeRectangle = chartControl.Chart.GetPrimitive(e.Location) as NodeRectangle;
+            if (nodeRectangle != null)
+              MainForm.MainFormManager.MainForm.ShowContent(nodeRectangle.NetworkItem);
+            break;
+        }
+      } finally {
+        base.HandleOnMouseDoubleClick(sender, e);
+      }
+    }
+
+    protected override void DeleteSelectedPrimitives() {
+      if (!(chartControl.Tag is IUserDefinedNetwork)) return;
+
+      try {
+        chartControl.SuspendRendering();
+
+        var connectionLines = chartControl.Chart.Group.Primitives.OfType<ConnectionLine>().ToList();
+        var nodeRectangles = chartControl.Chart.Group.Primitives.OfType<NodeRectangle>().ToList();
+        var portRectangles = nodeRectangles.SelectMany(x => x.NetworkItem.Ports.Select(x.GetPortPrimitive)).OfType<PortRectangle>().ToList();
+
+        var deletedNodes = new HashSet<INode>();
+        var deletedPorts = new HashSet<IMessagePort>();
+
+        foreach (var nodeRectangle in nodeRectangles) {
+          if (nodeRectangle.Selected) {
+            var node = nodeRectangle.NetworkItem;
+            if (node == null) continue;
+            deletedNodes.Add(node);
+            foreach (var port in node.Ports.OfType<IMessagePort>())
+              deletedPorts.Add(port);
+          }
+        }
+
+        foreach (var portRectangle in portRectangles) {
+          if (portRectangle.Selected) {
+            var port = portRectangle.NetworkItem as IMessagePort;
+            if (port == null) continue;
+            port.Parent.Ports.Remove(port);
+            deletedPorts.Add(port);
+          }
+        }
+
+        selectedPortRectangle = null;
+
+        foreach (var connectionLine in connectionLines) {
+          var startPortRectangle = connectionLine.StartPortRectangle;
+          var endPortRectangle = connectionLine.EndPortRectangle;
+          if (startPortRectangle == null || endPortRectangle == null) continue;
+
+          var startPort = startPortRectangle.NetworkItem as IMessagePort;
+          var endPort = endPortRectangle.NetworkItem as IMessagePort;
+          if (startPort == null || endPort == null) continue;
+
+          if (connectionLine.Selected || deletedPorts.Contains(startPort) || deletedPorts.Contains(endPort))
+            startPort.ConnectedPort = null;
+        }
+
+        foreach (var node in deletedNodes)
+          node.Parent.Nodes.Remove(node);
+      } finally { chartControl.ResumeRendering(); }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3.csproj	(revision 15895)
@@ -0,0 +1,180 @@
+﻿<?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>{A1EFA7B2-C288-4342-8318-27F4D2F29C18}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.Views.NetworkVisualization.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </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\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization-3.3, Version=3.3.0.12537, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Visualization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="ChartModes\AddNodesChartMode.cs" />
+    <Compile Include="ChartModes\AddPortsChartMode.cs" />
+    <Compile Include="ChartModes\SelectChartMode.cs" />
+    <Compile Include="ChartModes\ConnectPortsChartMode.cs" />
+    <Compile Include="NetworkVisualizationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NetworkVisualizationView.Designer.cs">
+      <DependentUpon>NetworkVisualizationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.Views.NetworkVisualization\3.3\HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj">
+      <Project>{b76a8cf7-be2a-4ce7-943d-ab19a7cc7798}</Project>
+      <Name>HeuristicLab.Networks.Views.NetworkVisualization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks.Views\3.3\HeuristicLab.Networks.Views-3.3.csproj">
+      <Project>{792b263d-92ba-453a-bfdf-261511c2f63b}</Project>
+      <Name>HeuristicLab.Networks.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj">
+      <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
+      <Name>HeuristicLab.Networks-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.Designer.cs	(revision 15895)
@@ -0,0 +1,149 @@
+﻿namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
+  partial class NetworkVisualizationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.chartControl = new HeuristicLab.Visualization.ChartControl();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.detailsToggleButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // chartControl
+      // 
+      this.chartControl.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.chartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.chartControl.Location = new System.Drawing.Point(3, 3);
+      this.chartControl.Mode = null;
+      this.chartControl.Name = "chartControl";
+      this.chartControl.ScaleOnResize = true;
+      this.chartControl.ShowToolBar = true;
+      this.chartControl.Size = new System.Drawing.Size(408, 482);
+      this.chartControl.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+      this.chartControl.TabIndex = 3;
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(3, 26);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.detailsToggleButton);
+      this.splitContainer.Panel1.Controls.Add(this.chartControl);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(639, 488);
+      this.splitContainer.SplitterDistance = 439;
+      this.splitContainer.TabIndex = 4;
+      // 
+      // detailsToggleButton
+      // 
+      this.detailsToggleButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.detailsToggleButton.Location = new System.Drawing.Point(417, 3);
+      this.detailsToggleButton.Name = "detailsToggleButton";
+      this.detailsToggleButton.Size = new System.Drawing.Size(19, 482);
+      this.detailsToggleButton.TabIndex = 4;
+      this.detailsToggleButton.Text = ">";
+      this.detailsToggleButton.UseVisualStyleBackColor = true;
+      this.detailsToggleButton.Click += new System.EventHandler(this.detailsToggleButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(190, 482);
+      this.detailsGroupBox.TabIndex = 1;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // viewHost
+      // 
+      this.viewHost.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.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(178, 457);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // NetworkVisualizationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "NetworkVisualizationView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.splitContainer, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private Visualization.ChartControl chartControl;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.Button detailsToggleButton;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private MainForm.WindowsForms.ViewHost viewHost;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/NetworkVisualizationView.cs	(revision 15895)
@@ -0,0 +1,262 @@
+﻿#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 System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Networks.Views.NetworkVisualization.Views.ChartModes;
+using HeuristicLab.Visualization;
+using HeuristicLab.Visualization.ChartModes;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
+  [View("Network Visualization View")]
+  [Content(typeof(Network), false)]
+  [Content(typeof(INetwork), false)]
+  public partial class NetworkVisualizationView : NetworkItemView {
+    private Dictionary<string, IPrimitive> primitiveDict = new Dictionary<string, IPrimitive>();
+
+    public new INetwork Content {
+      get { return (INetwork)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NetworkVisualizationView() {
+      InitializeComponent();
+
+      var selectMode = new SelectChartMode(chartControl);
+      selectMode.SelectedPrimitivesChanged += SelectMode_SelectedPrimitivesChanged;
+      chartControl.AddChartModes(
+        selectMode,
+        new PanChartMode(chartControl),
+        new RulerChartMode(chartControl),
+        new ZoomInChartMode(chartControl),
+        new ZoomOutChartMode(chartControl),
+        new AddNodesChartMode(chartControl),
+        new AddPortsChartMode(chartControl),
+        new ConnectPortsChartMode(chartControl)
+      );
+      chartControl.Mode = selectMode;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      bool doLayout = Content != null && Content.Nodes.Any(x => x.VisualProperties == null);
+      UpdateContent();
+      if (doLayout) {
+        LayoutNodes();
+        LayoutPorts();
+      }
+      chartControl.Tag = Content;
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Nodes.ItemsAdded += Nodes_ItemsAdded;
+      Content.Nodes.ItemsRemoved += Nodes_ItemsRemoved;
+      Content.Nodes.ItemsReplaced += Nodes_ItemsReplaced;
+      Content.Ports.ItemsAdded += Ports_ItemsAdded;
+      Content.Ports.ItemsRemoved += Ports_ItemsRemoved;
+      Content.Ports.ItemsReplaced += Ports_ItemsReplaced;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Nodes.ItemsAdded -= Nodes_ItemsAdded;
+      Content.Nodes.ItemsRemoved -= Nodes_ItemsRemoved;
+      Content.Nodes.ItemsReplaced -= Nodes_ItemsReplaced;
+      Content.Ports.ItemsAdded -= Ports_ItemsAdded;
+      Content.Ports.ItemsRemoved -= Ports_ItemsRemoved;
+      Content.Ports.ItemsReplaced -= Ports_ItemsReplaced;
+      base.DeregisterContentEvents();
+    }
+
+    #region Event Handlers
+    private void SelectMode_SelectedPrimitivesChanged(object sender, EventArgs e) {
+      var selectedPrimitives = chartControl.Chart.Group.SelectedPrimitives;
+      var nodePrimitive = selectedPrimitives.OfType<NodeRectangle>().SingleOrDefault();
+      viewHost.Content = nodePrimitive != null ? nodePrimitive.NetworkItem : null;
+    }
+
+    #region Nodes Event Handlers
+    private void Nodes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<INode> e) {
+      // TODO: don't update everything
+      UpdateContent();
+    }
+
+    private void Nodes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<INode> e) {
+      // TODO: don't update everything
+      UpdateContent();
+    }
+
+    private void Nodes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<INode> e) {
+      // TODO: don't update everything
+      UpdateContent();
+    }
+    #endregion
+
+    #region Ports Event Handlers
+    private void Ports_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IPort> e) { }
+
+    private void Ports_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IPort> e) { }
+
+    private void Ports_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IPort> e) { }
+    #endregion
+
+    private void detailsToggleButton_Click(object sender, EventArgs e) {
+      splitContainer.Panel2Collapsed = !splitContainer.Panel2Collapsed;
+      detailsToggleButton.Text = splitContainer.Panel2Collapsed ? "<" : ">";
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateContent() {
+      if (Content == null) return;
+
+      chartControl.SuspendRendering();
+      try {
+        foreach (var r in primitiveDict.Values.OfType<NodeRectangle>())
+          r.NetworkItem = null;
+        primitiveDict.Clear();
+        chartControl.Chart.Group.Clear();
+        DrawNodes();
+        ConnectNodes();
+      } finally {
+        chartControl.ResumeRendering();
+      }
+    }
+
+    private void DrawNodes() {
+      foreach (var node in Content.Nodes) {
+        var defaultPrimitive = PrimitiveAttribute.CreateDefaultPrimitive(node.GetType(), chartControl.Chart, node);
+        if (defaultPrimitive == null) continue;
+        chartControl.Chart.Group.Add(defaultPrimitive);
+        primitiveDict[node.Name] = defaultPrimitive;
+      }
+    }
+
+    private void ConnectNodes() {
+      foreach (var node in Content.Nodes) {
+        var nodeRectangle = primitiveDict[node.Name] as NodeRectangle;
+        if (nodeRectangle == null) continue;
+
+        foreach (var port in node.Ports.OfType<IConnectablePort>()) {
+          var connectedPort = port.ConnectedPort as IConnectablePort;
+          if (connectedPort == null) continue;
+
+          var connectedNode = connectedPort.Parent;
+          if (connectedNode == null) continue;
+
+          var connectedRectangle = primitiveDict[connectedNode.Name] as NodeRectangle;
+          if (connectedRectangle == null) continue;
+
+          var leftPortRectangle = (PortRectangle)nodeRectangle.GetPortPrimitive(port);
+          var rightPortRectangle = (PortRectangle)connectedRectangle.GetPortPrimitive(connectedPort);
+
+          var connectionShape = new ConnectionLine(chartControl.Chart, leftPortRectangle, rightPortRectangle);
+
+          chartControl.Chart.Group.Add(connectionShape);
+        }
+      }
+    }
+
+    private void LayoutNodes() {
+      var layout = new Layout();
+      var layoutNodes = new Dictionary<string, Layout.LayoutNode>();
+
+      foreach (var node in Content.Nodes) {
+        var nodeRectangle = primitiveDict[node.Name] as NodeRectangle;
+        if (nodeRectangle == null) continue;
+
+        var nodeSize = chartControl.Chart.TransformWorldToPixel(nodeRectangle.Size);
+        Layout.LayoutNode layoutNode;
+        if (!layoutNodes.TryGetValue(node.Name, out layoutNode)) {
+          layoutNodes.Add(node.Name, layoutNode = new Layout.LayoutNode(nodeSize));
+          layout.AddNode(layoutNode);
+        }
+
+        foreach (var port in node.Ports.OfType<IConnectablePort>()) {
+          var connectedPort = port.ConnectedPort as IConnectablePort;
+          if (connectedPort == null) continue;
+
+          var connectedNode = connectedPort.Parent;
+          if (connectedNode == null) continue;
+
+          var connectedRectangle = primitiveDict[connectedNode.Name] as NodeRectangle;
+          if (connectedRectangle == null) continue;
+
+          nodeSize = chartControl.Chart.TransformWorldToPixel(connectedRectangle.Size);
+          if (!layoutNodes.ContainsKey(connectedNode.Name)) {
+            layoutNodes.Add(connectedNode.Name, new Layout.LayoutNode(nodeSize));
+            layout.AddNode(layoutNodes[connectedNode.Name]);
+          }
+
+          layoutNode.AddNode(layoutNodes[connectedNode.Name]);
+        }
+      }
+
+      var bounds = chartControl.GetPictureBounds();
+      bounds.Offset((int)chartControl.Chart.LowerLeft.X, -(int)chartControl.Chart.UpperRight.Y);
+
+      layout.Arrange(bounds);
+
+      foreach (var entry in layoutNodes) {
+        var nodeRectangle = primitiveDict[entry.Key] as NodeRectangle;
+        if (nodeRectangle == null) continue;
+        var rectangleNode = entry.Value;
+        nodeRectangle.Move(rectangleNode.Location - nodeRectangle.Center());
+      }
+    }
+
+    private void LayoutPorts() {
+      foreach (var node in Content.Nodes) {
+        var nodeRectangle = primitiveDict[node.Name] as NodeRectangle;
+        if (nodeRectangle == null) continue;
+
+        foreach (var port in node.Ports.OfType<IConnectablePort>()) {
+          var connectedPort = port.ConnectedPort as IConnectablePort;
+          if (connectedPort == null) continue;
+
+          var connectedNode = connectedPort.Parent;
+          if (connectedNode == null) continue;
+
+          var connectedRectangle = primitiveDict[connectedNode.Name] as NodeRectangle;
+          if (connectedRectangle == null) continue;
+
+          var leftCenter = nodeRectangle.Center();
+          var rightCenter = connectedRectangle.Center();
+          var line = new Line(null, rightCenter, leftCenter);
+
+          var leftIntersection = nodeRectangle.ComputeIntersect(line).Single();
+          var rightIntersection = connectedRectangle.ComputeIntersect(line).Single();
+
+          var leftPortRectangle = (PortRectangle)nodeRectangle.GetPortPrimitive(port);
+          leftPortRectangle.SetPosition(leftIntersection);
+          var rightPortRectangle = (PortRectangle)connectedRectangle.GetPortPrimitive(connectedPort);
+          rightPortRectangle.SetPosition(rightIntersection);
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,43 @@
+﻿#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.Networks.Views.NetworkVisualization.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.Views.NetworkVisualization.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.Views.NetworkVisualization.Views", "3.3.12.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.Views.NetworkVisualization.Views-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.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Networks.Views.NetworkVisualization", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization", "3.3")]
+  public class HeuristicLabNetworksViewsNetworkVisualizationViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#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.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.Networks.Views.NetworkVisualization.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab network visualization classes")]
+[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("a1efa7b2-c288-4342-8318-27f4d2f29c18")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj	(revision 15895)
@@ -0,0 +1,159 @@
+﻿<?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>{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.Views.NetworkVisualization</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.Views.NetworkVisualization-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </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\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Visualization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Interfaces\INetworkItemPrimitive.cs" />
+    <Compile Include="INodeVisualProperties.cs" />
+    <Compile Include="IPortVisualProperties.cs" />
+    <Compile Include="Layout.cs" />
+    <Compile Include="NodeVisualProperties.cs" />
+    <Compile Include="Orientation.cs" />
+    <Compile Include="PortVisualProperties.cs" />
+    <Compile Include="Primitives\AlgorithmNodeRectangle.cs" />
+    <Compile Include="Primitives\ConnectionLine.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Primitives\MessagePortRectangle.cs" />
+    <Compile Include="Primitives\NodeRectangle.cs" />
+    <Compile Include="Primitives\PortRectangle.cs" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj">
+      <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
+      <Name>HeuristicLab.Networks-3.3</Name>
+      <Private>False</Private>
+    </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/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/INodeVisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/INodeVisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/INodeVisualProperties.cs	(revision 15895)
@@ -0,0 +1,33 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  public interface INodeVisualProperties : IVisualProperties {
+    Point2D<double> LowerLeft { get; set; }
+    Point2D<double> UpperRight { get; set; }
+    Color BrushColor { get; set; }
+    Color PenColor { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/IPortVisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/IPortVisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/IPortVisualProperties.cs	(revision 15895)
@@ -0,0 +1,32 @@
+﻿#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.Drawing;
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  public interface IPortVisualProperties : IVisualProperties {
+    Orientation Orientation { get; set; }
+    double Offset { get; set; }
+    Color BrushColor { get; set; }
+    Color PenColor { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Interfaces/INetworkItemPrimitive.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Interfaces/INetworkItemPrimitive.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Interfaces/INetworkItemPrimitive.cs	(revision 15895)
@@ -0,0 +1,32 @@
+﻿#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.Core.Networks;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  public interface INetworkItemPrimitive<T> : IPrimitive where T : INetworkItem {
+    T NetworkItem { get; set; }
+
+    event EventHandler NetworkItemChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Layout.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Layout.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Layout.cs	(revision 15895)
@@ -0,0 +1,226 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  public class Layout {
+    private const double RAD_TO_DEG = 180 / Math.PI;
+    private const double DEG_TO_RAD = 1 / RAD_TO_DEG;
+
+    private const double REPULSION_CONSTANT = 10000.0;
+    private const double ATTRACTION_CONSTANT = 0.1;
+    private const double EQUILIBRIUM = 15;
+
+    private readonly IList<Node> nodes = new List<Node>();
+
+    public bool AddNode(Node node) {
+      if (node == null) throw new ArgumentNullException("node");
+      if (nodes.Contains(node)) return false;
+
+      nodes.Add(node);
+      foreach (var c in node.Nodes) AddNode(c);
+      return true;
+    }
+
+    public void Arrange(double damping = 0.5, double springLength = 100, int maxIterations = 500, bool deterministic = true) {
+      var random = deterministic ? new Random(0) : new Random();
+
+      var nodeMechanics = new NodeMechanics[nodes.Count];
+      for (int i = 0; i < nodes.Count; i++) {
+        nodeMechanics[i] = new NodeMechanics(nodes[i], new Vector(), Point.Empty);
+        nodeMechanics[i].Node.Location = new Point(random.Next(-50, 50), random.Next(-50, 50));
+      }
+
+      for (int i = 0, eqCount = 0; i < maxIterations && eqCount <= EQUILIBRIUM; i++) {
+        double totalDisplacement = 0.0;
+
+        foreach (var current in nodeMechanics) {
+          var node = current.Node;
+          var currentPosition = new Vector(CalculateDistance(Point.Empty, node.Location), CalculateBearingAngle(Point.Empty, node.Location));
+          var netForce = new Vector();
+
+          foreach (var n in nodes)
+            if (n != node)
+              netForce += CalculateRepulsionForce(node, n);
+
+          foreach (var n in node.Nodes)
+            netForce += CalculateAttractionForce(node, n, springLength);
+
+          foreach (var n in nodes)
+            if (n.Nodes.Contains(node))
+              netForce += CalculateAttractionForce(node, n, springLength);
+
+          current.Velocity = (current.Velocity + netForce) * damping;
+          current.NextPosition = (currentPosition + current.Velocity).ToPoint();
+        }
+
+        foreach (var current in nodeMechanics) {
+          totalDisplacement += CalculateDistance(current.Node.Location, current.NextPosition);
+          current.Node.Location = current.NextPosition;
+        }
+
+        if (totalDisplacement < 10) eqCount++;
+      }
+    }
+
+    public void Arrange(Rectangle bounds, double damping = 0.5, double springLength = 100.0, int maxIterations = 500, bool deterministic = true) {
+      Arrange(damping, 200, maxIterations, deterministic);
+
+      var logicalBounds = GetLogicalBounds();
+      var center = new Point(logicalBounds.X + logicalBounds.Width / 2, logicalBounds.Y + logicalBounds.Height / 2);
+      int maxWidth = 0, maxHeight = 0;
+      foreach (var node in nodes) {
+        node.Location -= (Size)center;
+        if (node.Size.Width > maxWidth) maxWidth = node.Size.Width;
+        if (node.Size.Height > maxHeight) maxHeight = node.Size.Height;
+      }
+
+      bounds = new Rectangle(bounds.X + maxWidth / 2, bounds.Y + maxHeight / 2, bounds.Width - maxWidth, bounds.Height - maxHeight);
+      double scale = Math.Min((double)bounds.Width / logicalBounds.Width, (double)bounds.Height / logicalBounds.Height);
+      foreach (var node in nodes)
+        node.Location = ScalePoint(node.Location, scale);
+
+      logicalBounds = GetLogicalBounds();
+      center = new Point(logicalBounds.X + logicalBounds.Width / 2, logicalBounds.Y + logicalBounds.Height / 2);
+      center.Offset(-(bounds.X + bounds.Width / 2), bounds.Y + bounds.Height / 2);
+      foreach (var node in nodes)
+        node.Location -= (Size)center;
+    }
+
+    #region Forces
+    private Vector CalculateRepulsionForce(Node a, Node b) {
+      double r = Math.Max(CalculateDistance(a.Location, b.Location), 1.0);
+      double force = -(REPULSION_CONSTANT / (r * r));
+      double angle = CalculateBearingAngle(a.Location, b.Location);
+      return new Vector(force, angle);
+    }
+
+    private Vector CalculateAttractionForce(Node a, Node b, double springLength) {
+      double r = Math.Max(CalculateDistance(a.Location, b.Location), 1.0);
+      double force = ATTRACTION_CONSTANT * Math.Max(r - springLength, 0.0);
+      double angle = CalculateBearingAngle(a.Location, b.Location);
+      return new Vector(force, angle);
+    }
+    #endregion
+
+    #region Helpers
+    private static double CalculateDistance(Point a, Point b) {
+      double dX = a.X - b.X;
+      double dY = a.Y - b.Y;
+      return Math.Sqrt(dX * dX + dY * dY);
+    }
+
+    private static double CalculateBearingAngle(Point a, Point b) {
+      double dX = b.X - a.X;
+      double dY = b.Y - a.Y;
+      double angle = Math.Atan2(dY, dX) * RAD_TO_DEG;
+      return angle;
+    }
+
+    private static Point ScalePoint(Point p, double scalar) {
+      return new Point((int)Math.Round(p.X * scalar), (int)Math.Round(p.Y * scalar));
+    }
+
+    private Rectangle GetLogicalBounds() {
+      int minX = int.MaxValue, maxX = int.MinValue,
+          minY = int.MaxValue, maxY = int.MinValue;
+      foreach (var node in nodes) {
+        if (node.Location.X < minX) minX = node.Location.X;
+        if (node.Location.X > maxX) maxX = node.Location.X;
+        if (node.Location.Y < minY) minY = node.Location.Y;
+        if (node.Location.Y > maxY) maxY = node.Location.Y;
+      }
+
+      return Rectangle.FromLTRB(minX, minY, maxX, maxY);
+    }
+    #endregion
+
+    #region Vector
+    private struct Vector {
+      public double X { get; private set; }
+      public double Y { get; private set; }
+
+      public Vector(double magnitude, double direction)
+        : this() {
+        X = magnitude * Math.Cos(direction * DEG_TO_RAD);
+        Y = magnitude * Math.Sin(direction * DEG_TO_RAD);
+      }
+
+      public Point ToPoint() {
+        return new Point((int)Math.Round(X), (int)Math.Round(Y));
+      }
+
+      public static Vector operator +(Vector a, Vector b) {
+        return new Vector { X = a.X + b.X, Y = a.Y + b.Y };
+      }
+
+      public static Vector operator *(Vector v, double d) {
+        return new Vector { X = v.X * d, Y = v.Y * d };
+      }
+    }
+    #endregion
+
+    #region Nodes
+    public abstract class Node {
+      public Point Location { get; set; }
+      public abstract Size Size { get; }
+
+      private readonly List<Node> nodes = new List<Node>();
+      public IEnumerable<Node> Nodes { get { return nodes; } }
+
+      public bool AddNode(Node node) {
+        if (node == null) throw new ArgumentNullException("node");
+        if (node == this || nodes.Contains(node)) return false;
+
+        nodes.Add(node);
+        return true;
+      }
+    }
+
+    public class LayoutNode : Node {
+      private Size size;
+      public override Size Size { get { return size; } }
+
+      public LayoutNode(Size size) {
+        this.size = size;
+      }
+    }
+    #endregion
+
+    #region Mechanics
+    private class NodeMechanics {
+      public Node Node { get; private set; }
+      public Vector Velocity { get; set; }
+      public Point NextPosition { get; set; }
+
+      public NodeMechanics(Node node, Vector velocity, Point nextPosition) {
+        Node = node;
+        Velocity = velocity;
+        NextPosition = nextPosition;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/NodeVisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/NodeVisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/NodeVisualProperties.cs	(revision 15895)
@@ -0,0 +1,97 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [StorableClass]
+  public sealed class NodeVisualProperties : VisualProperties, INodeVisualProperties {
+    [Storable]
+    private Point2D<double> lowerLeft;
+    public Point2D<double> LowerLeft {
+      get { return lowerLeft; }
+      set {
+        if (lowerLeft == value) return;
+        lowerLeft = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private Point2D<double> upperRight;
+    public Point2D<double> UpperRight {
+      get { return upperRight; }
+      set {
+        if (upperRight == value) return;
+        upperRight = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private Color brushColor;
+    public Color BrushColor {
+      get { return brushColor; }
+      set {
+        if (brushColor == value) return;
+        brushColor = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private Color penColor;
+    public Color PenColor {
+      get { return penColor; }
+      set {
+        if (penColor == value) return;
+        penColor = value;
+        OnChanged();
+      }
+    }
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    private NodeVisualProperties(bool deserializing) : base(deserializing) { }
+    private NodeVisualProperties(NodeVisualProperties original, Cloner cloner)
+      : base(original, cloner) {
+      lowerLeft = original.lowerLeft;
+      upperRight = original.upperRight;
+      brushColor = original.brushColor;
+      penColor = original.penColor;
+    }
+
+    public NodeVisualProperties() {
+      lowerLeft = new Point2D<double>(0.0, 0.0);
+      upperRight = new Point2D<double>(200.0, 100.0);
+      brushColor = Color.FromArgb(255, 120, 200, 240);
+      penColor = Color.Black;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NodeVisualProperties(this, cloner);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Orientation.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Orientation.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Orientation.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#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.Networks.Views.NetworkVisualization {
+  public enum Orientation {
+    North,
+    East,
+    South,
+    West
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,39 @@
+﻿#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.Networks.Views.NetworkVisualization {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.Views.NetworkVisualization plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.Views.NetworkVisualization", "3.3.12.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.Views.NetworkVisualization-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization", "3.3")]
+  public class HeuristicLabNetworksViewsNetworkVisualizationPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/PortVisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/PortVisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/PortVisualProperties.cs	(revision 15895)
@@ -0,0 +1,97 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [StorableClass]
+  public sealed class PortVisualProperties : VisualProperties, IPortVisualProperties {
+    [Storable]
+    private Orientation orientation;
+    public Orientation Orientation {
+      get { return orientation; }
+      set {
+        if (orientation == value) return;
+        orientation = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private double offset;
+    public double Offset {
+      get { return offset; }
+      set {
+        if (offset == value) return;
+        offset = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private Color brushColor;
+    public Color BrushColor {
+      get { return brushColor; }
+      set {
+        if (brushColor == value) return;
+        brushColor = value;
+        OnChanged();
+      }
+    }
+
+    [Storable]
+    private Color penColor;
+    public Color PenColor {
+      get { return penColor; }
+      set {
+        if (penColor == value) return;
+        penColor = value;
+        OnChanged();
+      }
+    }
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    private PortVisualProperties(bool deserializing) : base(deserializing) { }
+    private PortVisualProperties(PortVisualProperties original, Cloner cloner)
+      : base(original, cloner) {
+      orientation = original.orientation;
+      offset = original.offset;
+      brushColor = original.brushColor;
+      penColor = original.penColor;
+    }
+
+    public PortVisualProperties() {
+      orientation = Orientation.South;
+      offset = 0.5;
+      brushColor = Color.RosyBrown;
+      penColor = Color.Black;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PortVisualProperties(this, cloner);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/AlgorithmNodeRectangle.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/AlgorithmNodeRectangle.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/AlgorithmNodeRectangle.cs	(revision 15895)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [Primitive(typeof(IAlgorithmNode), true)]
+  public class AlgorithmNodeRectangle : NodeRectangle {
+    protected readonly Brush InactiveBrush = new SolidBrush(Color.FromArgb(255, 255, 200, 100));
+    protected readonly Brush ActiveBrush = new SolidBrush(Color.FromArgb(255, 100, 200, 100));
+
+    public new IAlgorithmNode NetworkItem {
+      get { return (IAlgorithmNode)base.NetworkItem; }
+      set { base.NetworkItem = value; }
+    }
+
+    public AlgorithmNodeRectangle(IChart chart, IAlgorithmNode node)
+      : base(chart, node) {
+      Brush = InactiveBrush;
+    }
+
+    protected override void RegisterNetworkItemEvents() {
+      base.RegisterNetworkItemEvents();
+      NetworkItem.StartedAlgorithmsChanged += NetworkItem_StartedAlgorithmsChanged;
+      if (NetworkItem.Algorithm != null) {
+        NetworkItem.Algorithm.Started += Algorithm_Started; ;
+        NetworkItem.Algorithm.Stopped += Algorithm_Stopped; ;
+      }
+    }
+
+    protected override void DeregisterNetworkItemEvents() {
+      if (NetworkItem.Algorithm != null) {
+        NetworkItem.Algorithm.Stopped -= Algorithm_Stopped; ;
+        NetworkItem.Algorithm.Started -= Algorithm_Started; ;
+      }
+      NetworkItem.StartedAlgorithmsChanged -= NetworkItem_StartedAlgorithmsChanged;
+      base.DeregisterNetworkItemEvents();
+    }
+
+    private void NetworkItem_StartedAlgorithmsChanged(object sender, System.EventArgs e) {
+      Brush = ((IAlgorithmNode)sender).StartedAlgorithms.Any() ? ActiveBrush : InactiveBrush;
+    }
+    private void Algorithm_Started(object sender, System.EventArgs e) { Brush = ActiveBrush; }
+    private void Algorithm_Stopped(object sender, System.EventArgs e) { Brush = InactiveBrush; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/ConnectionLine.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/ConnectionLine.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/ConnectionLine.cs	(revision 15895)
@@ -0,0 +1,119 @@
+﻿#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.Drawing.Drawing2D;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  public class ConnectionLine : Line {
+    protected PortRectangle startPortRectangle;
+    public PortRectangle StartPortRectangle {
+      get { return startPortRectangle; }
+      set {
+        if (startPortRectangle == value) return;
+        if (startPortRectangle != null) DeregisterPortRectangleEvents(startPortRectangle);
+        startPortRectangle = value;
+        if (startPortRectangle != null) RegisterPortRectangleEvents(startPortRectangle);
+        OnStartPortRectangleChanged();
+      }
+    }
+
+    protected PortRectangle endPortRectangle;
+    public PortRectangle EndPortRectangle {
+      get { return endPortRectangle; }
+      set {
+        if (endPortRectangle == value) return;
+        if (endPortRectangle != null) DeregisterPortRectangleEvents(endPortRectangle);
+        endPortRectangle = value;
+        if (endPortRectangle != null) RegisterPortRectangleEvents(endPortRectangle);
+        OnEndPortRectangleChanged();
+      }
+    }
+
+    public ConnectionLine(IChart chart, PortRectangle start, PortRectangle end)
+      : base(chart, start.Point, end.Point) {
+      StartPortRectangle = start;
+      EndPortRectangle = end;
+    }
+
+    protected virtual void RegisterPortRectangleEvents(PortRectangle portRectangle) {
+      portRectangle.RedrawRequired += PortRectangle_RedrawRequired;
+    }
+
+    protected virtual void DeregisterPortRectangleEvents(PortRectangle portRectangle) {
+      portRectangle.RedrawRequired -= PortRectangle_RedrawRequired;
+    }
+
+    #region Overrides
+    public override void Move(Offset delta) { }
+    public override void Move(PointD point, Offset delta) { }
+
+    public override void Draw(Graphics graphics) {
+      base.Draw(graphics);
+
+      var startP = Chart.TransformWorldToPixel(Start);
+      var endP = Chart.TransformWorldToPixel(End);
+
+      if (startP == endP) return;
+
+      double length = Math.Sqrt(Math.Pow(startP.X - endP.X, 2.0) + Math.Pow(startP.Y - endP.Y, 2));
+      double ax = (endP.X - startP.X) / length, ay = (endP.Y - startP.Y) / length;
+      double bx = -2.5 * ax - ay, by = -2.5 * ay + ax;
+      double cx = -2.5 * ax + ay, cy = -2.5 * ay - ax;
+      double mul = 5 * Chart.WorldToPixelRatio.Width;
+      bx *= mul; by *= mul;
+      cx *= mul; cy *= mul;
+      var p1 = new Point((int)Math.Round(endP.X + bx), (int)Math.Round(endP.Y + by));
+      var p2 = new Point((int)Math.Round(endP.X + cx), (int)Math.Round(endP.Y + cy));
+      graphics.FillPolygon(Pen.Brush, new[] { p1, endP, p2 });
+    }
+
+    public override void PostDraw(Graphics graphics) {
+      if (Selected) {
+        using (var pen = new Pen(Color.LightGray, 3) { DashStyle = DashStyle.Dash })
+          graphics.DrawLine(pen, Chart.TransformWorldToPixel(Start), Chart.TransformWorldToPixel(End));
+      }
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler StartPortRectangleChanged;
+    protected virtual void OnStartPortRectangleChanged() {
+      var handler = StartPortRectangleChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler EndPortRectangleChanged;
+    protected virtual void OnEndPortRectangleChanged() {
+      var handler = EndPortRectangleChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Event Handlers
+    private void PortRectangle_RedrawRequired(object sender, EventArgs e) {
+      SetPosition(startPortRectangle.Point, endPortRectangle.Point);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/MessagePortRectangle.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/MessagePortRectangle.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/MessagePortRectangle.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using System.Threading.Tasks;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [Primitive(typeof(IMessagePort), true)]
+  public class MessagePortRectangle : PortRectangle {
+    protected readonly Brush IdleBrush;
+    protected readonly Brush MessageSentBrush = Brushes.Yellow;
+    protected readonly Brush MessageReceivedBrush = Brushes.Red;
+
+    public new IMessagePort NetworkItem {
+      get { return (IMessagePort)base.NetworkItem; }
+      set { base.NetworkItem = value; }
+    }
+
+    public MessagePortRectangle(IChart chart, IMessagePort port, INode node)
+      : base(chart, port, node) {
+      IdleBrush = Brush;
+    }
+
+    protected override void RegisterNetworkItemEvents() {
+      base.RegisterNetworkItemEvents();
+      NetworkItem.MessageSent += NetworkItem_MessageSent;
+      NetworkItem.MessageReceived += Port_MessageReceived;
+    }
+
+    protected override void DeregisterNetworkItemEvents() {
+      NetworkItem.MessageReceived -= Port_MessageReceived;
+      NetworkItem.MessageSent -= NetworkItem_MessageSent;
+      base.DeregisterNetworkItemEvents();
+    }
+
+    private void Port_MessageReceived(object sender, Common.EventArgs<IMessage, System.Threading.CancellationToken> e) {
+      Highlight(MessageReceivedBrush);
+    }
+
+
+    private void NetworkItem_MessageSent(object sender, Common.EventArgs<IMessage, System.Threading.CancellationToken> e) {
+      Highlight(MessageSentBrush);
+    }
+
+    private async Task Highlight(Brush brush) {
+      Brush = brush;
+      await Task.Delay(200);
+      Brush = IdleBrush;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/NodeRectangle.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/NodeRectangle.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/NodeRectangle.cs	(revision 15895)
@@ -0,0 +1,330 @@
+﻿#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 System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [Primitive(typeof(INode), true)]
+  public class NodeRectangle : Visualization.Rectangle, INetworkItemPrimitive<INode> {
+    protected readonly Dictionary<IPort, IPrimitive> port2primitive = new Dictionary<IPort, IPrimitive>();
+    protected readonly IGroup portRectangles;
+
+    protected INodeVisualProperties VisualProperties {
+      get { return (INodeVisualProperties)networkItem.VisualProperties; }
+      set {
+        if (networkItem.VisualProperties == value) return;
+        networkItem.VisualProperties = value;
+      }
+    }
+    protected bool IgnoreVisualPropertiesChanges { get; set; }
+
+    protected INode networkItem;
+    public INode NetworkItem {
+      get { return networkItem; }
+      set {
+        if (networkItem == value) return;
+        if (networkItem != null) DeregisterNetworkItemEvents();
+        networkItem = value;
+        if (networkItem != null) RegisterNetworkItemEvents();
+        LoadVisualProperties();
+        OnNetworkItemChanged();
+      }
+    }
+
+    public override Brush Brush {
+      get { return base.Brush; }
+      set {
+        if (base.Brush == value) return;
+        base.Brush = value;
+        SaveVisualProperties();
+      }
+    }
+
+    public override Pen Pen {
+      get { return base.Pen; }
+      set {
+        if (base.Pen == value) return;
+        base.Pen = value;
+        SaveVisualProperties();
+      }
+    }
+
+    public NodeRectangle(IChart chart, INode node)
+      : base(chart, PointD.Empty, PointD.Empty) {
+      bool adjustSize = node.VisualProperties == null;
+      NetworkItem = node;
+
+      portRectangles = new Group(chart);
+      foreach (var port in node.Ports) {
+        var portPrimitive = PrimitiveAttribute.CreateDefaultPrimitive(port.GetType(), chart, port, node); // TODO: port.Parent != node
+        port2primitive.Add(port, portPrimitive);
+        portRectangles.Add(portPrimitive);
+      }
+      portRectangles.RedrawRequired += (sender, args) => OnRedrawRequired();
+
+      if (adjustSize) AdjustSize();
+    }
+
+    protected virtual void RegisterNetworkItemEvents() {
+      if (VisualProperties != null) {
+        VisualProperties.Changed += VisualProperties_Changed;
+      }
+      networkItem.NameChanged += NetworkItem_NameChanged;
+      if (networkItem.Ports != null) {
+        networkItem.Ports.ItemsAdded += Ports_ItemsAdded;
+        networkItem.Ports.ItemsRemoved += Ports_ItemsRemoved;
+      }
+    }
+
+    protected virtual void DeregisterNetworkItemEvents() {
+      if (VisualProperties != null) {
+        VisualProperties.Changed -= VisualProperties_Changed;
+      }
+      networkItem.NameChanged -= NetworkItem_NameChanged;
+      if (networkItem.Ports != null) {
+        networkItem.Ports.ItemsAdded -= Ports_ItemsAdded;
+        networkItem.Ports.ItemsRemoved -= Ports_ItemsRemoved;
+      }
+    }
+
+    #region Overrides
+    public override void SetPosition(PointD lowerLeft, PointD upperRight) {
+      base.SetPosition(lowerLeft, upperRight);
+      SaveVisualProperties();
+    }
+
+    public override void Draw(Graphics graphics) {
+      int cornerRadius = (int)Math.Round(6 * Chart.WorldToPixelRatio.Width);
+      var point = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+      var size = Chart.TransformWorldToPixel(Size);
+      var bounds = new System.Drawing.Rectangle(point.X, point.Y, size.Width, size.Height);
+      var arc = new System.Drawing.Rectangle(point, new Size(cornerRadius * 2, cornerRadius * 2));
+
+      using (var path = new GraphicsPath()) {
+        path.AddArc(arc, 180f, 90f);
+        arc.X = bounds.Right - cornerRadius * 2;
+        path.AddArc(arc, 270f, 90);
+        arc.Y = bounds.Bottom - cornerRadius * 2;
+        path.AddArc(arc, 0f, 90f);
+        arc.X = bounds.Left;
+        path.AddArc(arc, 90f, 90f);
+        path.CloseFigure();
+
+        graphics.FillPath(Brush, path);
+        graphics.DrawPath(Pen, path);
+      }
+
+      var p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+
+      if (networkItem != null) {
+        using (var headerFont = new Font(FontFamily.GenericSansSerif, (float)Math.Round(8.25 * Chart.WorldToPixelRatio.Width), FontStyle.Bold))
+        using (var contentFont = new Font(FontFamily.GenericSansSerif, (float)Math.Round(8.25 * Chart.WorldToPixelRatio.Width))) {
+          int margin = 4, x, y, lastY;
+
+          x = p.X + (int)Math.Round(margin * Chart.WorldToPixelRatio.Width);
+          y = p.Y + (int)Math.Round(margin * Chart.WorldToPixelRatio.Height);
+
+          var imageSize = networkItem.ItemImage.Size;
+          float imageWidth = (float)Math.Round(imageSize.Width * Chart.WorldToPixelRatio.Width);
+          float imageHeight = (float)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+          graphics.DrawImage(networkItem.ItemImage, x, y, imageWidth, imageHeight);
+          lastY = y;
+
+          var textSize = graphics.MeasureString(networkItem.Name, headerFont);
+          x += (int)Math.Round((imageSize.Width + margin) * Chart.WorldToPixelRatio.Width);
+          y += (int)Math.Round((imageSize.Height - textSize.Height * Chart.PixelToWorldRatio.Height) / 2 * Chart.WorldToPixelRatio.Height);
+          graphics.DrawString(networkItem.Name, headerFont, Brushes.Black, x, y);
+          y = lastY + (int)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+
+          x = p.X;
+          y += (int)Math.Round(margin * Chart.WorldToPixelRatio.Height);
+          graphics.DrawLine(Pen, x, y, x + size.Width, y);
+
+          foreach (var port in networkItem.Ports) {
+            x = p.X + (int)Math.Round(margin * Chart.WorldToPixelRatio.Width);
+            y += (int)Math.Round(margin * Chart.WorldToPixelRatio.Height);
+
+            imageSize = port.ItemImage.Size;
+            imageWidth = (float)Math.Round(imageSize.Width * Chart.WorldToPixelRatio.Width);
+            imageHeight = (float)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+            graphics.DrawImage(port.ItemImage, x, y, imageWidth, imageHeight);
+            lastY = y;
+
+            textSize = graphics.MeasureString(port.Name, contentFont);
+            x += (int)Math.Round((imageSize.Width + margin) * Chart.WorldToPixelRatio.Width);
+            y += (int)Math.Round((imageSize.Height - textSize.Height * Chart.PixelToWorldRatio.Height) / 2 * Chart.WorldToPixelRatio.Height);
+            graphics.DrawString(port.Name, contentFont, Brushes.Black, x, y);
+            y = lastY + (int)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+
+            var parameterizedPort = port as IParameterizedPort;
+            if (parameterizedPort != null) {
+              foreach (var param in parameterizedPort.Parameters) {
+                x = p.X + (int)Math.Round(4 * margin * Chart.WorldToPixelRatio.Width);
+                y += (int)Math.Round(margin * Chart.WorldToPixelRatio.Height);
+
+                imageSize = param.ItemImage.Size;
+                imageWidth = (float)Math.Round(imageSize.Width * Chart.WorldToPixelRatio.Width);
+                imageHeight = (float)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+                graphics.DrawImage(param.ItemImage, x, y, imageWidth, imageHeight);
+                lastY = y;
+
+                textSize = graphics.MeasureString(param.Name, contentFont);
+                x += (int)Math.Round((imageSize.Width + margin) * Chart.WorldToPixelRatio.Width);
+                y += (int)Math.Round((imageSize.Height - textSize.Height * Chart.PixelToWorldRatio.Height) / 2 * Chart.WorldToPixelRatio.Height);
+                graphics.DrawString(param.Name, contentFont, Brushes.Black, x, y);
+                y = lastY + (int)Math.Round(imageSize.Height * Chart.WorldToPixelRatio.Height);
+              }
+            }
+          }
+        }
+      }
+
+      portRectangles.Draw(graphics);
+    }
+    #endregion
+
+    public IPrimitive GetPortPrimitive(IPort name) {
+      IPrimitive portPrimitive;
+      port2primitive.TryGetValue(name, out portPrimitive);
+      return portPrimitive;
+    }
+
+    #region Events
+    public event EventHandler NetworkItemChanged;
+    protected virtual void OnNetworkItemChanged() {
+      var handler = NetworkItemChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Event Handlers
+    private void VisualProperties_Changed(object sender, EventArgs e) {
+      if (IgnoreVisualPropertiesChanges) return;
+
+      LoadVisualProperties();
+    }
+
+    private void NetworkItem_NameChanged(object sender, EventArgs e) { OnRedrawRequired(); }
+
+    private void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      AdjustSize();
+
+      foreach (var port in e.Items) {
+        var portRectangle = PrimitiveAttribute.CreateDefaultPrimitive(port.GetType(), Chart, port, networkItem);
+        port2primitive.Add(port, portRectangle);
+        portRectangles.Add(portRectangle);
+        var parameterizedPort = port as IParameterizedPort;
+        if (parameterizedPort != null) {
+          parameterizedPort.Parameters.ItemsAdded += Parameters_ItemsAdded;
+          parameterizedPort.Parameters.ItemsRemoved += Parameters_ItemsRemoved;
+        }
+      }
+    }
+
+    private void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      AdjustSize();
+
+      foreach (var port in e.Items) {
+        var parameterizedPort = port as IParameterizedPort;
+        if (parameterizedPort != null) {
+          parameterizedPort.Parameters.ItemsRemoved -= Parameters_ItemsRemoved;
+          parameterizedPort.Parameters.ItemsAdded -= Parameters_ItemsAdded;
+        }
+        var portRectangle = port2primitive[port];
+        portRectangles.Remove(portRectangle);
+        port2primitive.Remove(port);
+      }
+    }
+
+    private void Parameters_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) { AdjustSize(); }
+    private void Parameters_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) { AdjustSize(); }
+    #endregion
+
+    #region Helpers
+    private void LoadVisualProperties() {
+      INodeVisualProperties vp = new NodeVisualProperties();
+
+      if (networkItem != null)
+        if (VisualProperties == null) VisualProperties = vp;
+        else vp = VisualProperties;
+
+      IgnoreVisualPropertiesChanges = true;
+      try {
+        SetPosition(new PointD(vp.LowerLeft.X, vp.LowerLeft.Y), new PointD(vp.UpperRight.X, vp.UpperRight.Y));
+        Brush = new SolidBrush(vp.BrushColor);
+        Pen = new Pen(vp.PenColor);
+      } finally { IgnoreVisualPropertiesChanges = false; }
+    }
+
+    private void SaveVisualProperties() {
+      if (networkItem == null || IgnoreVisualPropertiesChanges) return;
+
+      var vp = VisualProperties;
+      IgnoreVisualPropertiesChanges = true;
+      try {
+        vp.LowerLeft = new Point2D<double>(LowerLeft.X, LowerLeft.Y);
+        vp.UpperRight = new Point2D<double>(UpperRight.X, UpperRight.Y);
+        vp.BrushColor = ((SolidBrush)Brush).Color;
+        vp.PenColor = Pen.Color;
+      } finally { IgnoreVisualPropertiesChanges = false; }
+    }
+
+    private void AdjustSize() {
+      if (networkItem == null) return;
+
+      var p = Chart.TransformWorldToPixel(new PointD(LowerLeft.X, LowerLeft.Y + Size.Height));
+      int margin = 4, x = p.X, y = p.Y;
+      using (var headerFont = new Font(FontFamily.GenericSansSerif, (float)Math.Round(8.25), FontStyle.Bold))
+      using (var contentFont = new Font(FontFamily.GenericSansSerif, (float)Math.Round(8.25))) {
+        x += 2 * margin; y += 2 * margin;
+        int headerWidth = networkItem.ItemImage.Width + margin + TextRenderer.MeasureText(networkItem.Name, headerFont).Width;
+        y += networkItem.ItemImage.Height + margin;
+        int maxPortWidth = 0, maxPortParamWidth = 0;
+        foreach (var port in networkItem.Ports) {
+          int portWidth = port.ItemImage.Width + margin + TextRenderer.MeasureText(port.Name, contentFont).Width;
+          if (portWidth > maxPortWidth) maxPortWidth = portWidth;
+          y += margin + port.ItemImage.Height;
+          var parameterizedPort = port as IParameterizedPort;
+          if (parameterizedPort != null) {
+            foreach (var param in parameterizedPort.Parameters) {
+              int portParamWidth = param.ItemImage.Width + 3 * margin + TextRenderer.MeasureText(param.Name, contentFont).Width;
+              if (portParamWidth > maxPortParamWidth) maxPortParamWidth = portParamWidth;
+              y += margin + param.ItemImage.Height;
+            }
+          }
+        }
+
+        x += Math.Max(headerWidth, Math.Max(maxPortWidth, maxPortParamWidth));
+        var ll = Chart.TransformPixelToWorld(new Point(p.X, y));
+        var ur = Chart.TransformPixelToWorld(new Point(x, p.Y));
+        SetPosition(ll, ur);
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/PortRectangle.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/PortRectangle.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Primitives/PortRectangle.cs	(revision 15895)
@@ -0,0 +1,281 @@
+﻿#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.Drawing.Drawing2D;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Visualization;
+
+namespace HeuristicLab.Networks.Views.NetworkVisualization {
+  [Primitive(typeof(IPort), true)]
+  public class PortRectangle : FixedSizeRectangle, INetworkItemPrimitive<IPort> {
+    private const int size = 10;
+
+    protected readonly INodeVisualProperties nodeVisualProperties;
+
+    protected IPortVisualProperties VisualProperties {
+      get { return (IPortVisualProperties)networkItem.VisualProperties; }
+      set {
+        if (networkItem.VisualProperties == value) return;
+        networkItem.VisualProperties = value;
+      }
+    }
+    protected bool IgnoreVisualPropertiesChanges { get; set; }
+
+    public override Size Size {
+      get {
+        return new Size((int)Math.Round(size * Chart.WorldToPixelRatio.Width),
+                        (int)Math.Round(size * Chart.WorldToPixelRatio.Height));
+      }
+    }
+
+    protected IPort networkItem;
+    public IPort NetworkItem {
+      get { return networkItem; }
+      set {
+        if (networkItem == value) return;
+        if (networkItem != null) DeregisterNetworkItemEvents();
+        networkItem = value;
+        if (networkItem != null) RegisterNetworkItemEvents();
+        LoadVisualProperties();
+        OnNetworkItemChanged();
+      }
+    }
+
+    public override Brush Brush {
+      get { return base.Brush; }
+      set {
+        if (base.Brush == value) return;
+        base.Brush = value;
+        SaveVisualProperties();
+      }
+    }
+
+    public override Pen Pen {
+      get { return base.Pen; }
+      set {
+        if (base.Pen == value) return;
+        base.Pen = value;
+        SaveVisualProperties();
+      }
+    }
+
+    public PortRectangle(IChart chart, IPort port, INode node)
+      : base(chart, PointD.Empty, Size.Empty) {
+      nodeVisualProperties = (INodeVisualProperties)node.VisualProperties;
+      nodeVisualProperties.Changed += NodeVisualProperties_Changed;
+      NetworkItem = port;
+    }
+
+    protected virtual void RegisterNetworkItemEvents() {
+      if (VisualProperties != null) {
+        VisualProperties.Changed += VisualProperties_Changed;
+      }
+      networkItem.NameChanged += NetworkItem_NameChanged;
+      var connectablePort = networkItem as IConnectablePort;
+      if (connectablePort != null) {
+        connectablePort.ConnectedPortChanged += Port_ConnectedPortChanged;
+      }
+    }
+
+    protected virtual void DeregisterNetworkItemEvents() {
+      if (VisualProperties != null) {
+        VisualProperties.Changed -= VisualProperties_Changed;
+      }
+      networkItem.NameChanged -= NetworkItem_NameChanged;
+      var connectablePort = networkItem as IConnectablePort;
+      if (connectablePort != null) {
+        connectablePort.ConnectedPortChanged -= Port_ConnectedPortChanged;
+      }
+    }
+
+    #region Overrides
+    public override void SetPosition(PointD point) {
+      base.SetPosition(point);
+      SaveVisualProperties();
+    }
+
+    public override void Draw(Graphics graphics) {
+      base.Draw(graphics);
+
+      var p = Chart.TransformWorldToPixel(Point);
+
+      if (networkItem != null && VisualProperties != null) {
+        using (var font = new Font(FontFamily.GenericSansSerif, (float)Math.Round(8.25 * Chart.WorldToPixelRatio.Width))) {
+          var textSize = graphics.MeasureString(networkItem.Name, font);
+          var vp = VisualProperties;
+          switch (vp.Orientation) {
+            case Orientation.North: p = new Point((int)(p.X - textSize.Width / 2), (int)(p.Y - Size.Height - textSize.Height)); break;
+            case Orientation.East: p = new Point(p.X + Size.Width, (int)(p.Y - textSize.Height / 2)); break;
+            case Orientation.South: p = new Point((int)(p.X - textSize.Width / 2), p.Y + Size.Height); break;
+            case Orientation.West: p = new Point((int)(p.X - Size.Width - textSize.Width), (int)(p.Y - textSize.Height / 2)); break;
+          }
+
+          graphics.DrawString(networkItem.Name, font, Brushes.Black, p);
+        }
+      }
+    }
+
+    public override void PostDraw(Graphics graphics) {
+      base.PostDraw(graphics);
+
+      if (Selected) {
+        var p = Chart.TransformWorldToPixel(Point);
+        using (var pen = new Pen(Color.LightGray, 3) { DashStyle = DashStyle.Dash })
+          graphics.DrawRectangle(pen, p.X - Size.Width / 2, p.Y - Size.Height / 2, Size.Width, Size.Height);
+      }
+    }
+
+    #endregion
+
+    #region Events
+
+    public event EventHandler NetworkItemChanged;
+
+    protected virtual void OnNetworkItemChanged() {
+      var handler = NetworkItemChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #endregion
+
+    #region Event Handlers
+
+    private void NodeVisualProperties_Changed(object sender, EventArgs e) {
+      if (IgnoreVisualPropertiesChanges) return;
+
+      LoadVisualProperties();
+    }
+
+    private void VisualProperties_Changed(object sender, EventArgs e) {
+      if (IgnoreVisualPropertiesChanges) return;
+
+      LoadVisualProperties();
+    }
+
+    private void NetworkItem_NameChanged(object sender, EventArgs e) {
+      OnRedrawRequired();
+    }
+
+    private void Port_ConnectedPortChanged(object sender, EventArgs e) {
+      var connectionLines = Chart.Group.GetAllPrimitives(Point).OfType<ConnectionLine>();
+      var outgoingLines = connectionLines.Where(x => x.StartPortRectangle == this);
+      foreach (var l in outgoingLines) Chart.Group.Remove(l);
+
+      var connectablePort = (IConnectablePort)networkItem;
+      var connectedPort = connectablePort.ConnectedPort as IConnectablePort;
+      if (connectedPort == null) return;
+
+      var nodeRectangles = Chart.Group.Primitives.OfType<NodeRectangle>();
+      PortRectangle endPortRectangle = null;
+      foreach (var nodeRectangle in nodeRectangles) {
+        endPortRectangle = (PortRectangle)nodeRectangle.GetPortPrimitive(connectedPort);
+        if (endPortRectangle != null) break;
+      }
+
+      if (endPortRectangle == null) return;
+
+      var connectionShape = new ConnectionLine(Chart, this, endPortRectangle);
+      Chart.Group.Add(connectionShape);
+    }
+
+    #endregion
+
+    #region Helpers
+    private void LoadVisualProperties() {
+      IPortVisualProperties vp = new PortVisualProperties();
+
+      if (networkItem != null)
+        if (VisualProperties == null) VisualProperties = vp;
+        else vp = VisualProperties;
+
+      IgnoreVisualPropertiesChanges = true;
+      try {
+        var p = PointD.Empty;
+        double nodeWidth = nodeVisualProperties.UpperRight.X - nodeVisualProperties.LowerLeft.X;
+        double nodeHeight = nodeVisualProperties.UpperRight.Y - nodeVisualProperties.LowerLeft.Y;
+
+        switch (vp.Orientation) {
+          case Orientation.North:
+            p.X = nodeVisualProperties.LowerLeft.X + vp.Offset * nodeWidth;
+            p.Y = nodeVisualProperties.UpperRight.Y;
+            break;
+          case Orientation.East:
+            p.X = nodeVisualProperties.UpperRight.X;
+            p.Y = nodeVisualProperties.UpperRight.Y - vp.Offset * nodeHeight;
+            break;
+          case Orientation.South:
+            p.X = nodeVisualProperties.UpperRight.X - vp.Offset * nodeWidth;
+            p.Y = nodeVisualProperties.LowerLeft.Y;
+            break;
+          case Orientation.West:
+            p.X = nodeVisualProperties.LowerLeft.X;
+            p.Y = nodeVisualProperties.LowerLeft.Y + vp.Offset * nodeHeight;
+            break;
+        }
+
+        SetPosition(p);
+        Brush = new SolidBrush(vp.BrushColor);
+        Pen = new Pen(vp.PenColor);
+      } finally { IgnoreVisualPropertiesChanges = false; }
+    }
+
+    private void SaveVisualProperties() {
+      if (networkItem == null || IgnoreVisualPropertiesChanges) return;
+
+      var vp = VisualProperties;
+      IgnoreVisualPropertiesChanges = true;
+      try {
+        var lowerLeft = nodeVisualProperties.LowerLeft;
+        var upperRight = nodeVisualProperties.UpperRight;
+
+        if (lowerLeft.X <= Point.X && Point.X <= upperRight.X) {
+          // check N/S
+          if (Point.Y.IsAlmost(upperRight.Y)) {
+            vp.Orientation = Orientation.North;
+            vp.Offset = (Point.X - lowerLeft.X) / (upperRight.X - lowerLeft.X);
+          } else if (Point.Y.IsAlmost(lowerLeft.Y)) {
+            vp.Orientation = Orientation.South;
+            vp.Offset = (upperRight.X - Point.X) / (upperRight.X - lowerLeft.X);
+          }
+        }
+        if (lowerLeft.Y <= Point.Y && Point.Y <= upperRight.Y) {
+          // check E/W
+          if (Point.X.IsAlmost(upperRight.X)) {
+            vp.Orientation = Orientation.East;
+            vp.Offset = (upperRight.Y - Point.Y) / (upperRight.Y - lowerLeft.Y);
+          } else if (Point.X.IsAlmost(lowerLeft.X)) {
+            vp.Orientation = Orientation.West;
+            vp.Offset = (Point.Y - lowerLeft.Y) / (upperRight.Y - lowerLeft.Y);
+          }
+        }
+
+        vp.BrushColor = ((SolidBrush)Brush).Color;
+        vp.PenColor = Pen.Color;
+      } finally { IgnoreVisualPropertiesChanges = false; }
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views.NetworkVisualization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+#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.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.Networks.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab optimization networks classes")]
+[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("6852d9f7-2a82-4662-918e-95e61dad3274")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,184 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ClientNodeView {
+    /// <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.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.serviceCallsTabPage = new System.Windows.Forms.TabPage();
+      this.serviceParameterCollectionCollectionView = new HeuristicLab.Optimization.Networks.Views.ServiceParameterCollectionCollectionView();
+      this.callServicesButton = new System.Windows.Forms.Button();
+      this.cancelServicesButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.serviceCallsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.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.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(625, 424);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.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.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Controls.Add(this.serviceCallsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 462);
+      this.tabControl.TabIndex = 3;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 436);
+      this.portsTabPage.TabIndex = 0;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // serviceCallsTabPage
+      // 
+      this.serviceCallsTabPage.Controls.Add(this.serviceParameterCollectionCollectionView);
+      this.serviceCallsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.serviceCallsTabPage.Name = "serviceCallsTabPage";
+      this.serviceCallsTabPage.Size = new System.Drawing.Size(637, 428);
+      this.serviceCallsTabPage.TabIndex = 2;
+      this.serviceCallsTabPage.Text = "Service Calls";
+      this.serviceCallsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // serviceParameterCollectionCollectionView
+      // 
+      this.serviceParameterCollectionCollectionView.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.serviceParameterCollectionCollectionView.Caption = "ServiceParameterCollectionCollection View";
+      this.serviceParameterCollectionCollectionView.Content = null;
+      this.serviceParameterCollectionCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.serviceParameterCollectionCollectionView.Name = "serviceParameterCollectionCollectionView";
+      this.serviceParameterCollectionCollectionView.ReadOnly = false;
+      this.serviceParameterCollectionCollectionView.ShowDetails = true;
+      this.serviceParameterCollectionCollectionView.Size = new System.Drawing.Size(631, 422);
+      this.serviceParameterCollectionCollectionView.TabIndex = 0;
+      // 
+      // callServicesButton
+      // 
+      this.callServicesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.callServicesButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.callServicesButton.Location = new System.Drawing.Point(0, 494);
+      this.callServicesButton.Name = "callServicesButton";
+      this.callServicesButton.Size = new System.Drawing.Size(23, 23);
+      this.callServicesButton.TabIndex = 4;
+      this.callServicesButton.UseVisualStyleBackColor = true;
+      this.callServicesButton.Click += new System.EventHandler(this.callServicesButton_Click);
+      // 
+      // cancelServicesButton
+      // 
+      this.cancelServicesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.cancelServicesButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.cancelServicesButton.Location = new System.Drawing.Point(29, 494);
+      this.cancelServicesButton.Name = "cancelServicesButton";
+      this.cancelServicesButton.Size = new System.Drawing.Size(23, 23);
+      this.cancelServicesButton.TabIndex = 5;
+      this.cancelServicesButton.UseVisualStyleBackColor = true;
+      this.cancelServicesButton.Click += new System.EventHandler(this.cancelServicesButton_Click);
+      // 
+      // ClientNodeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.cancelServicesButton);
+      this.Controls.Add(this.callServicesButton);
+      this.Controls.Add(this.tabControl);
+      this.Name = "ClientNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.callServicesButton, 0);
+      this.Controls.SetChildIndex(this.cancelServicesButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.serviceCallsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected PortCollectionView portCollectionView;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage serviceCallsTabPage;
+    protected ServiceParameterCollectionCollectionView serviceParameterCollectionCollectionView;
+    protected System.Windows.Forms.Button callServicesButton;
+    protected System.Windows.Forms.Button cancelServicesButton;
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientNodeView.cs	(revision 15895)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ClientNode View")]
+  [Content(typeof(ClientNode), true)]
+  [Content(typeof(IClientNode), false)]
+  public partial class ClientNodeView : EntityView {
+    protected CancellationTokenSource tokenSource;
+    protected int openCalls = 0;
+
+    public new IClientNode Content {
+      get { return (IClientNode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ClientNodeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (tokenSource != null) tokenSource.Cancel();
+
+      if (Content == null) {
+        tokenSource = null;
+        portCollectionView.Content = null;
+        serviceParameterCollectionCollectionView.Content = null;
+      } else {
+        tokenSource = new CancellationTokenSource();
+        portCollectionView.Content = Content.Ports;
+        serviceParameterCollectionCollectionView.Content = Content.Calls;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      callServicesButton.Enabled = Content != null && !ReadOnly;
+      cancelServicesButton.Enabled = Content != null && !ReadOnly && openCalls > 0;
+      portCollectionView.Enabled = Content != null && !ReadOnly;
+      serviceParameterCollectionCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void callServicesButton_Click(object sender, EventArgs e) {
+      openCalls++;
+      cancelServicesButton.Enabled = Content != null && !ReadOnly && openCalls > 0;
+      Content.CallServicesAsync(tokenSource.Token).ContinueWith(t => {
+        Invoke(new Action(() => {
+          openCalls--;
+          cancelServicesButton.Enabled = Content != null && !ReadOnly && openCalls > 0;
+
+          try {
+            t.Wait();
+          }
+          catch (Exception ex) {
+            ErrorHandling.ShowErrorDialog(this, ex);
+          }
+        }));
+      });
+    }
+    protected virtual void cancelServicesButton_Click(object sender, EventArgs e) {
+      tokenSource.Cancel();
+      tokenSource = new CancellationTokenSource();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.Designer.cs	(revision 15895)
@@ -0,0 +1,152 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ClientPortView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.servicePortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setServicePortButton = new System.Windows.Forms.Button();
+      this.clearServicePortButton = new System.Windows.Forms.Button();
+      this.servicePortView = new HeuristicLab.Optimization.Networks.Views.PortView();
+      this.cloneServicePortParametersButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.servicePortGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // serviceParameterCollectionView
+      // 
+      this.serviceParameterCollectionView.Location = new System.Drawing.Point(0, 82);
+      this.serviceParameterCollectionView.Size = new System.Drawing.Size(645, 435);
+      this.serviceParameterCollectionView.TabIndex = 4;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(71, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(549, 20);
+      // 
+      // servicePortGroupBox
+      // 
+      this.servicePortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.servicePortGroupBox.Controls.Add(this.setServicePortButton);
+      this.servicePortGroupBox.Controls.Add(this.clearServicePortButton);
+      this.servicePortGroupBox.Controls.Add(this.servicePortView);
+      this.servicePortGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.servicePortGroupBox.Name = "servicePortGroupBox";
+      this.servicePortGroupBox.Size = new System.Drawing.Size(645, 50);
+      this.servicePortGroupBox.TabIndex = 3;
+      this.servicePortGroupBox.TabStop = false;
+      this.servicePortGroupBox.Text = "&Service Port";
+      // 
+      // setServicePortButton
+      // 
+      this.setServicePortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setServicePortButton.Location = new System.Drawing.Point(6, 19);
+      this.setServicePortButton.Name = "setServicePortButton";
+      this.setServicePortButton.Size = new System.Drawing.Size(24, 24);
+      this.setServicePortButton.TabIndex = 0;
+      this.setServicePortButton.UseVisualStyleBackColor = true;
+      this.setServicePortButton.Click += new System.EventHandler(this.setServicePortButton_Click);
+      // 
+      // clearServicePortButton
+      // 
+      this.clearServicePortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearServicePortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearServicePortButton.Name = "clearServicePortButton";
+      this.clearServicePortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearServicePortButton.TabIndex = 1;
+      this.clearServicePortButton.UseVisualStyleBackColor = true;
+      this.clearServicePortButton.Click += new System.EventHandler(this.clearServicePortButton_Click);
+      // 
+      // servicePortView
+      // 
+      this.servicePortView.AllowDrop = true;
+      this.servicePortView.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.servicePortView.Caption = "Service Port View";
+      this.servicePortView.Content = null;
+      this.servicePortView.Location = new System.Drawing.Point(66, 21);
+      this.servicePortView.Name = "servicePortView";
+      this.servicePortView.ReadOnly = true;
+      this.servicePortView.Size = new System.Drawing.Size(554, 23);
+      this.servicePortView.TabIndex = 2;
+      this.servicePortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.servicePortView_DragDrop);
+      this.servicePortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.servicePortView_DragEnterOver);
+      this.servicePortView.DragOver += new System.Windows.Forms.DragEventHandler(this.servicePortView_DragEnterOver);
+      // 
+      // cloneServicePortParametersButton
+      // 
+      this.cloneServicePortParametersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Clone;
+      this.cloneServicePortParametersButton.Location = new System.Drawing.Point(156, 101);
+      this.cloneServicePortParametersButton.Name = "cloneServicePortParametersButton";
+      this.cloneServicePortParametersButton.Size = new System.Drawing.Size(24, 24);
+      this.cloneServicePortParametersButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.cloneServicePortParametersButton, "Clone Parameters from Service Port");
+      this.cloneServicePortParametersButton.UseVisualStyleBackColor = true;
+      this.cloneServicePortParametersButton.Click += new System.EventHandler(this.cloneServicePortParametersButton_Click);
+      // 
+      // ClientPortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.cloneServicePortParametersButton);
+      this.Controls.Add(this.servicePortGroupBox);
+      this.Name = "ClientPortView";
+      this.Controls.SetChildIndex(this.serviceParameterCollectionView, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.servicePortGroupBox, 0);
+      this.Controls.SetChildIndex(this.cloneServicePortParametersButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.servicePortGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox servicePortGroupBox;
+    protected PortView servicePortView;
+    protected System.Windows.Forms.Button clearServicePortButton;
+    protected System.Windows.Forms.Button setServicePortButton;
+    protected System.Windows.Forms.Button cloneServicePortParametersButton;
+
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientPortView.cs	(revision 15895)
@@ -0,0 +1,141 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ClientPort View")]
+  [Content(typeof(ClientPort), true)]
+  [Content(typeof(IClientPort), false)]
+  public partial class ClientPortView : ClientServicePortView {
+    protected EntitySelectorDialog entitySelectorDialog;
+
+    public new IClientPort Content {
+      get { return (IClientPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ClientPortView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(servicePortView, ErrorIconAlignment.MiddleRight);
+      errorProvider.SetIconPadding(servicePortView, 2);
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (entitySelectorDialog != null) entitySelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ServicePortChanged -= Content_ServicePortChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ServicePortChanged += Content_ServicePortChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      servicePortView.Content = Content == null ? null : Content.ServicePort;
+      errorProvider.SetError(servicePortView, ((Content == null) || Content.Valid) ? string.Empty : "Port configurations do not match");
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      servicePortGroupBox.Enabled = Content != null && !ReadOnly;
+      setServicePortButton.Enabled = Content != null && !ReadOnly;
+      clearServicePortButton.Enabled = Content != null && Content.ServicePort != null && !ReadOnly;
+      cloneServicePortParametersButton.Enabled = Content != null && Content.ServicePort != null && !ReadOnly;
+    }
+
+    protected virtual void Content_ServicePortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ServicePortChanged), sender, e);
+      else {
+        clearServicePortButton.Enabled = Content.ServicePort != null && !ReadOnly;
+        cloneServicePortParametersButton.Enabled = Content.ServicePort != null && !ReadOnly;
+        servicePortView.Content = Content.ServicePort;
+      }
+    }
+    protected override void Content_InterfaceChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_InterfaceChanged), sender, e);
+      else {
+        base.Content_InterfaceChanged(sender, e);
+        errorProvider.SetError(servicePortView, Content.Valid ? string.Empty : "Port configurations do not match");
+      }
+    }
+
+    protected virtual void setServicePortButton_Click(object sender, EventArgs e) {
+      if (entitySelectorDialog == null) {
+        entitySelectorDialog = new EntitySelectorDialog();
+        entitySelectorDialog.Caption = "Select Service Port";
+        entitySelectorDialog.EntitySelector.Caption = "Available Service Ports";
+      }
+
+      try {
+        IEntity root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        entitySelectorDialog.EntitySelector.Configure(
+          root,
+          Content.ServicePort,
+          typeof(IServicePort)
+        );
+
+        if (entitySelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.ServicePort = entitySelectorDialog.EntitySelector.SelectedEntity as IServicePort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearServicePortButton_Click(object sender, EventArgs e) {
+      Content.ServicePort = null;
+    }
+
+    protected virtual void servicePortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = (IServicePort)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+
+      if (!ReadOnly && (Content.IsValidServicePort(data))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void servicePortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IServicePort port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IServicePort;
+        Content.ServicePort = port;
+      }
+    }
+    protected virtual void cloneServicePortParametersButton_Click(object sender, EventArgs e) {
+      Content.CloneServicePortParameters();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.Designer.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ClientServicePortView {
+    /// <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.serviceParameterCollectionView = new HeuristicLab.Optimization.Networks.Views.ServiceParameterCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // serviceParameterCollectionView
+      // 
+      this.serviceParameterCollectionView.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.serviceParameterCollectionView.Caption = "ServiceParameterCollection View";
+      this.serviceParameterCollectionView.Content = null;
+      this.serviceParameterCollectionView.Location = new System.Drawing.Point(0, 26);
+      this.serviceParameterCollectionView.Name = "serviceParameterCollectionView";
+      this.serviceParameterCollectionView.ReadOnly = false;
+      this.serviceParameterCollectionView.ShowDetails = true;
+      this.serviceParameterCollectionView.Size = new System.Drawing.Size(645, 491);
+      this.serviceParameterCollectionView.TabIndex = 3;
+      // 
+      // ClientServicePortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.serviceParameterCollectionView);
+      this.Name = "ClientServicePortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.serviceParameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected ServiceParameterCollectionView serviceParameterCollectionView;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ClientServicePortView.cs	(revision 15895)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ClientServicePort View")]
+  [Content(typeof(ClientServicePort), true)]
+  [Content(typeof(IClientServicePort), false)]
+  public partial class ClientServicePortView : PortView {
+    public new IClientServicePort Content {
+      get { return (IClientServicePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ClientServicePortView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.InterfaceChanged -= Content_InterfaceChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.InterfaceChanged += Content_InterfaceChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      serviceParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      serviceParameterCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void Content_InterfaceChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.Designer.cs	(revision 15895)
@@ -0,0 +1,150 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class InputOutputPortView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputPortView));
+      this.outputInputPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setOutputInputPortButton = new System.Windows.Forms.Button();
+      this.clearOutputInputPortButton = new System.Windows.Forms.Button();
+      this.outputInputPortView = new HeuristicLab.Optimization.Networks.Views.PortView();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.outputInputPortGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 82);
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 435);
+      this.valueGroupBox.TabIndex = 4;
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.Size = new System.Drawing.Size(633, 410);
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Size = new System.Drawing.Size(633, 410);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(71, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(549, 20);
+      // 
+      // outputInputPortGroupBox
+      // 
+      this.outputInputPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.outputInputPortGroupBox.Controls.Add(this.setOutputInputPortButton);
+      this.outputInputPortGroupBox.Controls.Add(this.clearOutputInputPortButton);
+      this.outputInputPortGroupBox.Controls.Add(this.outputInputPortView);
+      this.outputInputPortGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.outputInputPortGroupBox.Name = "outputInputPortGroupBox";
+      this.outputInputPortGroupBox.Size = new System.Drawing.Size(645, 50);
+      this.outputInputPortGroupBox.TabIndex = 3;
+      this.outputInputPortGroupBox.TabStop = false;
+      this.outputInputPortGroupBox.Text = "&Output/Input Port";
+      // 
+      // setOutputInputPortButton
+      // 
+      this.setOutputInputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setOutputInputPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setOutputInputPortButton.Name = "setOutputInputPortButton";
+      this.setOutputInputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setOutputInputPortButton.TabIndex = 0;
+      this.setOutputInputPortButton.UseVisualStyleBackColor = true;
+      this.setOutputInputPortButton.Click += new System.EventHandler(this.setOutputInputPortButton_Click);
+      // 
+      // clearOutputInputPortButton
+      // 
+      this.clearOutputInputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearOutputInputPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearOutputInputPortButton.Name = "clearOutputInputPortButton";
+      this.clearOutputInputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearOutputInputPortButton.TabIndex = 1;
+      this.clearOutputInputPortButton.UseVisualStyleBackColor = true;
+      this.clearOutputInputPortButton.Click += new System.EventHandler(this.clearOutputInputPortButton_Click);
+      // 
+      // outputInputPortView
+      // 
+      this.outputInputPortView.AllowDrop = true;
+      this.outputInputPortView.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.outputInputPortView.Caption = "Output/Input Port View";
+      this.outputInputPortView.Content = null;
+      this.outputInputPortView.Location = new System.Drawing.Point(66, 21);
+      this.outputInputPortView.Name = "outputInputPortView";
+      this.outputInputPortView.ReadOnly = true;
+      this.outputInputPortView.Size = new System.Drawing.Size(573, 23);
+      this.outputInputPortView.TabIndex = 2;
+      this.outputInputPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragDrop);
+      this.outputInputPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragEnterOver);
+      this.outputInputPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragEnterOver);
+      // 
+      // InputOutputPortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.outputInputPortGroupBox);
+      this.Name = "InputOutputPortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      this.Controls.SetChildIndex(this.outputInputPortGroupBox, 0);
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.outputInputPortGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox outputInputPortGroupBox;
+    protected PortView outputInputPortView;
+    protected System.Windows.Forms.Button clearOutputInputPortButton;
+    protected System.Windows.Forms.Button setOutputInputPortButton;
+
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputOutputPortView.cs	(revision 15895)
@@ -0,0 +1,127 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("InputOutputPort View")]
+  [Content(typeof(InputOutputPort<,>), true)]
+  [Content(typeof(IInputOutputPort<,>), false)]
+  [Content(typeof(IInputOutputPort), false)]
+  public partial class InputOutputPortView : ValuePortView {
+    protected EntitySelectorDialog entitySelectorDialog;
+
+    public new IInputOutputPort Content {
+      get { return (IInputOutputPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public InputOutputPortView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (entitySelectorDialog != null) entitySelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OutputInputPortChanged -= Content_OutputInputPortChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.OutputInputPortChanged += Content_OutputInputPortChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      outputInputPortView.Content = Content == null ? null : Content.OutputInputPort;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      outputInputPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setOutputInputPortButton.Enabled = Content != null && !ReadOnly;
+      clearOutputInputPortButton.Enabled = Content != null && Content.OutputInputPort != null && !ReadOnly;
+    }
+
+    protected virtual void Content_OutputInputPortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_OutputInputPortChanged), sender, e);
+      else {
+        clearOutputInputPortButton.Enabled = Content.OutputInputPort != null && !ReadOnly;
+        outputInputPortView.Content = Content.OutputInputPort;
+      }
+    }
+
+    protected virtual void setOutputInputPortButton_Click(object sender, EventArgs e) {
+      if (entitySelectorDialog == null) {
+        entitySelectorDialog = new EntitySelectorDialog();
+        entitySelectorDialog.Caption = "Select Output/Input Port";
+        entitySelectorDialog.EntitySelector.Caption = "Available Output/Input Ports";
+      }
+
+      try {
+        IEntity root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        entitySelectorDialog.EntitySelector.Configure(
+          root,
+          Content.OutputInputPort,
+          typeof(IOutputInputPort<,>).MakeGenericType(Content.GetType().GetGenericArguments()[0], Content.GetType().GetGenericArguments()[1])
+        );
+
+        if (entitySelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.OutputInputPort = entitySelectorDialog.EntitySelector.SelectedEntity as IOutputInputPort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearOutputInputPortButton_Click(object sender, EventArgs e) {
+      Content.OutputInputPort = null;
+    }
+
+    protected virtual void outputInputPortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      var type = typeof(IOutputInputPort<,>).MakeGenericType(Content.GetType().GetGenericArguments()[0], Content.GetType().GetGenericArguments()[1]);
+
+      if (!ReadOnly && (type.IsAssignableFrom(data.GetType()))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void outputInputPortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IOutputInputPort port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IOutputInputPort;
+        Content.OutputInputPort = port;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.Designer.cs	(revision 15895)
@@ -0,0 +1,150 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class InputPortView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputPortView));
+      this.outputPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setOutputPortButton = new System.Windows.Forms.Button();
+      this.clearOutputPortButton = new System.Windows.Forms.Button();
+      this.outputPortView = new HeuristicLab.Optimization.Networks.Views.PortView();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.outputPortGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 82);
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 435);
+      this.valueGroupBox.TabIndex = 4;
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.Size = new System.Drawing.Size(633, 410);
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Size = new System.Drawing.Size(633, 410);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(71, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(549, 20);
+      // 
+      // outputPortGroupBox
+      // 
+      this.outputPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.outputPortGroupBox.Controls.Add(this.setOutputPortButton);
+      this.outputPortGroupBox.Controls.Add(this.clearOutputPortButton);
+      this.outputPortGroupBox.Controls.Add(this.outputPortView);
+      this.outputPortGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.outputPortGroupBox.Name = "outputPortGroupBox";
+      this.outputPortGroupBox.Size = new System.Drawing.Size(645, 50);
+      this.outputPortGroupBox.TabIndex = 3;
+      this.outputPortGroupBox.TabStop = false;
+      this.outputPortGroupBox.Text = "&Output Port";
+      // 
+      // setOutputPortButton
+      // 
+      this.setOutputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setOutputPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setOutputPortButton.Name = "setOutputPortButton";
+      this.setOutputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setOutputPortButton.TabIndex = 0;
+      this.setOutputPortButton.UseVisualStyleBackColor = true;
+      this.setOutputPortButton.Click += new System.EventHandler(this.setOutputPortButton_Click);
+      // 
+      // clearOutputPortButton
+      // 
+      this.clearOutputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearOutputPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearOutputPortButton.Name = "clearOutputPortButton";
+      this.clearOutputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearOutputPortButton.TabIndex = 1;
+      this.clearOutputPortButton.UseVisualStyleBackColor = true;
+      this.clearOutputPortButton.Click += new System.EventHandler(this.clearOutputPortButton_Click);
+      // 
+      // outputPortView
+      // 
+      this.outputPortView.AllowDrop = true;
+      this.outputPortView.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.outputPortView.Caption = "Output Port View";
+      this.outputPortView.Content = null;
+      this.outputPortView.Location = new System.Drawing.Point(66, 21);
+      this.outputPortView.Name = "outputPortView";
+      this.outputPortView.ReadOnly = true;
+      this.outputPortView.Size = new System.Drawing.Size(573, 23);
+      this.outputPortView.TabIndex = 2;
+      this.outputPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragDrop);
+      this.outputPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragEnterOver);
+      this.outputPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragEnterOver);
+      // 
+      // InputPortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.outputPortGroupBox);
+      this.Name = "InputPortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      this.Controls.SetChildIndex(this.outputPortGroupBox, 0);
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.outputPortGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox outputPortGroupBox;
+    protected PortView outputPortView;
+    protected System.Windows.Forms.Button clearOutputPortButton;
+    protected System.Windows.Forms.Button setOutputPortButton;
+
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/InputPortView.cs	(revision 15895)
@@ -0,0 +1,127 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("InputPort View")]
+  [Content(typeof(InputPort<>), true)]
+  [Content(typeof(IInputPort<>), false)]
+  [Content(typeof(IInputPort), false)]
+  public partial class InputPortView : ValuePortView {
+    protected EntitySelectorDialog entitySelectorDialog;
+
+    public new IInputPort Content {
+      get { return (IInputPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public InputPortView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (entitySelectorDialog != null) entitySelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OutputPortChanged -= Content_OutputPortChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.OutputPortChanged += Content_OutputPortChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      outputPortView.Content = Content == null ? null : Content.OutputPort;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      outputPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setOutputPortButton.Enabled = Content != null && !ReadOnly;
+      clearOutputPortButton.Enabled = Content != null && Content.OutputPort != null && !ReadOnly;
+    }
+
+    protected virtual void Content_OutputPortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_OutputPortChanged), sender, e);
+      else {
+        clearOutputPortButton.Enabled = Content.OutputPort != null && !ReadOnly;
+        outputPortView.Content = Content.OutputPort;
+      }
+    }
+
+    protected virtual void setOutputPortButton_Click(object sender, EventArgs e) {
+      if (entitySelectorDialog == null) {
+        entitySelectorDialog = new EntitySelectorDialog();
+        entitySelectorDialog.Caption = "Select Output Port";
+        entitySelectorDialog.EntitySelector.Caption = "Available Output Ports";
+      }
+
+      try {
+        IEntity root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        entitySelectorDialog.EntitySelector.Configure(
+          root,
+          Content.OutputPort,
+          typeof(IOutputPort<>).MakeGenericType(Content.GetType().GetGenericArguments()[0])
+        );
+
+        if (entitySelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.OutputPort = entitySelectorDialog.EntitySelector.SelectedEntity as IOutputPort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearOutputPortButton_Click(object sender, EventArgs e) {
+      Content.OutputPort = null;
+    }
+
+    protected virtual void outputPortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      var type = typeof(IOutputPort<>).MakeGenericType(Content.GetType().GetGenericArguments()[0]);
+
+      if (!ReadOnly && (type.IsAssignableFrom(data.GetType()))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void outputPortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IOutputPort port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IOutputPort;
+        Content.OutputPort = port;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ServiceParameterCollectionCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionCollectionView.cs	(revision 15895)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ServiceParameterCollectionCollection View")]
+  [Content(typeof(ServiceParameterCollectionCollection), true)]
+  [Content(typeof(IItemCollection<ServiceParameterCollection>), false)]
+  public partial class ServiceParameterCollectionCollectionView : ItemCollectionView<ServiceParameterCollection> {
+    public ServiceParameterCollectionCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Service Parameter Collections";
+    }
+
+    protected override ServiceParameterCollection CreateItem() {
+      return new ServiceParameterCollection();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ServiceParameterCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterCollectionView.cs	(revision 15895)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ServiceParameterCollection View")]
+  [Content(typeof(ServiceParameterCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IServiceParameter>), false)]
+  public partial class ServiceParameterCollectionView : NamedItemCollectionView<IServiceParameter> {
+    public ServiceParameterCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Service Parameters";
+    }
+
+    protected override IServiceParameter CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Service Parameter";
+        typeSelectorDialog.TypeSelector.Caption = "Available Service Parameters";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IServiceParameter), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          var p = (IServiceParameter)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          p.Name = GetUniqueName(p.Name);
+          return p;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.Designer.cs	(revision 15895)
@@ -0,0 +1,201 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ServiceParameterView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.clearValueButton = new System.Windows.Forms.Button();
+      this.setValueButton = new System.Windows.Forms.Button();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.typeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.typeComboBox = new System.Windows.Forms.ComboBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.clearValueButton);
+      this.valueGroupBox.Controls.Add(this.setValueButton);
+      this.valueGroupBox.Controls.Add(this.valuePanel);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 79);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 438);
+      this.valueGroupBox.TabIndex = 7;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // clearValueButton
+      // 
+      this.clearValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearValueButton.Location = new System.Drawing.Point(35, 19);
+      this.clearValueButton.Name = "clearValueButton";
+      this.clearValueButton.Size = new System.Drawing.Size(23, 23);
+      this.clearValueButton.TabIndex = 1;
+      this.clearValueButton.UseVisualStyleBackColor = true;
+      this.clearValueButton.Click += new System.EventHandler(this.clearValueButton_Click);
+      // 
+      // setValueButton
+      // 
+      this.setValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setValueButton.Name = "setValueButton";
+      this.setValueButton.Size = new System.Drawing.Size(23, 23);
+      this.setValueButton.TabIndex = 0;
+      this.setValueButton.UseVisualStyleBackColor = true;
+      this.setValueButton.Click += new System.EventHandler(this.setValueButton_Click);
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.AllowDrop = true;
+      this.valuePanel.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.valuePanel.Controls.Add(this.valueViewHost);
+      this.valuePanel.Location = new System.Drawing.Point(6, 48);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(633, 384);
+      this.valuePanel.TabIndex = 0;
+      this.valuePanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragDrop);
+      this.valuePanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragEnterOver);
+      this.valuePanel.DragOver += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragEnterOver);
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(0, 0);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(633, 384);
+      this.valueViewHost.TabIndex = 0;
+      this.valueViewHost.ViewsLabelVisible = true;
+      this.valueViewHost.ViewType = null;
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 29);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 3;
+      this.dataTypeLabel.Text = "&Data Type:";
+      // 
+      // typeLabel
+      // 
+      this.typeLabel.AutoSize = true;
+      this.typeLabel.Location = new System.Drawing.Point(3, 55);
+      this.typeLabel.Name = "typeLabel";
+      this.typeLabel.Size = new System.Drawing.Size(34, 13);
+      this.typeLabel.TabIndex = 5;
+      this.typeLabel.Text = "&Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(69, 26);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(551, 20);
+      this.dataTypeTextBox.TabIndex = 4;
+      // 
+      // typeComboBox
+      // 
+      this.typeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.typeComboBox.FormattingEnabled = true;
+      this.typeComboBox.Items.AddRange(new object[] {
+            "Input",
+            "Output"});
+      this.typeComboBox.Location = new System.Drawing.Point(69, 52);
+      this.typeComboBox.Name = "typeComboBox";
+      this.typeComboBox.Size = new System.Drawing.Size(92, 21);
+      this.typeComboBox.TabIndex = 6;
+      this.typeComboBox.SelectedIndexChanged += new System.EventHandler(this.typeComboBox_SelectedIndexChanged);
+      // 
+      // ServiceParameterView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.typeComboBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.typeLabel);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ServiceParameterView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.typeLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.typeComboBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected System.Windows.Forms.Panel valuePanel;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+    protected System.Windows.Forms.Label dataTypeLabel;
+    protected System.Windows.Forms.Label typeLabel;
+    protected System.Windows.Forms.TextBox dataTypeTextBox;
+    protected System.Windows.Forms.ComboBox typeComboBox;
+    protected System.Windows.Forms.Button setValueButton;
+    protected System.Windows.Forms.Button clearValueButton;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ServiceParameterView.cs	(revision 15895)
@@ -0,0 +1,146 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ServiceParameter View")]
+  [Content(typeof(ServiceParameter<>), true)]
+  [Content(typeof(IServiceParameter<>), false)]
+  [Content(typeof(IServiceParameter), false)]
+  public partial class ServiceParameterView : EntityView {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new IServiceParameter Content {
+      get { return (IServiceParameter)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ServiceParameterView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.TypeChanged -= Content_TypeChanged;
+      Content.ValueChanged -= Content_ValueChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.TypeChanged += Content_TypeChanged;
+      Content.ValueChanged += Content_ValueChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeTextBox.Text = string.Empty;
+        typeComboBox.SelectedIndex = 0;
+        valueViewHost.Content = null;
+      } else {
+        dataTypeTextBox.Text = Content.DataType.GetPrettyName();
+        typeComboBox.SelectedIndex = Content.Type == ServiceParameterType.Input ? 0 : 1;
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      dataTypeTextBox.Enabled = Content != null;
+      typeComboBox.Enabled = Content != null && !ReadOnly;
+      valueGroupBox.Enabled = Content != null;
+      setValueButton.Enabled = Content != null && !ReadOnly;
+      clearValueButton.Enabled = Content != null && Content.Value != null && !ReadOnly;
+    }
+    protected virtual void Content_TypeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_TypeChanged), sender, e);
+      else {
+        typeComboBox.SelectedIndex = Content.Type == ServiceParameterType.Input ? 0 : 1;
+      }
+    }
+    protected virtual void Content_ValueChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        clearValueButton.Enabled = Content.Value != null;
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+
+    protected virtual void typeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.Type = typeComboBox.SelectedIndex == 0 ? ServiceParameterType.Input : ServiceParameterType.Output;
+    }
+
+    protected virtual void setValueButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Value";
+      }
+      typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Value = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    protected virtual void clearValueButton_Click(object sender, EventArgs e) {
+      Content.Value = null;
+    }
+    protected virtual void valuePanel_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IItem)) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void valuePanel_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IItem item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
+        Content.Value = item;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.Designer.cs	(revision 15895)
@@ -0,0 +1,125 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class ValuePortView {
+    /// <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.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.valuePanel);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 491);
+      this.valueGroupBox.TabIndex = 3;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.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.valuePanel.Controls.Add(this.valueViewHost);
+      this.valuePanel.Location = new System.Drawing.Point(6, 19);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(633, 466);
+      this.valuePanel.TabIndex = 0;
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(0, 0);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(633, 466);
+      this.valueViewHost.TabIndex = 0;
+      this.valueViewHost.ViewsLabelVisible = true;
+      this.valueViewHost.ViewType = null;
+      // 
+      // ValuePortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ValuePortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected System.Windows.Forms.Panel valuePanel;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/ValuePortView.cs	(revision 15895)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ValuePort View")]
+  [Content(typeof(ValuePort<>), true)]
+  [Content(typeof(IValuePort<>), false)]
+  [Content(typeof(IValuePort), false)]
+  public partial class ValuePortView : PortView {
+    public new IValuePort Content {
+      get { return (IValuePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValuePortView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= Content_ValueChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += Content_ValueChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        valueViewHost.Content = null;
+      } else {
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      valueGroupBox.Enabled = Content != null;
+    }
+    protected virtual void Content_ValueChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,133 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks.Views {
+  partial class VariablesNodeView {
+    /// <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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variableCollectionView = new HeuristicLab.Core.Views.VariableCollectionView();
+      this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 26);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.portCollectionView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableCollectionView);
+      this.splitContainer.Size = new System.Drawing.Size(645, 491);
+      this.splitContainer.SplitterDistance = 237;
+      this.splitContainer.TabIndex = 3;
+      // 
+      // variableCollectionView
+      // 
+      this.variableCollectionView.Caption = "VariableCollection View";
+      this.variableCollectionView.Content = null;
+      this.variableCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.variableCollectionView.Name = "variableCollectionView";
+      this.variableCollectionView.ReadOnly = false;
+      this.variableCollectionView.ShowDetails = true;
+      this.variableCollectionView.Size = new System.Drawing.Size(645, 250);
+      this.variableCollectionView.TabIndex = 0;
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(645, 237);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // VariablesNodeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "VariablesNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.splitContainer, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected Core.Views.VariableCollectionView variableCollectionView;
+    private PortCollectionView portCollectionView;
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/### obsolete/VariablesNodeView.cs	(revision 15895)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("VariablesNode View")]
+  [Content(typeof(VariablesNode), true)]
+  [Content(typeof(IVariablesNode), false)]
+  public partial class VariablesNodeView : EntityView {
+    public new IVariablesNode Content {
+      get { return (IVariablesNode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public VariablesNodeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portCollectionView.Content = Content == null ? null : Content.Ports;
+      variableCollectionView.Content = Content == null ? null : Content.Variables;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      portCollectionView.Enabled = Content != null && !ReadOnly;
+      variableCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,220 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Views {
+  partial class AlgorithmNodeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmNodeView));
+      this.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmTabPage = new System.Windows.Forms.TabPage();
+      this.algorithmPanel = new System.Windows.Forms.Panel();
+      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.clearAlgorithmButton = new System.Windows.Forms.Button();
+      this.setAlgorithmButton = new System.Windows.Forms.Button();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.algorithmTabPage.SuspendLayout();
+      this.algorithmPanel.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.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.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(625, 453);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.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.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Controls.Add(this.algorithmTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 491);
+      this.tabControl.TabIndex = 3;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.portsTabPage.TabIndex = 0;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmTabPage
+      // 
+      this.algorithmTabPage.Controls.Add(this.algorithmPanel);
+      this.algorithmTabPage.Controls.Add(this.clearAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.setAlgorithmButton);
+      this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmTabPage.Name = "algorithmTabPage";
+      this.algorithmTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.algorithmTabPage.Size = new System.Drawing.Size(637, 465);
+      this.algorithmTabPage.TabIndex = 1;
+      this.algorithmTabPage.Text = "Algorithm";
+      this.algorithmTabPage.UseVisualStyleBackColor = true;
+      // 
+      // algorithmPanel
+      // 
+      this.algorithmPanel.AllowDrop = true;
+      this.algorithmPanel.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.algorithmPanel.Controls.Add(this.algorithmViewHost);
+      this.algorithmPanel.Location = new System.Drawing.Point(6, 36);
+      this.algorithmPanel.Name = "algorithmPanel";
+      this.algorithmPanel.Size = new System.Drawing.Size(625, 423);
+      this.algorithmPanel.TabIndex = 2;
+      this.algorithmPanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragDrop);
+      this.algorithmPanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragEnterOver);
+      this.algorithmPanel.DragOver += new System.Windows.Forms.DragEventHandler(this.algorithmPanel_DragEnterOver);
+      // 
+      // algorithmViewHost
+      // 
+      this.algorithmViewHost.Caption = "View";
+      this.algorithmViewHost.Content = null;
+      this.algorithmViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.algorithmViewHost.Enabled = false;
+      this.algorithmViewHost.Location = new System.Drawing.Point(0, 0);
+      this.algorithmViewHost.Name = "algorithmViewHost";
+      this.algorithmViewHost.ReadOnly = false;
+      this.algorithmViewHost.Size = new System.Drawing.Size(625, 423);
+      this.algorithmViewHost.TabIndex = 0;
+      this.algorithmViewHost.ViewsLabelVisible = true;
+      this.algorithmViewHost.ViewType = null;
+      // 
+      // clearAlgorithmButton
+      // 
+      this.clearAlgorithmButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearAlgorithmButton.Location = new System.Drawing.Point(36, 6);
+      this.clearAlgorithmButton.Name = "clearAlgorithmButton";
+      this.clearAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.clearAlgorithmButton.TabIndex = 1;
+      this.clearAlgorithmButton.UseVisualStyleBackColor = true;
+      this.clearAlgorithmButton.Click += new System.EventHandler(this.clearAlgorithmButton_Click);
+      // 
+      // setAlgorithmButton
+      // 
+      this.setAlgorithmButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setAlgorithmButton.Location = new System.Drawing.Point(6, 6);
+      this.setAlgorithmButton.Name = "setAlgorithmButton";
+      this.setAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.setAlgorithmButton.TabIndex = 0;
+      this.setAlgorithmButton.UseVisualStyleBackColor = true;
+      this.setAlgorithmButton.Click += new System.EventHandler(this.setAlgorithmButton_Click);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.runsTabPage.TabIndex = 2;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runCollectionView
+      // 
+      this.runCollectionView.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.runCollectionView.Caption = "RunCollection View";
+      this.runCollectionView.Content = null;
+      this.runCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.runCollectionView.Name = "runCollectionView";
+      this.runCollectionView.ReadOnly = false;
+      this.runCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.runCollectionView.TabIndex = 0;
+      // 
+      // AlgorithmNodeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.tabControl);
+      this.Name = "AlgorithmNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.algorithmTabPage.ResumeLayout(false);
+      this.algorithmPanel.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected HeuristicLab.Core.Networks.Views.PortCollectionView portCollectionView;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected System.Windows.Forms.Button setAlgorithmButton;
+    protected System.Windows.Forms.Button clearAlgorithmButton;
+    protected System.Windows.Forms.Panel algorithmPanel;
+    protected HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage algorithmTabPage;
+    protected MainForm.WindowsForms.ViewHost algorithmViewHost;
+    protected System.Windows.Forms.TabPage runsTabPage;
+    protected Optimization.Views.RunCollectionView runCollectionView;
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 15895)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Views {
+  [View("AlgorithmNode View")]
+  [Content(typeof(AlgorithmNode), true)]
+  [Content(typeof(IAlgorithmNode), false)]
+  public partial class AlgorithmNodeView : NetworkItemView {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new IAlgorithmNode Content {
+      get { return (IAlgorithmNode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AlgorithmNodeView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.AlgorithmChanged -= Content_AlgorithmChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.AlgorithmChanged += Content_AlgorithmChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        portCollectionView.Content = null;
+        algorithmViewHost.Content = null;
+        runCollectionView.Content = null;
+      } else {
+        portCollectionView.Content = Content.Ports;
+        algorithmViewHost.ViewType = null;
+        algorithmViewHost.Content = Content.Algorithm;
+        runCollectionView.Content = Content.Runs;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      portCollectionView.Enabled = Content != null && !ReadOnly;
+      setAlgorithmButton.Enabled = Content != null && !ReadOnly;
+      clearAlgorithmButton.Enabled = Content != null && Content.Algorithm != null && !ReadOnly;
+      algorithmPanel.Enabled = Content != null;
+      runCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void Content_AlgorithmChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmChanged), sender, e);
+      else {
+        clearAlgorithmButton.Enabled = Content.Algorithm != null && !ReadOnly;
+        algorithmViewHost.ViewType = null;
+        algorithmViewHost.Content = Content.Algorithm;
+      }
+    }
+
+    protected virtual void setAlgorithmButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Algorithm";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IAlgorithm), false, true);
+      }
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Algorithm = (IAlgorithm)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    protected virtual void clearAlgorithmButton_Click(object sender, EventArgs e) {
+      Content.Algorithm = null;
+    }
+    protected virtual void algorithmPanel_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IAlgorithm)) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void algorithmPanel_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IAlgorithm alg = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IAlgorithm;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) alg = (IAlgorithm)alg.Clone();
+        Content.Algorithm = alg;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class MessageCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageCollectionView.cs	(revision 15895)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("MessageCollection View")]
+  [Content(typeof(MessageCollection), true)]
+  [Content(typeof(IItemCollection<IMessage>), false)]
+  public partial class MessageCollectionView : ItemCollectionView<IMessage> {
+    public MessageCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Messages";
+    }
+
+    protected override IMessage CreateItem() {
+      return new Message();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.Designer.cs	(revision 15895)
@@ -0,0 +1,238 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class MessagePortView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.connectedPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setConnectedPortButton = new System.Windows.Forms.Button();
+      this.clearConnectedPortButton = new System.Windows.Forms.Button();
+      this.connectedPortView = new HeuristicLab.Core.Networks.Views.PortView();
+      this.cloneParametersFromPortButton = new System.Windows.Forms.Button();
+      this.sendMessageButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.portParameterCollectionView = new HeuristicLab.Core.Networks.Views.PortParameterCollectionView();
+      this.lastMessageGroupBox = new System.Windows.Forms.GroupBox();
+      this.lastMessageView = new HeuristicLab.Core.Networks.Views.MessageView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.connectedPortGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.lastMessageGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(47, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(573, 20);
+      // 
+      // connectedPortGroupBox
+      // 
+      this.connectedPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.connectedPortGroupBox.Controls.Add(this.setConnectedPortButton);
+      this.connectedPortGroupBox.Controls.Add(this.clearConnectedPortButton);
+      this.connectedPortGroupBox.Controls.Add(this.connectedPortView);
+      this.connectedPortGroupBox.Location = new System.Drawing.Point(47, 26);
+      this.connectedPortGroupBox.Name = "connectedPortGroupBox";
+      this.connectedPortGroupBox.Size = new System.Drawing.Size(598, 50);
+      this.connectedPortGroupBox.TabIndex = 4;
+      this.connectedPortGroupBox.TabStop = false;
+      this.connectedPortGroupBox.Text = "&Connected Port";
+      // 
+      // setConnectedPortButton
+      // 
+      this.setConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setConnectedPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setConnectedPortButton.Name = "setConnectedPortButton";
+      this.setConnectedPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setConnectedPortButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.setConnectedPortButton, "Set Connected Port");
+      this.setConnectedPortButton.UseVisualStyleBackColor = true;
+      this.setConnectedPortButton.Click += new System.EventHandler(this.setConnectedPortButton_Click);
+      // 
+      // clearConnectedPortButton
+      // 
+      this.clearConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearConnectedPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearConnectedPortButton.Name = "clearConnectedPortButton";
+      this.clearConnectedPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearConnectedPortButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.clearConnectedPortButton, "Remove Connected Port");
+      this.clearConnectedPortButton.UseVisualStyleBackColor = true;
+      this.clearConnectedPortButton.Click += new System.EventHandler(this.clearConnectedPortButton_Click);
+      // 
+      // connectedPortView
+      // 
+      this.connectedPortView.AllowDrop = true;
+      this.connectedPortView.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.connectedPortView.Caption = "Connected Port View";
+      this.connectedPortView.Content = null;
+      this.connectedPortView.Location = new System.Drawing.Point(66, 21);
+      this.connectedPortView.Name = "connectedPortView";
+      this.connectedPortView.ReadOnly = true;
+      this.connectedPortView.Size = new System.Drawing.Size(507, 23);
+      this.connectedPortView.TabIndex = 2;
+      this.connectedPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragDrop);
+      this.connectedPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
+      this.connectedPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
+      // 
+      // cloneParametersFromPortButton
+      // 
+      this.cloneParametersFromPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Clone;
+      this.cloneParametersFromPortButton.Location = new System.Drawing.Point(156, 101);
+      this.cloneParametersFromPortButton.Name = "cloneParametersFromPortButton";
+      this.cloneParametersFromPortButton.Size = new System.Drawing.Size(24, 24);
+      this.cloneParametersFromPortButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.cloneParametersFromPortButton, "Clone parameters from another port");
+      this.cloneParametersFromPortButton.UseVisualStyleBackColor = true;
+      this.cloneParametersFromPortButton.Click += new System.EventHandler(this.cloneParametersFromPortButton_Click);
+      // 
+      // sendMessageButton
+      // 
+      this.sendMessageButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Exception;
+      this.sendMessageButton.Location = new System.Drawing.Point(6, 45);
+      this.sendMessageButton.Name = "sendMessageButton";
+      this.sendMessageButton.Size = new System.Drawing.Size(24, 24);
+      this.sendMessageButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.sendMessageButton, "Send Message");
+      this.sendMessageButton.UseVisualStyleBackColor = true;
+      this.sendMessageButton.Click += new System.EventHandler(this.sendMessageButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 82);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.portParameterCollectionView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.lastMessageGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(645, 435);
+      this.splitContainer.SplitterDistance = 218;
+      this.splitContainer.TabIndex = 7;
+      // 
+      // portParameterCollectionView
+      // 
+      this.portParameterCollectionView.Caption = "PortParameterCollection View";
+      this.portParameterCollectionView.Content = null;
+      this.portParameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portParameterCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.portParameterCollectionView.Name = "portParameterCollectionView";
+      this.portParameterCollectionView.ReadOnly = false;
+      this.portParameterCollectionView.ShowDetails = true;
+      this.portParameterCollectionView.Size = new System.Drawing.Size(645, 218);
+      this.portParameterCollectionView.TabIndex = 0;
+      // 
+      // lastMessageGroupBox
+      // 
+      this.lastMessageGroupBox.Controls.Add(this.lastMessageView);
+      this.lastMessageGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lastMessageGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.lastMessageGroupBox.Name = "lastMessageGroupBox";
+      this.lastMessageGroupBox.Size = new System.Drawing.Size(645, 213);
+      this.lastMessageGroupBox.TabIndex = 0;
+      this.lastMessageGroupBox.TabStop = false;
+      this.lastMessageGroupBox.Text = "Last Message";
+      // 
+      // lastMessageView
+      // 
+      this.lastMessageView.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.lastMessageView.Caption = "Message View";
+      this.lastMessageView.Content = null;
+      this.lastMessageView.Location = new System.Drawing.Point(6, 19);
+      this.lastMessageView.Name = "lastMessageView";
+      this.lastMessageView.ReadOnly = true;
+      this.lastMessageView.Size = new System.Drawing.Size(633, 188);
+      this.lastMessageView.TabIndex = 0;
+      // 
+      // MessagePortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.sendMessageButton);
+      this.Controls.Add(this.cloneParametersFromPortButton);
+      this.Controls.Add(this.connectedPortGroupBox);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "MessagePortView";
+      this.Controls.SetChildIndex(this.splitContainer, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.connectedPortGroupBox, 0);
+      this.Controls.SetChildIndex(this.cloneParametersFromPortButton, 0);
+      this.Controls.SetChildIndex(this.sendMessageButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.connectedPortGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.lastMessageGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox connectedPortGroupBox;
+    protected PortView connectedPortView;
+    protected System.Windows.Forms.Button clearConnectedPortButton;
+    protected System.Windows.Forms.Button setConnectedPortButton;
+    protected System.Windows.Forms.Button cloneParametersFromPortButton;
+    protected System.Windows.Forms.Button sendMessageButton;
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected PortParameterCollectionView portParameterCollectionView;
+    protected System.Windows.Forms.GroupBox lastMessageGroupBox;
+    protected MessageView lastMessageView;
+
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessagePortView.cs	(revision 15895)
@@ -0,0 +1,173 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("MessagePort View")]
+  [Content(typeof(MessagePort), true)]
+  [Content(typeof(IMessagePort), false)]
+  public partial class MessagePortView : PortView {
+    protected NetworkItemSelectorDialog networkItemSelectorDialog;
+
+    public new IMessagePort Content {
+      get { return (IMessagePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MessagePortView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(connectedPortView, ErrorIconAlignment.MiddleRight);
+      errorProvider.SetIconPadding(connectedPortView, 2);
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (networkItemSelectorDialog != null) networkItemSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ConnectedPortChanged -= Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged -= Content_PortConnectionValidChanged;
+      Content.LastMessageChanged -= Content_LastMessageChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ConnectedPortChanged += Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged += Content_PortConnectionValidChanged;
+      Content.LastMessageChanged += Content_LastMessageChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+      connectedPortView.Content = Content == null ? null : Content.ConnectedPort;
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+      lastMessageView.Content = Content == null ? null : Content.LastMessage;
+      errorProvider.SetError(connectedPortView, ((Content == null) || Content.PortConnectionValid) ? string.Empty : "Port connection is not valid");
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      sendMessageButton.Enabled = Content != null;
+      connectedPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setConnectedPortButton.Enabled = Content != null && !ReadOnly;
+      clearConnectedPortButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
+      portParameterCollectionView.Enabled = Content != null && !ReadOnly;
+      cloneParametersFromPortButton.Enabled = Content != null && !Content.Parameters.IsReadOnly && !ReadOnly;
+      lastMessageView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void Content_ConnectedPortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ConnectedPortChanged), sender, e);
+      else {
+        clearConnectedPortButton.Enabled = Content.ConnectedPort != null && !ReadOnly;
+        connectedPortView.Content = Content.ConnectedPort;
+      }
+    }
+    protected virtual void Content_PortConnectionValidChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_PortConnectionValidChanged), sender, e);
+      else {
+        errorProvider.SetError(connectedPortView, Content.PortConnectionValid ? string.Empty : "Port connection is not valid");
+      }
+    }
+    protected virtual void Content_LastMessageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_LastMessageChanged), sender, e);
+      else {
+        lastMessageView.Content = Content.LastMessage;
+      }
+    }
+
+    protected virtual void sendMessageButton_Click(object sender, EventArgs e) {
+      Content.SendMessageAsync(Content.PrepareMessage());
+    }
+
+    protected virtual void setConnectedPortButton_Click(object sender, EventArgs e) {
+      if (networkItemSelectorDialog == null) networkItemSelectorDialog = new NetworkItemSelectorDialog();
+      networkItemSelectorDialog.Caption = "Select Connected Port";
+      networkItemSelectorDialog.NetworkItemSelector.Caption = "Available Ports";
+
+      try {
+        INetworkItem root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        networkItemSelectorDialog.NetworkItemSelector.Configure(
+          root,
+          Content.ConnectedPort,
+          typeof(IMessagePort)
+        );
+
+        if (networkItemSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.ConnectedPort = networkItemSelectorDialog.NetworkItemSelector.SelectedNetworkItem as IMessagePort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearConnectedPortButton_Click(object sender, EventArgs e) {
+      Content.ConnectedPort = null;
+    }
+
+    protected virtual void connectedPortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IPort;
+
+      if (!ReadOnly && (data != null) && (Content.CanConnectToPort(data))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void connectedPortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IMessagePort;
+        Content.ConnectedPort = port;
+      }
+    }
+    protected virtual void cloneParametersFromPortButton_Click(object sender, EventArgs e) {
+      if (networkItemSelectorDialog == null) networkItemSelectorDialog = new NetworkItemSelectorDialog();
+      networkItemSelectorDialog.Caption = "Select Port to Clone Parameters from";
+      networkItemSelectorDialog.NetworkItemSelector.Caption = "Available Ports";
+
+      INetworkItem root = Content;
+      while (root.Parent != null)
+        root = root.Parent;
+      networkItemSelectorDialog.NetworkItemSelector.Configure(
+        root,
+        Content,
+        typeof(IParameterizedPort)
+      );
+
+      if (networkItemSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.CloneParametersFromPort(networkItemSelectorDialog.NetworkItemSelector.SelectedNetworkItem as IParameterizedPort);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class MessageValueCollectionView {
+    /// <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 Windows Form 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.SuspendLayout();
+      // 
+      // MessageValueCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "MessageValueCollectionView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueCollectionView.cs	(revision 15895)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("MessageValueCollection View")]
+  [Content(typeof(MessageValueCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IMessageValue>), false)]
+  public partial class MessageValueCollectionView : ItemCollectionView<IMessageValue> {
+    public new IKeyedItemCollection<string, IMessageValue> Content {
+      get { return (IKeyedItemCollection<string, IMessageValue>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MessageValueCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Message Values";
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<IMessageValue>(Content_ItemsReplaced);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IMessageValue>(Content_ItemsReplaced);
+    }
+
+    protected override void OnContentChanged() {
+      string selectedName = null;
+      if ((itemsListView.SelectedItems.Count == 1) && (itemsListView.SelectedItems[0].Tag != null &&
+        itemsListView.SelectedItems[0].Tag is IMessageValue))
+        selectedName = ((IMessageValue)itemsListView.SelectedItems[0].Tag).Name;
+      base.OnContentChanged();
+      if (selectedName != null) {
+        foreach (ListViewItem item in itemsListView.Items) {
+          if ((item.Tag != null) && (((IMessageValue)item.Tag).Name.Equals(selectedName)))
+            item.Selected = true;
+        }
+      }
+    }
+
+    #region Content Events
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IMessageValue> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IMessageValue>(Content_ItemsReplaced), sender, e);
+      else {
+        foreach (IMessageValue value in e.Items) {
+          foreach (ListViewItem listViewItem in GetListViewItemsForItem(value))
+            UpdateListViewItemText(listViewItem);
+        }
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.Designer.cs	(revision 15895)
@@ -0,0 +1,141 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class MessageValueView {
+    /// <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.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.valuePanel);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(482, 271);
+      this.valueGroupBox.TabIndex = 2;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.AllowDrop = true;
+      this.valuePanel.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.valuePanel.Controls.Add(this.valueViewHost);
+      this.valuePanel.Location = new System.Drawing.Point(6, 19);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(470, 246);
+      this.valuePanel.TabIndex = 0;
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(0, 0);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(470, 246);
+      this.valueViewHost.TabIndex = 0;
+      this.valueViewHost.ViewsLabelVisible = true;
+      this.valueViewHost.ViewType = null;
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 3);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 0;
+      this.dataTypeLabel.Text = "&Data Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(69, 0);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(413, 20);
+      this.dataTypeTextBox.TabIndex = 1;
+      // 
+      // MessageValueView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "MessageValueView";
+      this.Size = new System.Drawing.Size(482, 297);
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected System.Windows.Forms.Panel valuePanel;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+    protected System.Windows.Forms.Label dataTypeLabel;
+    protected System.Windows.Forms.TextBox dataTypeTextBox;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageValueView.cs	(revision 15895)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("MessageValue View")]
+  [Content(typeof(MessageValue<>), true)]
+  [Content(typeof(IMessageValue<>), false)]
+  [Content(typeof(IMessageValue), false)]
+  public partial class MessageValueView : ItemView {
+    public new IMessageValue Content {
+      get { return (IMessageValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MessageValueView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= Content_ValueChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += Content_ValueChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeTextBox.Text = string.Empty;
+        valueViewHost.Content = null;
+      } else {
+        dataTypeTextBox.Text = Content.DataType.GetPrettyName();
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      dataTypeTextBox.Enabled = Content != null;
+      valueGroupBox.Enabled = Content != null;
+    }
+    protected virtual void Content_ValueChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        valueViewHost.ViewType = null;
+        valueViewHost.Content = Content.Value;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.Designer.cs	(revision 15895)
@@ -0,0 +1,80 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class MessageView {
+    /// <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.messageValueCollectionView = new HeuristicLab.Core.Networks.Views.MessageValueCollectionView();
+      this.SuspendLayout();
+      // 
+      // messageValueCollectionView
+      // 
+      this.messageValueCollectionView.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.messageValueCollectionView.Caption = "MessageValueCollection View";
+      this.messageValueCollectionView.Content = null;
+      this.messageValueCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.messageValueCollectionView.Name = "messageValueCollectionView";
+      this.messageValueCollectionView.ReadOnly = true;
+      this.messageValueCollectionView.ShowDetails = true;
+      this.messageValueCollectionView.Size = new System.Drawing.Size(645, 517);
+      this.messageValueCollectionView.TabIndex = 3;
+      // 
+      // MessageView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.messageValueCollectionView);
+      this.Name = "MessageView";
+      this.Size = new System.Drawing.Size(645, 517);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected MessageValueCollectionView messageValueCollectionView;
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/MessageView.cs	(revision 15895)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("Message View")]
+  [Content(typeof(Message), true)]
+  [Content(typeof(IMessage), false)]
+  public partial class MessageView : ItemView {
+    public new IMessage Content {
+      get { return (IMessage)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MessageView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      messageValueCollectionView.Content = Content == null ? null : Content.Values;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      messageValueCollectionView.Enabled = Content != null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.Designer.cs	(revision 15895)
@@ -0,0 +1,106 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NetworkItemSelector {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.networkItemsTreeView = new System.Windows.Forms.TreeView();
+      this.networkItemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.networkItemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // networkItemsTreeView
+      // 
+      this.networkItemsTreeView.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.networkItemsTreeView.HideSelection = false;
+      this.networkItemsTreeView.ImageIndex = 0;
+      this.networkItemsTreeView.ImageList = this.imageList;
+      this.networkItemsTreeView.Location = new System.Drawing.Point(6, 19);
+      this.networkItemsTreeView.Name = "networkItemsTreeView";
+      this.networkItemsTreeView.SelectedImageIndex = 0;
+      this.networkItemsTreeView.ShowNodeToolTips = true;
+      this.networkItemsTreeView.Size = new System.Drawing.Size(333, 263);
+      this.networkItemsTreeView.TabIndex = 0;
+      this.networkItemsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.networkItemsTreeView_AfterSelect);
+      // 
+      // networkItemsGroupBox
+      // 
+      this.networkItemsGroupBox.Controls.Add(this.networkItemsTreeView);
+      this.networkItemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.networkItemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.networkItemsGroupBox.Name = "networkItemsGroupBox";
+      this.networkItemsGroupBox.Size = new System.Drawing.Size(345, 288);
+      this.networkItemsGroupBox.TabIndex = 0;
+      this.networkItemsGroupBox.TabStop = false;
+      this.networkItemsGroupBox.Text = "Network Items";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // NetworkItemSelector
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.networkItemsGroupBox);
+      this.Name = "NetworkItemSelector";
+      this.Size = new System.Drawing.Size(345, 288);
+      this.networkItemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox networkItemsGroupBox;
+    protected System.Windows.Forms.TreeView networkItemsTreeView;
+    protected System.Windows.Forms.ImageList imageList;
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelector.cs	(revision 15895)
@@ -0,0 +1,143 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  public partial class NetworkItemSelector : UserControl {
+    protected Func<INetworkItem, bool> networkItemCondition;
+    protected INetworkItem root;
+    public INetworkItem Root {
+      get { return root; }
+    }
+    public string Caption {
+      get { return networkItemsGroupBox.Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(s => { Caption = s; }), value);
+        else
+          networkItemsGroupBox.Text = value;
+      }
+    }
+    public TreeView NetworkItemsTreeView {
+      get { return networkItemsTreeView; }
+    }
+    protected INetworkItem selectedNetworkItem;
+    public INetworkItem SelectedNetworkItem {
+      get {
+        return selectedNetworkItem;
+      }
+      protected set {
+        if (selectedNetworkItem != value) {
+          selectedNetworkItem = value;
+          OnSelectedNetworkItemChanged();
+        }
+      }
+    }
+
+    public NetworkItemSelector() {
+      InitializeComponent();
+      root = null;
+      networkItemCondition = null;
+      selectedNetworkItem = null;
+    }
+
+    public virtual void Configure(INetworkItem root) {
+      Configure(root, null, (e) => true);
+    }
+    public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem) {
+      Configure(root, selectedNetworkItem, (e) => true);
+    }
+    public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem, Type networkItemType) {
+      Configure(root, selectedNetworkItem, (e) => { return networkItemType.IsAssignableFrom(e.GetType()); });
+    }
+    public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem, Func<INetworkItem, bool> networkItemCondition) {
+      if (root == null) throw new ArgumentNullException("root");
+      if (networkItemCondition == null) throw new ArgumentNullException("networkItemCondition");
+      if (InvokeRequired)
+        Invoke(new Action<INetworkItem, INetworkItem, Func<INetworkItem, bool>>(Configure), root, selectedNetworkItem, networkItemCondition);
+      else {
+        this.root = root;
+        this.networkItemCondition = networkItemCondition;
+        this.selectedNetworkItem = null;
+        networkItemsTreeView.Nodes.Clear();
+        imageList.Images.Clear();
+
+        TreeNode selectedNode;
+        var n = CreateTreeNode(Root, selectedNetworkItem, networkItemCondition, out selectedNode);
+        if (n != null)
+          networkItemsTreeView.Nodes.Add(n);
+        if (selectedNode != null) {
+          networkItemsTreeView.SelectedNode = selectedNode;
+          selectedNode.EnsureVisible();
+        }
+      }
+    }
+
+    public event EventHandler SelectedNetworkItemChanged;
+    protected virtual void OnSelectedNetworkItemChanged() {
+      var handler = SelectedNetworkItemChanged;
+      if (handler != null) SelectedNetworkItemChanged(this, EventArgs.Empty);
+    }
+
+    #region Control Events
+    protected virtual void networkItemsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (networkItemsTreeView.SelectedNode == null)
+        SelectedNetworkItem = null;
+      else {
+        var selected = (INetworkItem)networkItemsTreeView.SelectedNode.Tag;
+        SelectedNetworkItem = ((networkItemCondition != null) && !networkItemCondition(selected)) ? null : selected;
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual TreeNode CreateTreeNode(INetworkItem networkItem, INetworkItem selectedNetworkItem, Func<INetworkItem, bool> networkItemCondition, out TreeNode selectedNode) {
+      selectedNode = null;
+      if (networkItem == null) return null;
+
+      TreeNode node = new TreeNode(networkItem.Name);
+      node.Tag = networkItem;
+      foreach (var child in networkItem.Children) {
+        TreeNode selected;
+        var n = CreateTreeNode(child, selectedNetworkItem, networkItemCondition, out selected);
+        if (n != null) {
+          node.Nodes.Add(n);
+          if (selected != null) selectedNode = selected;
+        }
+
+      }
+      if (!networkItemCondition(networkItem) && (node.Nodes.Count == 0))
+        return null;
+
+      imageList.Images.Add(networkItem.ItemImage);
+      node.ImageIndex = imageList.Images.Count - 1;
+      node.SelectedImageIndex = node.ImageIndex;
+      node.ToolTipText = networkItem.GetType().GetPrettyName();
+
+      if (networkItem == selectedNetworkItem) selectedNode = node;
+      return node;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.Designer.cs	(revision 15895)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NetworkItemSelectorDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.networkItemSelector = new HeuristicLab.Core.Networks.Views.NetworkItemSelector();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(320, 409);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(401, 409);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 0;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // networkItemSelector
+      // 
+      this.networkItemSelector.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.networkItemSelector.Caption = "Network Items";
+      this.networkItemSelector.Location = new System.Drawing.Point(12, 12);
+      this.networkItemSelector.Name = "networkItemSelector";
+      this.networkItemSelector.Size = new System.Drawing.Size(464, 391);
+      this.networkItemSelector.TabIndex = 1;
+      this.networkItemSelector.SelectedNetworkItemChanged += new System.EventHandler(this.networkItemSelector_SelectedNetworkItemChanged);
+      // 
+      // NetworkItemSelectorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(488, 444);
+      this.Controls.Add(this.networkItemSelector);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "NetworkItemSelectorDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Select Network Item";
+      this.Load += new System.EventHandler(this.NetworkItemSelectorDialog_Load);
+      this.Shown += new System.EventHandler(this.NetworkItemSelectorDialog_Shown);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.Button cancelButton;
+    protected NetworkItemSelector networkItemSelector;
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemSelectorDialog.cs	(revision 15895)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  public partial class NetworkItemSelectorDialog : Form {
+    public string Caption {
+      get { return Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(s => { Caption = s; }), value);
+        else
+          Text = value;
+      }
+    }
+    public NetworkItemSelector NetworkItemSelector {
+      get { return networkItemSelector; }
+    }
+
+    public NetworkItemSelectorDialog() {
+      InitializeComponent();
+      okButton.Enabled = networkItemSelector.SelectedNetworkItem != null;
+    }
+    protected virtual void NetworkItemSelectorDialog_Load(object sender, EventArgs e) {
+      this.networkItemSelector.NetworkItemsTreeView.DoubleClick += new System.EventHandler(NetworkItemsTreeView_DoubleClick);
+    }
+    protected virtual void NetworkItemSelectorDialog_Shown(object sender, EventArgs e) {
+      okButton.Enabled = networkItemSelector.SelectedNetworkItem != null;
+    }
+    protected virtual void networkItemSelector_SelectedNetworkItemChanged(object sender, EventArgs e) {
+      okButton.Enabled = networkItemSelector.SelectedNetworkItem != null;
+    }
+    protected virtual void NetworkItemsTreeView_DoubleClick(object sender, System.EventArgs e) {
+      if (networkItemSelector.SelectedNetworkItem != null) {
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.Designer.cs	(revision 15895)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NetworkItemView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(69, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(551, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(626, 3);
+      // 
+      // NetworkItemView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "NetworkItemView";
+      this.Size = new System.Drawing.Size(645, 517);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkItemView.cs	(revision 15895)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("NetworkItem View")]
+  [Content(typeof(NetworkItem), true)]
+  [Content(typeof(INetworkItem), false)]
+  public partial class NetworkItemView : NamedItemView {
+    public new INetworkItem Content {
+      get { return (INetworkItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NetworkItemView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.Designer.cs	(revision 15895)
@@ -0,0 +1,151 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NetworkView {
+    /// <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.nodeCollectionView = new HeuristicLab.Core.Networks.Views.NodeCollectionView();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.nodesTabPage = new System.Windows.Forms.TabPage();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.nodesTabPage.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // nodeCollectionView
+      // 
+      this.nodeCollectionView.Caption = "NodeCollection View";
+      this.nodeCollectionView.Content = null;
+      this.nodeCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.nodeCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.nodeCollectionView.Name = "nodeCollectionView";
+      this.nodeCollectionView.ReadOnly = false;
+      this.nodeCollectionView.ShowDetails = true;
+      this.nodeCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.nodeCollectionView.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.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.tabControl.Controls.Add(this.nodesTabPage);
+      this.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 491);
+      this.tabControl.TabIndex = 3;
+      // 
+      // nodesTabPage
+      // 
+      this.nodesTabPage.Controls.Add(this.nodeCollectionView);
+      this.nodesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.nodesTabPage.Name = "nodesTabPage";
+      this.nodesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.nodesTabPage.Size = new System.Drawing.Size(637, 465);
+      this.nodesTabPage.TabIndex = 0;
+      this.nodesTabPage.Text = "Nodes";
+      this.nodesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.portsTabPage.TabIndex = 1;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // NetworkView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.tabControl);
+      this.Name = "NetworkView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.nodesTabPage.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected NodeCollectionView nodeCollectionView;
+    protected MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage nodesTabPage;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected PortCollectionView portCollectionView;
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NetworkView.cs	(revision 15895)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("Network View")]
+  [Content(typeof(Network), true)]
+  [Content(typeof(INetwork), false)]
+  public partial class NetworkView : NetworkItemView {
+    public new INetwork Content {
+      get { return (INetwork)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NetworkView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // remove events here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // add events here
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      nodeCollectionView.Content = Content == null ? null : Content.Nodes;
+      portCollectionView.Content = Content == null ? null : Content.Ports;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      nodeCollectionView.Enabled = Content != null;
+      portCollectionView.Enabled = Content != null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NodeCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeCollectionView.cs	(revision 15895)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("NodeCollection View")]
+  [Content(typeof(NodeCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, INode>), false)]
+  public partial class NodeCollectionView : NamedItemCollectionView<INode> {
+    public NodeCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Nodes";
+    }
+
+    protected override INode CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Node";
+        typeSelectorDialog.TypeSelector.Caption = "Available Nodes";
+        typeSelectorDialog.TypeSelector.Configure(typeof(INode), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          var n = (INode)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          n.Name = GetUniqueName(n.Name);
+          return n;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class NodeView {
+    /// <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.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.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.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Location = new System.Drawing.Point(0, 26);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(645, 491);
+      this.portCollectionView.TabIndex = 3;
+      // 
+      // NodeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.portCollectionView);
+      this.Name = "NodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.portCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected PortCollectionView portCollectionView;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/NodeView.cs	(revision 15895)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("Node View")]
+  [Content(typeof(Node), true)]
+  [Content(typeof(INode), false)]
+  public partial class NodeView : NetworkItemView {
+    public new INode Content {
+      get { return (INode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NodeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portCollectionView.Content = Content == null ? null : Content.Ports;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      portCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.Designer.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class ParameterizedPortView {
+    /// <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.portParameterCollectionView = new HeuristicLab.Core.Networks.Views.PortParameterCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portParameterCollectionView
+      // 
+      this.portParameterCollectionView.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.portParameterCollectionView.Caption = "PortParameterCollection View";
+      this.portParameterCollectionView.Content = null;
+      this.portParameterCollectionView.Location = new System.Drawing.Point(0, 26);
+      this.portParameterCollectionView.Name = "portParameterCollectionView";
+      this.portParameterCollectionView.ReadOnly = false;
+      this.portParameterCollectionView.ShowDetails = true;
+      this.portParameterCollectionView.Size = new System.Drawing.Size(645, 491);
+      this.portParameterCollectionView.TabIndex = 3;
+      // 
+      // ParameterizedPortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.portParameterCollectionView);
+      this.Name = "ParameterizedPortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.portParameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected PortParameterCollectionView portParameterCollectionView;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/ParameterizedPortView.cs	(revision 15895)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("ParameterizedPort View")]
+  [Content(typeof(ParameterizedPort), true)]
+  [Content(typeof(IParameterizedPort), false)]
+  public partial class ParameterizedPortView : PortView {
+    public new IParameterizedPort Content {
+      get { return (IParameterizedPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParameterizedPortView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.InterfaceChanged -= Content_InterfaceChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.InterfaceChanged += Content_InterfaceChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      portParameterCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void Content_InterfaceChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class PortCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortCollectionView.cs	(revision 15895)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("PortCollection View")]
+  [Content(typeof(PortCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IPort>), false)]
+  public partial class PortCollectionView : NamedItemCollectionView<IPort> {
+    public PortCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Ports";
+    }
+
+    protected override IPort CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Port";
+        typeSelectorDialog.TypeSelector.Caption = "Available Ports";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IPort), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          var p = (IPort)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          p.Name = GetUniqueName(p.Name);
+          return p;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class PortParameterCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterCollectionView.cs	(revision 15895)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("PortParameterCollection View")]
+  [Content(typeof(PortParameterCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IPortParameter>), false)]
+  public partial class PortParameterCollectionView : NamedItemCollectionView<IPortParameter> {
+    public PortParameterCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Port Parameters";
+    }
+
+    protected override IPortParameter CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Port Parameter";
+        typeSelectorDialog.TypeSelector.Caption = "Available Port Parameters";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IPortParameter), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          var p = (IPortParameter)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          p.Name = GetUniqueName(p.Name);
+          return p;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.Designer.cs	(revision 15895)
@@ -0,0 +1,214 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class PortParameterView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.defaultValueGroupBox = new System.Windows.Forms.GroupBox();
+      this.clearDefaultValueButton = new System.Windows.Forms.Button();
+      this.setDefaultValueButton = new System.Windows.Forms.Button();
+      this.defaultValuePanel = new System.Windows.Forms.Panel();
+      this.defaultValueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.typeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.inputTypeCheckBox = new System.Windows.Forms.CheckBox();
+      this.outputTypeCheckBox = new System.Windows.Forms.CheckBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.defaultValueGroupBox.SuspendLayout();
+      this.defaultValuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // defaultValueGroupBox
+      // 
+      this.defaultValueGroupBox.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.defaultValueGroupBox.Controls.Add(this.clearDefaultValueButton);
+      this.defaultValueGroupBox.Controls.Add(this.setDefaultValueButton);
+      this.defaultValueGroupBox.Controls.Add(this.defaultValuePanel);
+      this.defaultValueGroupBox.Location = new System.Drawing.Point(0, 79);
+      this.defaultValueGroupBox.Name = "defaultValueGroupBox";
+      this.defaultValueGroupBox.Size = new System.Drawing.Size(645, 438);
+      this.defaultValueGroupBox.TabIndex = 8;
+      this.defaultValueGroupBox.TabStop = false;
+      this.defaultValueGroupBox.Text = "Default Value";
+      // 
+      // clearDefaultValueButton
+      // 
+      this.clearDefaultValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearDefaultValueButton.Location = new System.Drawing.Point(35, 19);
+      this.clearDefaultValueButton.Name = "clearDefaultValueButton";
+      this.clearDefaultValueButton.Size = new System.Drawing.Size(23, 23);
+      this.clearDefaultValueButton.TabIndex = 1;
+      this.clearDefaultValueButton.UseVisualStyleBackColor = true;
+      this.clearDefaultValueButton.Click += new System.EventHandler(this.clearDefaultValueButton_Click);
+      // 
+      // setDefaultValueButton
+      // 
+      this.setDefaultValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setDefaultValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setDefaultValueButton.Name = "setDefaultValueButton";
+      this.setDefaultValueButton.Size = new System.Drawing.Size(23, 23);
+      this.setDefaultValueButton.TabIndex = 0;
+      this.setDefaultValueButton.UseVisualStyleBackColor = true;
+      this.setDefaultValueButton.Click += new System.EventHandler(this.setDefaultValueButton_Click);
+      // 
+      // defaultValuePanel
+      // 
+      this.defaultValuePanel.AllowDrop = true;
+      this.defaultValuePanel.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.defaultValuePanel.Controls.Add(this.defaultValueViewHost);
+      this.defaultValuePanel.Location = new System.Drawing.Point(6, 48);
+      this.defaultValuePanel.Name = "defaultValuePanel";
+      this.defaultValuePanel.Size = new System.Drawing.Size(633, 384);
+      this.defaultValuePanel.TabIndex = 0;
+      this.defaultValuePanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.defaultValuePanel_DragDrop);
+      this.defaultValuePanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.defaultValuePanel_DragEnterOver);
+      this.defaultValuePanel.DragOver += new System.Windows.Forms.DragEventHandler(this.defaultValuePanel_DragEnterOver);
+      // 
+      // defaultValueViewHost
+      // 
+      this.defaultValueViewHost.Caption = "View";
+      this.defaultValueViewHost.Content = null;
+      this.defaultValueViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.defaultValueViewHost.Enabled = false;
+      this.defaultValueViewHost.Location = new System.Drawing.Point(0, 0);
+      this.defaultValueViewHost.Name = "defaultValueViewHost";
+      this.defaultValueViewHost.ReadOnly = false;
+      this.defaultValueViewHost.Size = new System.Drawing.Size(633, 384);
+      this.defaultValueViewHost.TabIndex = 0;
+      this.defaultValueViewHost.ViewsLabelVisible = true;
+      this.defaultValueViewHost.ViewType = null;
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 29);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 3;
+      this.dataTypeLabel.Text = "&Data Type:";
+      // 
+      // typeLabel
+      // 
+      this.typeLabel.AutoSize = true;
+      this.typeLabel.Location = new System.Drawing.Point(3, 55);
+      this.typeLabel.Name = "typeLabel";
+      this.typeLabel.Size = new System.Drawing.Size(34, 13);
+      this.typeLabel.TabIndex = 5;
+      this.typeLabel.Text = "&Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(69, 26);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(551, 20);
+      this.dataTypeTextBox.TabIndex = 4;
+      // 
+      // inputTypeCheckBox
+      // 
+      this.inputTypeCheckBox.AutoSize = true;
+      this.inputTypeCheckBox.Location = new System.Drawing.Point(69, 54);
+      this.inputTypeCheckBox.Name = "inputTypeCheckBox";
+      this.inputTypeCheckBox.Size = new System.Drawing.Size(50, 17);
+      this.inputTypeCheckBox.TabIndex = 6;
+      this.inputTypeCheckBox.Text = "&Input";
+      this.inputTypeCheckBox.UseVisualStyleBackColor = true;
+      this.inputTypeCheckBox.CheckedChanged += new System.EventHandler(this.inputTypeCheckBox_CheckedChanged);
+      // 
+      // outputTypeCheckBox
+      // 
+      this.outputTypeCheckBox.AutoSize = true;
+      this.outputTypeCheckBox.Location = new System.Drawing.Point(125, 54);
+      this.outputTypeCheckBox.Name = "outputTypeCheckBox";
+      this.outputTypeCheckBox.Size = new System.Drawing.Size(58, 17);
+      this.outputTypeCheckBox.TabIndex = 7;
+      this.outputTypeCheckBox.Text = "&Output";
+      this.outputTypeCheckBox.UseVisualStyleBackColor = true;
+      this.outputTypeCheckBox.CheckedChanged += new System.EventHandler(this.outputTypeCheckBox_CheckedChanged);
+      // 
+      // PortParameterView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.outputTypeCheckBox);
+      this.Controls.Add(this.inputTypeCheckBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.typeLabel);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.defaultValueGroupBox);
+      this.Name = "PortParameterView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.defaultValueGroupBox, 0);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.typeLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.inputTypeCheckBox, 0);
+      this.Controls.SetChildIndex(this.outputTypeCheckBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.defaultValueGroupBox.ResumeLayout(false);
+      this.defaultValuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox defaultValueGroupBox;
+    protected System.Windows.Forms.Panel defaultValuePanel;
+    protected MainForm.WindowsForms.ViewHost defaultValueViewHost;
+    protected System.Windows.Forms.Label dataTypeLabel;
+    protected System.Windows.Forms.Label typeLabel;
+    protected System.Windows.Forms.TextBox dataTypeTextBox;
+    protected System.Windows.Forms.Button setDefaultValueButton;
+    protected System.Windows.Forms.Button clearDefaultValueButton;
+    protected System.Windows.Forms.CheckBox inputTypeCheckBox;
+    protected System.Windows.Forms.CheckBox outputTypeCheckBox;
+
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortParameterView.cs	(revision 15895)
@@ -0,0 +1,153 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("PortParameter View")]
+  [Content(typeof(PortParameter<>), true)]
+  [Content(typeof(IPortParameter<>), false)]
+  [Content(typeof(IPortParameter), false)]
+  public partial class PortParameterView : NetworkItemView {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new IPortParameter Content {
+      get { return (IPortParameter)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public PortParameterView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.TypeChanged -= Content_TypeChanged;
+      Content.DefaultValueChanged -= Content_DefaultValueChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.TypeChanged += Content_TypeChanged;
+      Content.DefaultValueChanged += Content_DefaultValueChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeTextBox.Text = string.Empty;
+        inputTypeCheckBox.Checked = false;
+        outputTypeCheckBox.Checked = false;
+        defaultValueViewHost.Content = null;
+      } else {
+        dataTypeTextBox.Text = Content.DataType.GetPrettyName();
+        inputTypeCheckBox.Checked = Content.Type.HasFlag(PortParameterType.Input);
+        outputTypeCheckBox.Checked = Content.Type.HasFlag(PortParameterType.Output);
+        defaultValueViewHost.ViewType = null;
+        defaultValueViewHost.Content = Content.DefaultValue;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      dataTypeTextBox.Enabled = Content != null;
+      inputTypeCheckBox.Enabled = Content != null && !ReadOnly;
+      outputTypeCheckBox.Enabled = Content != null && !ReadOnly;
+      defaultValueGroupBox.Enabled = Content != null;
+      setDefaultValueButton.Enabled = Content != null && !ReadOnly;
+      clearDefaultValueButton.Enabled = Content != null && Content.DefaultValue != null && !ReadOnly;
+    }
+    protected virtual void Content_TypeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_TypeChanged), sender, e);
+      else {
+        inputTypeCheckBox.Checked = Content.Type.HasFlag(PortParameterType.Input);
+        outputTypeCheckBox.Checked = Content.Type.HasFlag(PortParameterType.Output);
+      }
+    }
+    protected virtual void Content_DefaultValueChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_DefaultValueChanged), sender, e);
+      else {
+        clearDefaultValueButton.Enabled = Content.DefaultValue != null;
+        defaultValueViewHost.ViewType = null;
+        defaultValueViewHost.Content = Content.DefaultValue;
+      }
+    }
+
+    protected virtual void inputTypeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.Type = inputTypeCheckBox.Checked ? Content.Type | PortParameterType.Input : Content.Type & ~PortParameterType.Input;
+    }
+    protected virtual void outputTypeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.Type = outputTypeCheckBox.Checked ? Content.Type | PortParameterType.Output : Content.Type & ~PortParameterType.Output;
+    }
+
+    protected virtual void setDefaultValueButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Default Value";
+      }
+      typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.DefaultValue = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    protected virtual void clearDefaultValueButton_Click(object sender, EventArgs e) {
+      Content.DefaultValue = null;
+    }
+
+    protected virtual void defaultValuePanel_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IItem)) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void defaultValuePanel_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IItem item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
+        Content.DefaultValue = item;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.Designer.cs	(revision 15895)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks.Views {
+  partial class PortView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // PortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "PortView";
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Core/PortView.cs	(revision 15895)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("Port View")]
+  [Content(typeof(Port), true)]
+  [Content(typeof(IPort), false)]
+  public partial class PortView : NetworkItemView {
+    public new IPort Content {
+      get { return (IPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public PortView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj	(revision 15895)
@@ -0,0 +1,330 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.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>{792B263D-92BA-453A-BFDF-261511C2F63B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks.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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.CodeEditor-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.CodeEditor-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Scripting-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Scripting-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Scripting.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Scripting.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AlgorithmNodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AlgorithmNodeView.Designer.cs">
+      <DependentUpon>AlgorithmNodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\MessageCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\MessageCollectionView.Designer.cs">
+      <DependentUpon>MessageCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\MessagePortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\MessagePortView.Designer.cs">
+      <DependentUpon>MessagePortView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\MessageValueCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\MessageValueCollectionView.Designer.cs">
+      <DependentUpon>MessageValueCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\MessageValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\MessageValueView.Designer.cs">
+      <DependentUpon>MessageValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\MessageView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\MessageView.Designer.cs">
+      <DependentUpon>MessageView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NetworkItemSelector.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\NetworkItemSelector.Designer.cs">
+      <DependentUpon>NetworkItemSelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NetworkItemSelectorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Core\NetworkItemSelectorDialog.Designer.cs">
+      <DependentUpon>NetworkItemSelectorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NetworkItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\NetworkItemView.Designer.cs">
+      <DependentUpon>NetworkItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NetworkView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\NetworkView.Designer.cs">
+      <DependentUpon>NetworkView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NodeCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\NodeCollectionView.Designer.cs">
+      <DependentUpon>NodeCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\NodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\NodeView.Designer.cs">
+      <DependentUpon>NodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\ParameterizedPortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\ParameterizedPortView.Designer.cs">
+      <DependentUpon>ParameterizedPortView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\PortCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\PortCollectionView.Designer.cs">
+      <DependentUpon>PortCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\PortParameterCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\PortParameterCollectionView.Designer.cs">
+      <DependentUpon>PortParameterCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\PortParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\PortParameterView.Designer.cs">
+      <DependentUpon>PortParameterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core\PortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core\PortView.Designer.cs">
+      <DependentUpon>PortView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Programmable\ProgrammableNodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Programmable\ProgrammableNodeView.Designer.cs">
+      <DependentUpon>ProgrammableNodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Programmable\ProgrammableNetworkView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Programmable\ProgrammableNetworkView.Designer.cs">
+      <DependentUpon>ProgrammableNetworkView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Programmable\ProgrammableNetworkItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Programmable\ProgrammableNetworkItemView.Designer.cs">
+      <DependentUpon>ProgrammableNetworkItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Programmable\UserDefinedNetworkView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Programmable\UserDefinedNetworkView.Designer.cs">
+      <DependentUpon>UserDefinedNetworkView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Programmable\UserDefinedNodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Programmable\UserDefinedNodeView.Designer.cs">
+      <DependentUpon>UserDefinedNodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Scripting\ProgrammableItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Scripting\ProgrammableItemView.Designer.cs">
+      <DependentUpon>ProgrammableItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserDefinedMessagePortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UserDefinedMessagePortView.Designer.cs">
+      <DependentUpon>UserDefinedMessagePortView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj">
+      <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
+      <Name>HeuristicLab.Networks-3.3</Name>
+      <Private>False</Private>
+    </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/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Networks.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks.Views", "3.3.11.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.CodeEditor", "3.4")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Networks", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting.Views", "3.3")]
+  public class HeuristicLabOptimizationNetworksViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Programmable.Views {
+  partial class ProgrammableNetworkItemView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkItemView.cs	(revision 15895)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Programmable.Views {
+  [View("ProgrammableNetworkItem View")]
+  [Content(typeof(ProgrammableNetworkItem), true)]
+  [Content(typeof(IProgrammableNetworkItem), false)]
+  public partial class ProgrammableNetworkItemView : NetworkItemView {
+    public ProgrammableNetworkItemView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Programmable.Views {
+  partial class ProgrammableNetworkView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNetworkView.cs	(revision 15895)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Programmable.Views {
+  [View("ProgrammableNetwork View")]
+  [Content(typeof(ProgrammableNetwork), true)]
+  [Content(typeof(IProgrammableNetwork), false)]
+  public partial class ProgrammableNetworkView : NetworkView {
+    public ProgrammableNetworkView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Programmable.Views {
+  partial class ProgrammableNodeView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/ProgrammableNodeView.cs	(revision 15895)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Programmable.Views {
+  [View("ProgrammableNode View")]
+  [Content(typeof(ProgrammableNode), true)]
+  [Content(typeof(IProgrammableNode), false)]
+  public partial class ProgrammableNodeView : NodeView {
+    public ProgrammableNodeView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.Designer.cs	(revision 15895)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Programmable.Views {
+  partial class UserDefinedNetworkView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.codeTabPage = new System.Windows.Forms.TabPage();
+      this.programmableItemView = new HeuristicLab.Scripting.Views.ProgrammableItemView();
+      this.initializeButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.nodesTabPage.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.codeTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.codeTabPage);
+      this.tabControl.Controls.SetChildIndex(this.codeTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.portsTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.nodesTabPage, 0);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // codeTabPage
+      // 
+      this.codeTabPage.Controls.Add(this.initializeButton);
+      this.codeTabPage.Controls.Add(this.programmableItemView);
+      this.codeTabPage.Location = new System.Drawing.Point(4, 22);
+      this.codeTabPage.Name = "codeTabPage";
+      this.codeTabPage.Size = new System.Drawing.Size(637, 465);
+      this.codeTabPage.TabIndex = 2;
+      this.codeTabPage.Text = "Code";
+      this.codeTabPage.UseVisualStyleBackColor = true;
+      // 
+      // programmableItemView
+      // 
+      this.programmableItemView.Caption = "ProgrammableItem View";
+      this.programmableItemView.Content = null;
+      this.programmableItemView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.programmableItemView.Location = new System.Drawing.Point(0, 0);
+      this.programmableItemView.Name = "programmableItemView";
+      this.programmableItemView.ReadOnly = false;
+      this.programmableItemView.Size = new System.Drawing.Size(637, 465);
+      this.programmableItemView.TabIndex = 0;
+      // 
+      // initializeButton
+      // 
+      this.initializeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.initializeButton.Location = new System.Drawing.Point(33, 3);
+      this.initializeButton.Name = "initializeButton";
+      this.initializeButton.Size = new System.Drawing.Size(24, 24);
+      this.initializeButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.initializeButton, "Initialize");
+      this.initializeButton.UseVisualStyleBackColor = true;
+      this.initializeButton.Click += new System.EventHandler(this.initializeButton_Click);
+      // 
+      // UserDefinedNetworkView
+      // 
+      this.Name = "UserDefinedNetworkView";
+      this.tabControl.ResumeLayout(false);
+      this.nodesTabPage.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.codeTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TabPage codeTabPage;
+    protected HeuristicLab.Scripting.Views.ProgrammableItemView programmableItemView;
+    protected System.Windows.Forms.Button initializeButton;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNetworkView.cs	(revision 15895)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Programmable.Views {
+  [View("UserDefinedNetwork View")]
+  [Content(typeof(UserDefinedNetwork), true)]
+  [Content(typeof(IUserDefinedNetwork), false)]
+  public partial class UserDefinedNetworkView : NetworkView {
+    public new IUserDefinedNetwork Content {
+      get { return (IUserDefinedNetwork)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserDefinedNetworkView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      nodeCollectionView.Content = Content == null ? null : Content.Nodes;
+      portCollectionView.Content = Content == null ? null : Content.Ports;
+      programmableItemView.Content = Content;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      initializeButton.Enabled = Content != null && !ReadOnly && !Locked;
+    }
+
+    private void initializeButton_Click(object sender, System.EventArgs e) {
+      Content.Initialize();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.Designer.cs	(revision 15895)
@@ -0,0 +1,162 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Programmable.Views {
+  partial class UserDefinedNodeView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
+      this.codeTabPage = new System.Windows.Forms.TabPage();
+      this.programmableItemView = new HeuristicLab.Scripting.Views.ProgrammableItemView();
+      this.initializeButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.codeTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.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.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Controls.Add(this.codeTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 491);
+      this.tabControl.TabIndex = 3;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.portsTabPage.TabIndex = 0;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.portCollectionView.TabIndex = 0;
+      // 
+      // codeTabPage
+      // 
+      this.codeTabPage.Controls.Add(this.initializeButton);
+      this.codeTabPage.Controls.Add(this.programmableItemView);
+      this.codeTabPage.Location = new System.Drawing.Point(4, 22);
+      this.codeTabPage.Name = "codeTabPage";
+      this.codeTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.codeTabPage.Size = new System.Drawing.Size(637, 465);
+      this.codeTabPage.TabIndex = 1;
+      this.codeTabPage.Text = "Code";
+      this.codeTabPage.UseVisualStyleBackColor = true;
+      // 
+      // programmableItemView
+      // 
+      this.programmableItemView.Caption = "ProgrammableItem View";
+      this.programmableItemView.Content = null;
+      this.programmableItemView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.programmableItemView.Location = new System.Drawing.Point(3, 3);
+      this.programmableItemView.Name = "programmableItemView";
+      this.programmableItemView.ReadOnly = false;
+      this.programmableItemView.Size = new System.Drawing.Size(631, 459);
+      this.programmableItemView.TabIndex = 0;
+      // 
+      // initializeButton
+      // 
+      this.initializeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.initializeButton.Location = new System.Drawing.Point(36, 6);
+      this.initializeButton.Name = "initializeButton";
+      this.initializeButton.Size = new System.Drawing.Size(24, 24);
+      this.initializeButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.initializeButton, "Initialize");
+      this.initializeButton.UseVisualStyleBackColor = true;
+      this.initializeButton.Click += new System.EventHandler(this.initializeButton_Click);
+      // 
+      // UserDefinedNodeView
+      // 
+      this.Controls.Add(this.tabControl);
+      this.Name = "UserDefinedNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.codeTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected HeuristicLab.Core.Networks.Views.PortCollectionView portCollectionView;
+    protected System.Windows.Forms.TabPage codeTabPage;
+    protected HeuristicLab.Scripting.Views.ProgrammableItemView programmableItemView;
+    protected System.Windows.Forms.Button initializeButton;
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Programmable/UserDefinedNodeView.cs	(revision 15895)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Programmable.Views {
+  [View("UserDefinedNode View")]
+  [Content(typeof(UserDefinedNode), true)]
+  [Content(typeof(IUserDefinedNode), false)]
+  public partial class UserDefinedNodeView : NetworkItemView {
+    public new IUserDefinedNode Content {
+      get { return (IUserDefinedNode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserDefinedNodeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portCollectionView.Content = Content == null ? null : Content.Ports;
+      programmableItemView.Content = Content;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      initializeButton.Enabled = Content != null && !ReadOnly && !Locked;
+    }
+
+    private void initializeButton_Click(object sender, System.EventArgs e) {
+      Content.Initialize();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+#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.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.Networks.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab optimization networks classes")]
+[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("6852d9f7-2a82-4662-918e-95e61dad3274")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.Designer.cs	(revision 15895)
@@ -0,0 +1,280 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Scripting.Views {
+  partial class ProgrammableItemView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.codeGroupBox = new System.Windows.Forms.GroupBox();
+      this.codeEditor = new HeuristicLab.CodeEditor.CodeEditor();
+      this.errorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.errorsListView = new System.Windows.Forms.ListView();
+      this.iconColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.categoryColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.errorNumberColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.lineColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.columnColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.compileButton = new System.Windows.Forms.Button();
+      this.compilationLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.variableStoreView = new HeuristicLab.Scripting.Views.VariableStoreView();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.codeGroupBox.SuspendLayout();
+      this.errorsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.codeGroupBox);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.errorsGroupBox);
+      this.splitContainer2.Size = new System.Drawing.Size(357, 454);
+      this.splitContainer2.SplitterDistance = 382;
+      this.splitContainer2.TabIndex = 3;
+      // 
+      // codeGroupBox
+      // 
+      this.codeGroupBox.Controls.Add(this.codeEditor);
+      this.codeGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.codeGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.codeGroupBox.Name = "codeGroupBox";
+      this.codeGroupBox.Size = new System.Drawing.Size(357, 382);
+      this.codeGroupBox.TabIndex = 0;
+      this.codeGroupBox.TabStop = false;
+      this.codeGroupBox.Text = "Code";
+      // 
+      // codeEditor
+      // 
+      this.codeEditor.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.codeEditor.Location = new System.Drawing.Point(6, 19);
+      this.codeEditor.Name = "codeEditor";
+      this.codeEditor.Prefix = "";
+      this.codeEditor.ReadOnly = false;
+      this.codeEditor.Size = new System.Drawing.Size(345, 357);
+      this.codeEditor.Suffix = "";
+      this.codeEditor.TabIndex = 0;
+      this.codeEditor.UserCode = "";
+      this.codeEditor.Validated += new System.EventHandler(this.codeEditor_Validated);
+      // 
+      // errorsGroupBox
+      // 
+      this.errorsGroupBox.Controls.Add(this.errorsListView);
+      this.errorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.errorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.errorsGroupBox.Name = "errorsGroupBox";
+      this.errorsGroupBox.Size = new System.Drawing.Size(357, 68);
+      this.errorsGroupBox.TabIndex = 0;
+      this.errorsGroupBox.TabStop = false;
+      this.errorsGroupBox.Text = "Errors";
+      // 
+      // errorsListView
+      // 
+      this.errorsListView.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.errorsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.iconColumnHeader,
+            this.categoryColumnHeader,
+            this.errorNumberColumnHeader,
+            this.lineColumnHeader,
+            this.columnColumnHeader,
+            this.descriptionColumnHeader});
+      this.errorsListView.FullRowSelect = true;
+      this.errorsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.errorsListView.HideSelection = false;
+      this.errorsListView.Location = new System.Drawing.Point(6, 19);
+      this.errorsListView.Name = "errorsListView";
+      this.errorsListView.Size = new System.Drawing.Size(345, 43);
+      this.errorsListView.SmallImageList = this.imageList;
+      this.errorsListView.TabIndex = 0;
+      this.errorsListView.UseCompatibleStateImageBehavior = false;
+      this.errorsListView.View = System.Windows.Forms.View.Details;
+      this.errorsListView.DoubleClick += new System.EventHandler(this.errorsListView_DoubleClick);
+      // 
+      // iconColumnHeader
+      // 
+      this.iconColumnHeader.Text = "";
+      // 
+      // categoryColumnHeader
+      // 
+      this.categoryColumnHeader.Text = "Category";
+      // 
+      // errorNumberColumnHeader
+      // 
+      this.errorNumberColumnHeader.Text = "Error Number";
+      // 
+      // lineColumnHeader
+      // 
+      this.lineColumnHeader.Text = "Line";
+      // 
+      // columnColumnHeader
+      // 
+      this.columnColumnHeader.Text = "Column";
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // compileButton
+      // 
+      this.compileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Script;
+      this.compileButton.Location = new System.Drawing.Point(3, 3);
+      this.compileButton.Name = "compileButton";
+      this.compileButton.Size = new System.Drawing.Size(24, 24);
+      this.compileButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.compileButton, "Compile (F6)");
+      this.compileButton.UseVisualStyleBackColor = true;
+      this.compileButton.Click += new System.EventHandler(this.compileButton_Click);
+      // 
+      // compilationLabel
+      // 
+      this.compilationLabel.AutoSize = true;
+      this.compilationLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
+      this.compilationLabel.Location = new System.Drawing.Point(66, 9);
+      this.compilationLabel.Name = "compilationLabel";
+      this.compilationLabel.Size = new System.Drawing.Size(69, 13);
+      this.compilationLabel.TabIndex = 1;
+      this.compilationLabel.Text = "Not compiled";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 33);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.splitContainer2);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.variableStoreView);
+      this.splitContainer1.Size = new System.Drawing.Size(486, 454);
+      this.splitContainer1.SplitterDistance = 357;
+      this.splitContainer1.TabIndex = 4;
+      // 
+      // variableStoreView
+      // 
+      this.variableStoreView.Caption = "ItemCollection View";
+      this.variableStoreView.Content = null;
+      this.variableStoreView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableStoreView.Location = new System.Drawing.Point(0, 0);
+      this.variableStoreView.Name = "variableStoreView";
+      this.variableStoreView.ReadOnly = false;
+      this.variableStoreView.Size = new System.Drawing.Size(125, 454);
+      this.variableStoreView.TabIndex = 0;
+      // 
+      // ProgrammableItemView
+      // 
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.compilationLabel);
+      this.Controls.Add(this.compileButton);
+      this.Name = "ProgrammableItemView";
+      this.Size = new System.Drawing.Size(486, 487);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.codeGroupBox.ResumeLayout(false);
+      this.errorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer2;
+    protected System.Windows.Forms.GroupBox errorsGroupBox;
+    protected System.Windows.Forms.Button compileButton;
+    protected CodeEditor.CodeEditor codeEditor;
+    protected System.Windows.Forms.ListView errorsListView;
+    protected System.Windows.Forms.ColumnHeader iconColumnHeader;
+    protected System.Windows.Forms.ColumnHeader categoryColumnHeader;
+    protected System.Windows.Forms.ColumnHeader errorNumberColumnHeader;
+    protected System.Windows.Forms.ColumnHeader lineColumnHeader;
+    protected System.Windows.Forms.ColumnHeader columnColumnHeader;
+    protected System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    protected System.Windows.Forms.Label compilationLabel;
+    protected System.Windows.Forms.ImageList imageList;
+    protected System.Windows.Forms.GroupBox codeGroupBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+    protected VariableStoreView variableStoreView;
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/Scripting/ProgrammableItemView.cs	(revision 15895)
@@ -0,0 +1,176 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.CodeDom.Compiler;
+using System.Drawing;
+using System.Globalization;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Scripting.Views {
+  [View("ProgrammableItem View")]
+  [Content(typeof(IProgrammableItem), false)]
+  public partial class ProgrammableItemView : ItemView {
+    public new IProgrammableItem Content {
+      get { return (IProgrammableItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProgrammableItemView() {
+      InitializeComponent();
+      errorsListView.SmallImageList.Images.AddRange(new Image[] { VSImageLibrary.Warning, VSImageLibrary.Error });
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CodeChanged -= Content_CodeChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CodeChanged += Content_CodeChanged;
+    }
+
+    protected async override void OnContentChanged() {
+      base.OnContentChanged();
+      errorsListView.Items.Clear();
+      if (Content == null) {
+        codeEditor.UserCode = string.Empty;
+        variableStoreView.Content = null;
+      } else {
+        codeEditor.UserCode = Content.Code;
+        variableStoreView.Content = Content.VariableStore;
+        Locked = true;
+        Task t = Task.Factory.StartNew(() => {
+          foreach (var asm in Content.GetAssemblies())
+            codeEditor.AddAssembly(asm);
+        });
+        await t;
+        Locked = false;
+      }
+      ShowCompilationResults();
+      UpdateCompilationLabel();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      compileButton.Enabled = Content != null && Content.CanChangeCode && !Locked && !ReadOnly;
+      codeEditor.Enabled = Content != null && !Locked;
+      codeEditor.ReadOnly = ReadOnly || Locked || ((Content != null) && !Content.CanChangeCode);
+      variableStoreView.ReadOnly = (Content != null) && !Content.CanChangeCode;
+    }
+
+    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, Keys keyData) {
+      switch (keyData) {
+        case Keys.F6:
+          if (Content != null && !Locked)
+            Compile();
+          return true;
+      }
+      return base.ProcessCmdKey(ref msg, keyData);
+    }
+
+    protected virtual void Content_CodeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_CodeChanged), sender, e);
+      else {
+        codeEditor.UserCode = Content.Code;
+      }
+    }
+
+    private void compileButton_Click(object sender, EventArgs e) {
+      Compile();
+    }
+    private void codeEditor_Validated(object sender, EventArgs e) {
+      if ((Content != null) && Content.CanChangeCode) Content.Code = codeEditor.UserCode;
+    }
+    private void errorsListView_DoubleClick(object sender, EventArgs e) {
+      if ((Content != null) && (Content.CompileErrors != null)) {
+        codeEditor.ShowCompileErrors(Content.CompileErrors);
+      }
+    }
+
+    #region Helpers
+    protected virtual void Compile() {
+      ReadOnly = true;
+      Locked = true;
+      errorsListView.Items.Clear();
+      try {
+        Content.Compile();
+      }
+      catch (Exception ex) {
+        if (!(ex is InvalidOperationException) || (Content.CompileErrors == null))
+          ErrorHandling.ShowErrorDialog(this, ex);
+      }
+      ShowCompilationResults();
+      UpdateCompilationLabel();
+      ReadOnly = false;
+      Locked = false;
+    }
+
+    protected virtual void ShowCompilationResults() {
+      if ((Content == null) || (Content.CompileErrors == null) || (Content.CompileErrors.Count == 0)) return;
+      var errors = Content.CompileErrors.OfType<CompilerError>()
+                                      .OrderBy(x => x.IsWarning)
+                                      .ThenBy(x => x.Line)
+                                      .ThenBy(x => x.Column);
+      foreach (var e in errors) {
+        var item = new ListViewItem();
+        item.SubItems.AddRange(new[] {
+          e.IsWarning ? "Warning" : "Error",
+          e.ErrorNumber,
+          e.Line.ToString(CultureInfo.InvariantCulture),
+          e.Column.ToString(CultureInfo.InvariantCulture),
+          e.ErrorText
+        });
+        item.ImageIndex = e.IsWarning ? 0 : 1;
+        errorsListView.Items.Add(item);
+      }
+
+      foreach (ColumnHeader ch in errorsListView.Columns) {
+        // adjusts column width to width of column header
+        ch.Width = -2;
+      }
+
+      codeEditor.ShowCompileErrors(Content.CompileErrors);
+    }
+
+    protected virtual void UpdateCompilationLabel() {
+      if ((Content == null) || (Content.CompileErrors == null)) {
+        compilationLabel.ForeColor = SystemColors.ControlDarkDark;
+        compilationLabel.Text = "Not compiled";
+      } else if (Content.CompileErrors.HasErrors) {
+        compilationLabel.ForeColor = Color.DarkRed;
+        compilationLabel.Text = "Compilation failed";
+      } else {
+        compilationLabel.ForeColor = Color.DarkGreen;
+        compilationLabel.Text = "Compilation successful";
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks.Views {
+  partial class UserDefinedMessagePortView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks.Views/3.3/UserDefinedMessagePortView.cs	(revision 15895)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks.Views;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Networks.Views {
+  [View("UserDefinedMessagePort View")]
+  [Content(typeof(UserDefinedMessagePort), true)]
+  [Content(typeof(IUserDefinedMessagePort), false)]
+  public partial class UserDefinedMessagePortView : MessagePortView {
+    public new IUserDefinedMessagePort Content {
+      get { return (IUserDefinedMessagePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserDefinedMessagePortView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      cloneParametersFromPortButton.Enabled = Content != null && !ReadOnly;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientNode.cs	(revision 15895)
@@ -0,0 +1,99 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ClientNode", "A node of an optimization network which calls service nodes.")]
+  [StorableClass]
+  public class ClientNode : Node, IClientNode {
+    private object locker = new object();
+
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+
+    [Storable]
+    private IItemCollection<ServiceParameterCollection> calls;
+    public IItemCollection<ServiceParameterCollection> Calls {
+      get { return calls; }
+    }
+
+    [StorableConstructor]
+    protected ClientNode(bool deserializing) : base(deserializing) { }
+    protected ClientNode(ClientNode original, Cloner cloner)
+      : base(original, cloner) {
+      calls = cloner.Clone(original.calls);
+    }
+    public ClientNode()
+      : base("ClientNode") {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+    public ClientNode(string name)
+      : base(name) {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+    public ClientNode(string name, string description)
+      : base(name, description) {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientNode(this, cloner);
+    }
+
+    public virtual async Task CallServicesAsync() {
+      await CallServicesAsync(CancellationToken.None);
+    }
+    public virtual async Task CallServicesAsync(CancellationToken token) {
+      foreach (var clientPort in Ports.OfType<IClientPort>()) {
+        var parameters = clientPort.PrepareParameters();
+
+        // retrieve inputs
+        foreach (var inputPort in Ports.OfType<IInputPort>().
+                                        Where(x => parameters.ContainsKey(x.Name) &&
+                                                    parameters[x.Name].Type == ServiceParameterType.Input &&
+                                                    parameters[x.Name].DataType.IsAssignableFrom(x.DataType))) {
+          parameters[inputPort.Name].Value = (IItem)inputPort.Value.Clone();
+        }
+
+        parameters = await clientPort.CallServiceAsync(parameters, token);
+
+        lock (locker) {
+          // set outputs
+          foreach (var outputPort in Ports.OfType<IOutputPort>().
+                                            Where(x => parameters.ContainsKey(x.Name) &&
+                                                      parameters[x.Name].Type == ServiceParameterType.Output &&
+                                                      x.DataType.IsAssignableFrom(parameters[x.Name].DataType))) {
+            outputPort.Value = (IItem)parameters[outputPort.Name].Value.Clone();
+          }
+
+          Calls.Add(parameters);
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientPort.cs	(revision 15895)
@@ -0,0 +1,181 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ClientPort", "A client port of an optimization network node.")]
+  [StorableClass]
+  public class ClientPort : ClientServicePort, IClientPort {
+    public override Image ItemImage {
+      get {
+        if (Valid) return base.ItemImage;
+        else return HeuristicLab.Common.Resources.VSImageLibrary.Error;
+      }
+    }
+
+    [Storable]
+    protected IServicePort servicePort;
+    public IServicePort ServicePort {
+      get { return servicePort; }
+      set {
+        if (servicePort != value) {
+          DeregisterServicePortEvents();
+          servicePort = value;
+          RegisterServicePortEvents();
+          OnServicePortChanged();
+          OnInterfaceChanged();
+        }
+      }
+    }
+    [Storable]
+    protected bool valid;
+    public bool Valid {
+      get { return valid; }
+      protected set {
+        if (value != valid) {
+          valid = value;
+          OnItemImageChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    protected ClientPort(bool deserializing) : base(deserializing) { }
+    protected ClientPort(ClientPort original, Cloner cloner)
+      : base(original, cloner) {
+      servicePort = cloner.Clone(original.servicePort);
+      valid = original.valid;
+      RegisterServicePortEvents();
+    }
+    public ClientPort() : base("ClientPort") { }
+    public ClientPort(string name) : base(name) { }
+    public ClientPort(string name, string description) : base(name, description) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterServicePortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientPort(this, cloner);
+    }
+
+    public bool IsValidServicePort(IServicePort servicePort) {
+      if (servicePort == null) return false;
+      // check input parameters
+      foreach (var input in servicePort.Parameters.Where(p => p.Type == ServiceParameterType.Input)) {
+        IServiceParameter param;
+        Parameters.TryGetValue(input.Name, out param);
+        if ((param == null) && (input.Value == null)) return false;
+        if (param.Type != input.Type) return false;
+        if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
+      }
+      // check output parameters
+      foreach (var output in Parameters.Where(p => p.Type == ServiceParameterType.Output)) {
+        IServiceParameter param;
+        servicePort.Parameters.TryGetValue(output.Name, out param);
+        if (param == null) return false;
+        if (param.Type != output.Type) return false;
+        if (!output.DataType.IsAssignableFrom(param.DataType)) return false;
+      }
+      return true;
+    }
+    public void CloneServicePortParameters() {
+      Parameters.Clear();
+      foreach (var p in servicePort.Parameters) {
+        Parameters.Add((IServiceParameter)p.Clone());
+      }
+    }
+    public ServiceParameterCollection PrepareParameters() {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      var parameters = new ServiceParameterCollection();
+      // collect input parameters (take inputs from service and set default values of client)
+      parameters.AddRange(
+        ServicePort.Parameters.
+        Where(p => p.Type == ServiceParameterType.Input).
+        Select(p => (IServiceParameter)p.Clone()).
+        Select(p => {
+          IServiceParameter param;
+          Parameters.TryGetValue(p.Name, out param);
+          if ((param != null) && (param.Value != null))
+            p.Value = (IItem)param.Value.Clone();
+          return p;
+        }));
+      // collect output parameters (take outputs from client)
+      parameters.AddRange(
+        Parameters.
+        Where(p => p.Type == ServiceParameterType.Output).
+        Select(p => (IServiceParameter)p.Clone()));
+      return parameters;
+    }
+    public ServiceParameterCollection CallService(ServiceParameterCollection parameters) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return ServicePort.Process(parameters);
+    }
+    public ServiceParameterCollection CallService(ServiceParameterCollection parameters, CancellationToken token) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return ServicePort.Process(parameters, token);
+    }
+    public async Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return await ServicePort.ProcessAsync(parameters);
+    }
+    public async Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters, CancellationToken token) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return await ServicePort.ProcessAsync(parameters, token);
+    }
+
+    protected override void OnInterfaceChanged() {
+      Valid = (servicePort != null) && IsValidServicePort(servicePort);
+      base.OnInterfaceChanged();
+    }
+
+    public event EventHandler ServicePortChanged;
+    protected virtual void OnServicePortChanged() {
+      var handler = ServicePortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region ServicePort Events
+    protected void RegisterServicePortEvents() {
+      if (servicePort != null) {
+        servicePort.InterfaceChanged += ServicePort_InterfaceChanged;
+      }
+    }
+    protected void DeregisterServicePortEvents() {
+      if (servicePort != null) {
+        servicePort.InterfaceChanged -= ServicePort_InterfaceChanged;
+      }
+    }
+    protected void ServicePort_InterfaceChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientServicePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientServicePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ClientServicePort.cs	(revision 15895)
@@ -0,0 +1,145 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ClientServicePort", "An abstract base class for service and client ports of optimization network nodes.")]
+  [StorableClass]
+  public abstract class ClientServicePort : Port, IClientServicePort {
+    public override IEnumerable<IEntity> Children {
+      get { return base.Children.Concat(Parameters.AsEnumerable<IEntity>()); }
+    }
+
+    [Storable]
+    protected ServiceParameterCollection parameters;
+    public ServiceParameterCollection Parameters {
+      get { return parameters; }
+    }
+
+    [StorableConstructor]
+    protected ClientServicePort(bool deserializing) : base(deserializing) { }
+    protected ClientServicePort(ClientServicePort original, Cloner cloner)
+      : base(original, cloner) {
+      parameters = cloner.Clone(original.parameters);
+      foreach (var p in Parameters)
+        p.Parent = this;
+      RegisterParametersEvents();
+    }
+    protected ClientServicePort()
+      : base("ClientServicePort") {
+      parameters = new ServiceParameterCollection();
+      RegisterParametersEvents();
+    }
+    protected ClientServicePort(string name)
+      : base(name) {
+      parameters = new ServiceParameterCollection();
+      RegisterParametersEvents();
+    }
+    protected ClientServicePort(string name, string description)
+      : base(name, description) {
+      parameters = new ServiceParameterCollection();
+      RegisterParametersEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var p in Parameters)
+        p.Parent = this;
+      RegisterParametersEvents();
+    }
+
+    public event EventHandler InterfaceChanged;
+    protected virtual void OnInterfaceChanged() {
+      var handler = InterfaceChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region Parameters Events
+    protected virtual void RegisterParametersEvents() {
+      parameters.ItemsAdded += Parameters_ItemsAdded;
+      parameters.ItemsRemoved += Parameters_ItemsRemoved;
+      parameters.ItemsReplaced += Parameters_ItemsReplaced;
+      parameters.CollectionReset += Parameters_CollectionReset;
+      foreach (var p in parameters)
+        RegisterParameterEvents(p);
+    }
+    protected virtual void Parameters_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IServiceParameter> e) {
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IServiceParameter> e) {
+      foreach (var p in e.Items) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IServiceParameter> e) {
+      foreach (var p in e.OldItems) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IServiceParameter> e) {
+      foreach (var p in e.OldItems) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    #endregion
+
+    #region Parameter Events
+    protected virtual void RegisterParameterEvents(IServiceParameter parameter) {
+      parameter.NameChanged += ServiceParameter_NameChanged;
+      parameter.TypeChanged += ServiceParameter_TypeChanged;
+    }
+    protected virtual void DeregisterParameterEvents(IServiceParameter parameter) {
+      parameter.NameChanged -= ServiceParameter_NameChanged;
+      parameter.TypeChanged -= ServiceParameter_TypeChanged;
+    }
+    protected virtual void ServiceParameter_NameChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    protected virtual void ServiceParameter_TypeChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/EventArgs.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/EventArgs.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/EventArgs.cs	(revision 15895)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public class OutputInputPortEventArgs<TOut, TIn> : EventArgs
+    where TOut : class, IItem
+    where TIn : class, IItem {
+    public TOut Value { get; private set; }
+    public TIn Result { get; set; }
+
+    public OutputInputPortEventArgs(TOut value) {
+      Value = value;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientNode.cs	(revision 15895)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IClientNode : INode {
+    new PortCollection Ports { get; }
+    IItemCollection<ServiceParameterCollection> Calls { get; }
+
+    Task CallServicesAsync();
+    Task CallServicesAsync(CancellationToken token);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientPort.cs	(revision 15895)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IClientPort : IClientServicePort {
+    IServicePort ServicePort { get; set; }
+    bool Valid { get; }
+
+    event EventHandler ServicePortChanged;
+
+    bool IsValidServicePort(IServicePort servicePort);
+    void CloneServicePortParameters();
+    ServiceParameterCollection PrepareParameters();
+    ServiceParameterCollection CallService(ServiceParameterCollection parameters);
+    ServiceParameterCollection CallService(ServiceParameterCollection parameters, CancellationToken token);
+    Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters);
+    Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters, CancellationToken token);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientServicePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientServicePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IClientServicePort.cs	(revision 15895)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IClientServicePort : IPort {
+    ServiceParameterCollection Parameters { get; }
+
+    event EventHandler InterfaceChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputOutputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputOutputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputOutputPort.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IInputOutputPort : IValuePort {
+    IOutputInputPort OutputInputPort { get; set; }
+
+    event EventHandler OutputInputPortChanged;
+  }
+
+  public interface IInputOutputPort<TIn, TOut> : IInputOutputPort, IValuePort<TIn>
+    where TIn : class, IItem
+    where TOut : class, IItem {
+    new IOutputInputPort<TIn, TOut> OutputInputPort { get; set; }
+
+    event EventHandler<OutputInputPortEventArgs<TIn, TOut>> ValueReceived;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IInputPort.cs	(revision 15895)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IInputPort : IValuePort {
+    IOutputPort OutputPort { get; set; }
+
+    event EventHandler OutputPortChanged;
+  }
+
+  public interface IInputPort<T> : IInputPort, IValuePort<T> where T : class, IItem {
+    new IOutputPort<T> OutputPort { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputInputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputInputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputInputPort.cs	(revision 15895)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IOutputInputPort : IValuePort {
+    IItem SendValue(IItem value);
+  }
+
+  public interface IOutputInputPort<TOut, TIn> : IOutputInputPort, IValuePort<TOut>
+    where TOut : class, IItem
+    where TIn : class, IItem {
+    TIn SendValue(TOut value);
+
+    event EventHandler<OutputInputPortEventArgs<TOut, TIn>> ValueSent;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IOutputPort.cs	(revision 15895)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IOutputPort : IValuePort {
+    new IItem Value { get; set; }
+  }
+
+  public interface IOutputPort<T> : IOutputPort, IValuePort<T> where T : class, IItem {
+    new T Value { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServiceParameter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServiceParameter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServiceParameter.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IServiceParameter : IEntity {
+    new IPort Parent { get; set; }
+    Type DataType { get; }
+    ServiceParameterType Type { get; set; }
+    IItem Value { get; set; }
+
+    event EventHandler TypeChanged;
+    event EventHandler ValueChanged;
+  }
+
+  public interface IServiceParameter<T> : IServiceParameter where T : class, IItem {
+    new T Value { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServicePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServicePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IServicePort.cs	(revision 15895)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IServicePort : IClientServicePort {
+    ServiceParameterCollection Process(ServiceParameterCollection parameters);
+    ServiceParameterCollection Process(ServiceParameterCollection parameters, CancellationToken token);
+    Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters);
+    Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters, CancellationToken token);
+    event EventHandler<EventArgs<ServiceParameterCollection, CancellationToken>> ProcessParameters;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IValuePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IValuePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IValuePort.cs	(revision 15895)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IValuePort : IPort {
+    Type DataType { get; }
+    IItem Value { get; }
+
+    event EventHandler ValueChanged;
+  }
+
+  public interface IValuePort<T> : IValuePort where T : class, IItem {
+    new T Value { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IVariablesNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IVariablesNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/IVariablesNode.cs	(revision 15895)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IVariablesNode : INode {
+    new PortCollection Ports { get; }
+
+    VariableCollection Variables { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputOutputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputOutputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputOutputPort.cs	(revision 15895)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("InputOutputPort", "A synchronous input/output port of an optimization network node.")]
+  [StorableClass]
+  public class InputOutputPort<TIn, TOut> : ValuePort<TIn>, IInputOutputPort<TIn, TOut>
+    where TIn : class, IItem
+    where TOut : class, IItem {
+    [Storable]
+    private IOutputInputPort<TIn, TOut> outputInputPort;
+    public IOutputInputPort<TIn, TOut> OutputInputPort {
+      get { return outputInputPort; }
+      set {
+        if (outputInputPort != value) {
+          DeregisterOutputInputPortEvents();
+          outputInputPort = value;
+          RegisterOutputInputPortEvents();
+          OnOutputInputPortChanged();
+        }
+      }
+    }
+    IOutputInputPort IInputOutputPort.OutputInputPort {
+      get { return outputInputPort; }
+      set {
+        var val = value as IOutputInputPort<TIn, TOut>;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. OutputInputPort is not a \"{0}\".",
+                          typeof(IOutputInputPort<TIn, TOut>).GetPrettyName())
+          );
+        OutputInputPort = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected InputOutputPort(bool deserializing) : base(deserializing) { }
+    protected InputOutputPort(InputOutputPort<TIn, TOut> original, Cloner cloner) : base(original, cloner) {
+      outputInputPort = cloner.Clone(original.outputInputPort);
+      RegisterOutputInputPortEvents();
+    }
+    public InputOutputPort() : base("InputOutputPort") { }
+    public InputOutputPort(string name) : base(name) { }
+    public InputOutputPort(string name, string description) : base(name, description) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterOutputInputPortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InputOutputPort<TIn, TOut>(this, cloner);
+    }
+
+    public event EventHandler OutputInputPortChanged;
+    protected void OnOutputInputPortChanged() {
+      var handler = OutputInputPortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<OutputInputPortEventArgs<TIn, TOut>> ValueReceived;
+    protected TOut OnValueReceived(TIn value) {
+      var args = new OutputInputPortEventArgs<TIn, TOut>(value);
+      var handler = ValueReceived;
+      if (handler != null) handler(this, args);
+      return args.Result;
+    }
+
+    protected void RegisterOutputInputPortEvents() {
+      if (outputInputPort != null) {
+        outputInputPort.ValueSent += OutputInputPort_ValueSent;
+      }
+    }
+    protected void DeregisterOutputInputPortEvents() {
+      if (outputInputPort != null) {
+        outputInputPort.ValueSent -= OutputInputPort_ValueSent;
+      }
+    }
+    protected void OutputInputPort_ValueSent(object sender, OutputInputPortEventArgs<TIn, TOut> e) {
+      var value = e.Value;
+      if (value != null)
+        value = (TIn)value.Clone();
+      Value = value;
+      e.Result = OnValueReceived(value);
+      //DISCUSS: clone value?
+      //DISCUSS: switch threads to decouple value propagation and resulting action -> should be done in Node?
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/InputPort.cs	(revision 15895)
@@ -0,0 +1,113 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("InputPort", "An asynchronous input port of an optimization network node.")]
+  [StorableClass]
+  public class InputPort<T> : ValuePort<T>, IInputPort<T> where T : class, IItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown; }
+    }
+
+    [Storable]
+    private IOutputPort<T> outputPort;
+    public IOutputPort<T> OutputPort {
+      get { return outputPort; }
+      set {
+        if (outputPort != value) {
+          DeregisterOutputPortEvents();
+          outputPort = value;
+          RegisterOutputPortEvents();
+          OnOutputPortChanged();
+          UpdateValue();
+        }
+      }
+    }
+    IOutputPort IInputPort.OutputPort {
+      get { return outputPort; }
+      set {
+        var val = value as IOutputPort<T>;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. OutputPort is not a \"{0}\".",
+                          typeof(IOutputPort<T>).GetPrettyName())
+          );
+        OutputPort = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected InputPort(bool deserializing) : base(deserializing) { }
+    protected InputPort(InputPort<T> original, Cloner cloner) : base(original, cloner) {
+      outputPort = cloner.Clone(original.outputPort);
+      RegisterOutputPortEvents();
+    }
+    public InputPort() : base("InputPort") { }
+    public InputPort(string name) : base(name) { }
+    public InputPort(string name, string description) : base(name, description) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterOutputPortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InputPort<T>(this, cloner);
+    }
+
+    protected virtual void UpdateValue() {
+      if (OutputPort != null) {
+        var value = OutputPort.Value;
+        if (value != null)
+          value = (T)value.Clone();
+        Value = value;
+        //DISCUSS: clone value?
+        //DISCUSS: switch threads to decouple value propagation and to make communication asynchronous -> should be done in Node?
+      }
+    }
+
+    public event EventHandler OutputPortChanged;
+    protected void OnOutputPortChanged() {
+      var handler = OutputPortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    protected void RegisterOutputPortEvents() {
+      if (outputPort != null) {
+        outputPort.ValueChanged += OutputPort_ValueChanged;
+      }
+    }
+    protected void DeregisterOutputPortEvents() {
+      if (outputPort != null) {
+        outputPort.ValueChanged -= OutputPort_ValueChanged;
+      }
+    }
+    protected void OutputPort_ValueChanged(object sender, EventArgs e) {
+      UpdateValue();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/MultiplierNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/MultiplierNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/MultiplierNode.cs	(revision 15895)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("MultiplierNode", "A node for multiplying integer values.")]
+  [StorableClass]
+  public class MultiplierNode : Node {
+    protected static readonly string MultiplierPortName = "Multiplier";
+    protected static readonly string ValuePortName = "Value";
+
+    public IInputPort<IntValue> MultiplierPort {
+      get { return (IInputPort<IntValue>)Ports[MultiplierPortName]; }
+    }
+    public IInputOutputPort<IntValue, IntValue> ValuePort {
+      get { return (IInputOutputPort<IntValue, IntValue>)Ports[ValuePortName]; }
+    }
+
+    [StorableConstructor]
+    protected MultiplierNode(bool deserializing) : base(deserializing) { }
+    protected MultiplierNode(MultiplierNode original, Cloner cloner) : base(original, cloner) { }
+    public MultiplierNode()
+      : base("MultiplierNode") {
+      Initialize();
+    }
+    public MultiplierNode(string name)
+      : base(name) {
+      Initialize();
+    }
+    public MultiplierNode(string name, string description)
+      : base(name, description) {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiplierNode(this, cloner);
+    }
+
+    protected virtual void Initialize() {
+      Ports.Add(new InputPort<IntValue>(MultiplierPortName));
+      Ports.Add(new InputOutputPort<IntValue, IntValue>(ValuePortName));
+      RegisterPortEvents();
+    }
+
+    protected virtual void RegisterPortEvents() {
+      ValuePort.ValueReceived += ValuePort_ValueReceived;
+    }
+
+    protected virtual void ValuePort_ValueReceived(object sender, OutputInputPortEventArgs<IntValue, IntValue> e) {
+      if (MultiplierPort.Value == null) throw new InvalidOperationException("Multiplier is null");
+      if (e.Value != null) {
+        e.Result = new IntValue(e.Value.Value * MultiplierPort.Value.Value);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputInputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputInputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputInputPort.cs	(revision 15895)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("OutputInputPort", "A synchronous output/input port of an optimization network node.")]
+  [StorableClass]
+  public class OutputInputPort<TOut, TIn> : ValuePort<TOut>, IOutputInputPort<TOut, TIn>
+    where TOut : class, IItem
+    where TIn : class, IItem {
+
+    [StorableConstructor]
+    protected OutputInputPort(bool deserializing) : base(deserializing) { }
+    protected OutputInputPort(OutputInputPort<TOut, TIn> original, Cloner cloner) : base(original, cloner) { }
+    public OutputInputPort() : base("OutputInputPort") { }
+    public OutputInputPort(string name) : base(name) { }
+    public OutputInputPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OutputInputPort<TOut, TIn>(this, cloner);
+    }
+
+    public TIn SendValue(TOut value) {
+      Value = value;
+      return OnValueSent(value);
+    }
+    public IItem SendValue(IItem value) {
+      TOut val = value as TOut;
+      if ((value != null) && (val == null))
+        throw new InvalidOperationException(
+          string.Format("Type mismatch. Value is not a \"{0}\".",
+                        typeof(TOut).GetPrettyName())
+        );
+      return SendValue(val);
+    }
+
+    public event EventHandler<OutputInputPortEventArgs<TOut, TIn>> ValueSent;
+    protected virtual TIn OnValueSent(TOut value) {
+      var args = new OutputInputPortEventArgs<TOut, TIn>(value);
+      var handler = ValueSent;
+      if (handler != null) handler(this, args);
+      return args.Result;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/OutputPort.cs	(revision 15895)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("OutputPort", "An asynchronous output port of an optimization network node.")]
+  [StorableClass]
+  public class OutputPort<T> : ValuePort<T>, IOutputPort<T> where T : class, IItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp; }
+    }
+
+    new public T Value {
+      get { return base.Value; }
+      set { base.Value = value; }
+    }
+    IItem IOutputPort.Value {
+      get { return Value; }
+      set {
+        T val = value as T;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Value is not a \"{0}\".",
+                          typeof(T).GetPrettyName())
+          );
+        Value = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected OutputPort(bool deserializing) : base(deserializing) { }
+    protected OutputPort(OutputPort<T> original, Cloner cloner) : base(original, cloner) { }
+    public OutputPort() : base("OutputPort") { }
+    public OutputPort(string name) : base(name) { }
+    public OutputPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OutputPort<T>(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameter.cs	(revision 15895)
@@ -0,0 +1,145 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ServiceParameter", "A parameter of a service port.")]
+  [StorableClass]
+  public class ServiceParameter<T> : Entity, IServiceParameter<T> where T : class, IItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
+    }
+    public override Image ItemImage {
+      get {
+        if (Type == ServiceParameterType.Input) return HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown;
+        else if (Type == ServiceParameterType.Output) return HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp;
+        else return base.ItemImage;
+      }
+    }
+
+    new public IPort Parent {
+      get { return (IPort)base.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the node which contains the port
+        base.Parent = value;
+      }
+    }
+    public Type DataType {
+      get { return typeof(T); }
+    }
+    [Storable]
+    private ServiceParameterType type;
+    public ServiceParameterType Type {
+      get { return type; }
+      set {
+        if (value != type) {
+          type = value;
+          OnTypeChanged();
+        }
+      }
+    }
+    [Storable]
+    protected T value;
+    public T Value {
+      get { return value; }
+      set {
+        if (value != this.value) {
+          DeregisterValueEvents();
+          this.value = value;
+          RegisterValueEvents();
+          OnValueChanged();
+        }
+      }
+    }
+    IItem IServiceParameter.Value {
+      get { return Value; }
+      set {
+        T val = value as T;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Value is not a \"{0}\".",
+                          typeof(T).GetPrettyName())
+          );
+        Value = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected ServiceParameter(bool deserializing) : base(deserializing) { }
+    protected ServiceParameter(ServiceParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.type = original.type;
+      this.value = cloner.Clone(original.value);
+      RegisterValueEvents();
+    }
+    public ServiceParameter() : base("ServiceParameter") { }
+    public ServiceParameter(string name) : base(name) { }
+    public ServiceParameter(string name, string description) : base(name, description) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterValueEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ServiceParameter<T>(this, cloner);
+    }
+
+    public override string ToString() {
+      var s = base.ToString();
+      if (Value != null)
+        s += ": " + Value.ToString();
+      return s;
+    }
+
+    public event EventHandler TypeChanged;
+    protected virtual void OnTypeChanged() {
+      var handler = TypeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnItemImageChanged();
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+    protected virtual void RegisterValueEvents() {
+      if (value != null) {
+        value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      }
+    }
+    protected virtual void DeregisterValueEvents() {
+      if (value != null) {
+        value.ToStringChanged -= new EventHandler(Value_ToStringChanged);
+      }
+    }
+    private void Value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollection.cs	(revision 15895)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.Networks {
+  [StorableClass]
+  [Item("ServiceParameterCollection", "Represents a collection of service parameters.")]
+  public class ServiceParameterCollection : NamedItemCollection<IServiceParameter> {
+    [StorableConstructor]
+    protected ServiceParameterCollection(bool deserializing) : base(deserializing) { }
+    protected ServiceParameterCollection(ServiceParameterCollection original, Cloner cloner) : base(original, cloner) { }
+    public ServiceParameterCollection() : base() { }
+    public ServiceParameterCollection(int capacity) : base(capacity) { }
+    public ServiceParameterCollection(IEnumerable<IServiceParameter> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new ServiceParameterCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollectionCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollectionCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterCollectionCollection.cs	(revision 15895)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.Networks {
+  [StorableClass]
+  [Item("ServiceParameterCollectionCollection", "Represents a collection of service parameter collections.")]
+  public class ServiceParameterCollectionCollection : ItemCollection<ServiceParameterCollection> {
+    [StorableConstructor]
+    protected ServiceParameterCollectionCollection(bool deserializing) : base(deserializing) { }
+    protected ServiceParameterCollectionCollection(ServiceParameterCollectionCollection original, Cloner cloner) : base(original, cloner) { }
+    public ServiceParameterCollectionCollection() : base() { }
+    public ServiceParameterCollectionCollection(int capacity) : base(capacity) { }
+    public ServiceParameterCollectionCollection(IEnumerable<ServiceParameterCollection> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new ServiceParameterCollectionCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterType.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterType.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServiceParameterType.cs	(revision 15895)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Optimization.Networks {
+  public enum ServiceParameterType {
+    Input,
+    Output
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServicePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServicePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ServicePort.cs	(revision 15895)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ServicePort", "A service port of an optimization network node.")]
+  [StorableClass]
+  public class ServicePort : ClientServicePort, IServicePort {
+    [StorableConstructor]
+    protected ServicePort(bool deserializing) : base(deserializing) { }
+    protected ServicePort(ServicePort original, Cloner cloner) : base(original, cloner) { }
+    public ServicePort() : base("ServicePort") { }
+    public ServicePort(string name) : base(name) { }
+    public ServicePort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ServicePort(this, cloner);
+    }
+
+    public ServiceParameterCollection Process(ServiceParameterCollection parameters) {
+      return Process(parameters, CancellationToken.None);
+    }
+    public ServiceParameterCollection Process(ServiceParameterCollection parameters, CancellationToken token) {
+      return OnProcessParameters(parameters, token);
+    }
+    public async Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters) {
+      return await ProcessAsync(parameters, CancellationToken.None);
+    }
+    public async Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters, CancellationToken token) {
+      return await Task.Run(() => { return Process(parameters, token); }, token);
+    }
+
+    public event EventHandler<EventArgs<ServiceParameterCollection, CancellationToken>> ProcessParameters;
+    protected virtual ServiceParameterCollection OnProcessParameters(ServiceParameterCollection parameters, CancellationToken token) {
+      var handler = ProcessParameters;
+      if (handler != null) handler(this, new EventArgs<ServiceParameterCollection, CancellationToken>(parameters, token));
+      return parameters;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ValuePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ValuePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/ValuePort.cs	(revision 15895)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ValuePort", "Abstract base class for ports of an optimization network node which contain a single value.")]
+  [StorableClass]
+  public abstract class ValuePort<T> : Port, IValuePort<T> where T : class, IItem {
+    public Type DataType {
+      get { return typeof(T); }
+    }
+
+    [Storable]
+    protected T value;
+    public virtual T Value {
+      get { return value; }
+      protected set {
+        DeregisterValueEvents();
+        this.value = value;
+        RegisterValueEvents();
+        OnValueChanged();
+      }
+    }
+    IItem IValuePort.Value {
+      get { return Value; }
+    }
+
+    [StorableConstructor]
+    protected ValuePort(bool deserializing) : base(deserializing) { }
+    protected ValuePort(ValuePort<T> original, Cloner cloner)
+      : base(original, cloner) {
+      value = cloner.Clone(original.value);
+      RegisterValueEvents();
+    }
+    protected ValuePort() : base("ValuePort") { }
+    protected ValuePort(string name) : base(name) { }
+    protected ValuePort(string name, string description) : base(name, description) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterValueEvents();
+    }
+
+    public override string ToString() {
+      return base.ToString() + ": " + (Value != null ? Value.ToString() : "null");
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+
+    protected virtual void RegisterValueEvents() {
+      if (value != null) {
+        value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      }
+    }
+    protected virtual void DeregisterValueEvents() {
+      if (value != null) {
+        value.ToStringChanged -= new EventHandler(Value_ToStringChanged);
+      }
+    }
+    private void Value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/VariablesNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/VariablesNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/### obsolete/VariablesNode.cs	(revision 15895)
@@ -0,0 +1,248 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("VariablesNode", "A node of an optimization network which contains variables.")]
+  [StorableClass]
+  public class VariablesNode : Node, IVariablesNode {
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+
+    [Storable]
+    private VariableCollection variables;
+    public VariableCollection Variables {
+      get { return variables; }
+    }
+
+    [StorableConstructor]
+    protected VariablesNode(bool deserializing) : base(deserializing) { }
+    protected VariablesNode(VariablesNode original, Cloner cloner)
+      : base(original, cloner) {
+      variables = cloner.Clone(original.variables);
+      RegisterVariablesEvents();
+    }
+    public VariablesNode()
+      : base("VariablesNode") {
+      variables = new VariableCollection();
+      RegisterVariablesEvents();
+    }
+    public VariablesNode(string name)
+      : base(name) {
+      variables = new VariableCollection();
+      RegisterVariablesEvents();
+    }
+    public VariablesNode(string name, string description)
+      : base(name, description) {
+      variables = new VariableCollection();
+      RegisterVariablesEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterVariablesEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VariablesNode(this, cloner);
+    }
+
+    private void UpdateVariable(IInputPort port) {
+      if (!variables.ContainsKey(port.Name))
+        variables.Add(new Variable(port.Name));
+      variables[port.Name].Value = (IItem)port.Value;
+    }
+    private void UpdateOutputPort(IVariable variable) {
+      IPort port = null;
+      if (Ports.TryGetValue(variable.Name, out port)) {
+        IOutputPort o = port as IOutputPort;
+        if (o != null) {
+          o.Value = variable.Value;
+        }
+        IOutputInputPort oi = port as IOutputInputPort;
+        if (oi != null) {
+          var result = (IItem)oi.SendValue(variable.Value);
+          if (!variables.ContainsKey(oi.Name + "Result"))
+            variables.Add(new Variable(oi.Name + "Result"));
+          variables[oi.Name + "Result"].Value = result;
+        }
+      }
+    }
+    private void UpdateOutputPort(IOutputPort port) {
+      IVariable var = null;
+      if (variables.TryGetValue(port.Name, out var)) {
+        port.Value = var.Value;
+      } else {
+        port.Value = null;
+      }
+    }
+    private void UpdateOutputInputPort(IOutputInputPort port) {
+      IVariable var = null;
+      IItem result = null;
+      if (variables.TryGetValue(port.Name, out var)) {
+        result = (IItem)port.SendValue(var.Value);
+      } else {
+        result = (IItem)port.SendValue(null);
+      }
+      if (!variables.ContainsKey(port.Name + "Result"))
+        variables.Add(new Variable(port.Name + "Result"));
+      variables[port.Name + "Result"].Value = result;
+    }
+
+    #region Ports Events
+    protected override void RegisterPortsEvents() {
+      base.RegisterPortsEvents();
+      foreach (var p in Ports)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsAdded(sender, e);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsRemoved(sender, e);
+      foreach (var p in e.Items)
+        DeregisterPortEvents(p);
+    }
+    protected override void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsReplaced(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_CollectionReset(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    #endregion
+
+    #region Port Events
+    private void RegisterPortEvents(IPort port) {
+      IInputPort i = port as IInputPort;
+      if (i != null) {
+        i.NameChanged += InputPort_NameChanged;
+        i.ValueChanged += InputPort_ValueChanged;
+        UpdateVariable(i);
+      }
+      IOutputPort o = port as IOutputPort;
+      if (o != null) {
+        o.NameChanged += OutputPort_NameChanged;
+        UpdateOutputPort(o);
+      }
+      IOutputInputPort oi = port as IOutputInputPort;
+      if (oi != null) {
+        oi.NameChanged += OutputInputPort_NameChanged;
+        UpdateOutputInputPort(oi);
+      }
+    }
+    private void DeregisterPortEvents(IPort port) {
+      IInputPort i = port as IInputPort;
+      if (i != null) {
+        i.NameChanged -= InputPort_NameChanged;
+        i.ValueChanged -= InputPort_ValueChanged;
+      }
+      IOutputPort o = port as IOutputPort;
+      if (o != null) {
+        o.NameChanged -= OutputPort_NameChanged;
+      }
+      IOutputInputPort oi = port as IOutputInputPort;
+      if (oi != null) {
+        oi.NameChanged -= OutputInputPort_NameChanged;
+      }
+    }
+    private void InputPort_NameChanged(object sender, EventArgs e) {
+      UpdateVariable((IInputPort)sender);
+    }
+    private void InputPort_ValueChanged(object sender, EventArgs e) {
+      UpdateVariable((IInputPort)sender);
+    }
+    private void OutputPort_NameChanged(object sender, EventArgs e) {
+      UpdateOutputPort((IOutputPort)sender);
+    }
+    private void OutputInputPort_NameChanged(object sender, EventArgs e) {
+      UpdateOutputInputPort((IOutputInputPort)sender);
+    }
+    #endregion
+
+    #region Variables Events
+    private void RegisterVariablesEvents() {
+      variables.ItemsAdded += Variables_ItemsAdded;
+      variables.ItemsRemoved += Variables_ItemsRemoved;
+      variables.ItemsReplaced += Variables_ItemsReplaced;
+      variables.CollectionReset += Variables_CollectionReset;
+      foreach (var v in variables)
+        RegisterVariableEvents(v);
+    }
+    private void Variables_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IVariable> e) {
+      foreach (var v in e.Items)
+        RegisterVariableEvents(v);
+    }
+    private void Variables_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IVariable> e) {
+      foreach (var v in e.Items)
+        DeregisterVariableEvents(v);
+    }
+    private void Variables_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IVariable> e) {
+      foreach (var v in e.OldItems)
+        DeregisterVariableEvents(v);
+      foreach (var v in e.Items)
+        RegisterVariableEvents(v);
+    }
+    private void Variables_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IVariable> e) {
+      foreach (var v in e.OldItems)
+        DeregisterVariableEvents(v);
+      foreach (var v in e.Items)
+        RegisterVariableEvents(v);
+    }
+    #endregion
+
+    #region Variable Events
+    private void RegisterVariableEvents(IVariable variable) {
+      if (variable != null) {
+        variable.ValueChanged += Variable_ValueChanged;
+        variable.ToStringChanged += Variable_ToStringChanged;
+        UpdateOutputPort(variable);
+      }
+    }
+    private void DeregisterVariableEvents(IVariable variable) {
+      if (variable != null) {
+        variable.ValueChanged -= Variable_ValueChanged;
+        variable.ToStringChanged += Variable_ToStringChanged;
+      }
+    }
+    private void Variable_ValueChanged(object sender, EventArgs e) {
+      UpdateOutputPort((IVariable)sender);
+    }
+    private void Variable_ToStringChanged(object sender, EventArgs e) {
+      UpdateOutputPort((IVariable)sender);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/AlgorithmNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/AlgorithmNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/AlgorithmNode.cs	(revision 15895)
@@ -0,0 +1,273 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("AlgorithmNode", "A node of a network which contains a HeuristicLab algorithm.")]
+  [StorableClass]
+  public class AlgorithmNode : Node, IAlgorithmNode {
+    protected object locker = new object();
+
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+
+    [Storable]
+    private IAlgorithm algorithm;
+    public IAlgorithm Algorithm {
+      get { return algorithm; }
+      set {
+        if (value != algorithm) {
+          algorithm = value;
+          OnAlgorithmChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+    }
+
+    [Storable]
+    private IItemCollection<IAlgorithm> startedAlgorithms;
+    public IItemCollection<IAlgorithm> StartedAlgorithms {
+      get { return startedAlgorithms; }
+    }
+
+    [StorableConstructor]
+    protected AlgorithmNode(bool deserializing) : base(deserializing) { }
+    protected AlgorithmNode(AlgorithmNode original, Cloner cloner)
+      : base(original, cloner) {
+      algorithm = cloner.Clone(original.algorithm);
+      runs = cloner.Clone(original.runs);
+      startedAlgorithms = cloner.Clone(original.startedAlgorithms);
+      RegisterStartedAlgorithmsEvents();
+    }
+    public AlgorithmNode()
+      : base("AlgorithmNode") {
+      runs = new RunCollection();
+      startedAlgorithms = new ItemCollection<IAlgorithm>();
+      RegisterStartedAlgorithmsEvents();
+    }
+
+    public AlgorithmNode(string name)
+      : base(name) {
+      runs = new RunCollection();
+      startedAlgorithms = new ItemCollection<IAlgorithm>();
+      RegisterStartedAlgorithmsEvents();
+    }
+    public AlgorithmNode(string name, string description)
+      : base(name, description) {
+      runs = new RunCollection();
+      startedAlgorithms = new ItemCollection<IAlgorithm>();
+      RegisterStartedAlgorithmsEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmNode(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterStartedAlgorithmsEvents();
+    }
+
+    protected virtual void RegisterStartedAlgorithmsEvents() {
+      startedAlgorithms.ItemsAdded += StartedAlgorithms_ItemsChanged;
+      startedAlgorithms.ItemsRemoved += StartedAlgorithms_ItemsChanged;
+    }
+
+    private void StartedAlgorithms_ItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IAlgorithm> e) {
+      OnStartedAlgorithmsChanged();
+    }
+
+    protected virtual void Configure(IConfigurationPort port, IMessage message, CancellationToken token) {
+      // set algorithm and problem parameters
+      lock (locker) {
+        if (algorithm != null) {
+          foreach (var v in message.Values) {
+            IParameter param = null;
+            if (Algorithm.Parameters.TryGetValue(v.Name, out param)) {
+              var vp = param as IValueParameter;
+              if (vp != null) vp.Value = v.Value;
+            }
+            if (Algorithm.Problem.Parameters.TryGetValue(v.Name, out param)) {
+              var vp = param as IValueParameter;
+              if (vp != null) vp.Value = v.Value;
+            }
+          }
+        }
+      }
+    }
+
+    protected virtual void Execute(IExecutionPort port, IMessage message, CancellationToken token) {
+      if (Algorithm == null) throw new InvalidOperationException("Algorithm is null");
+
+      IAlgorithm algorithm;
+      lock (locker) {
+        // prevent cloning of ports in hook operators
+        var cloner = new Cloner();
+        foreach (var hook in Algorithm.GetObjectGraphObjects(new HashSet<object>() { Algorithm.Results, Algorithm.Runs }).OfType<IHookOperator>()) {
+          cloner.RegisterClonedObject(hook.Port, hook.Port);
+        }
+        algorithm = (IAlgorithm)Algorithm.Clone(cloner);
+      }
+
+      // set parameters
+      foreach (var v in message.Values) {
+        IParameter param = null;
+        if (algorithm.Parameters.TryGetValue(v.Name, out param)) {
+          var vp = param as IValueParameter;
+          if (vp != null) vp.Value = v.Value;
+        }
+        if (algorithm.Problem.Parameters.TryGetValue(v.Name, out param)) {
+          var vp = param as IValueParameter;
+          if (vp != null) vp.Value = v.Value;
+        }
+      }
+
+      token.ThrowIfCancellationRequested();
+
+      Exception exception = null;
+      using (var started = new AutoResetEvent(false))
+      using (var stopped = new AutoResetEvent(false))
+      using (var ctr = token.Register(() => {
+        started.WaitOne();
+        try { algorithm.Stop(); }
+        catch (InvalidOperationException) {
+          // NOTE:
+          // After the algorithm's engine is stopped, all stateful items in the algorithm are cleared before the execution state of the algorithm is set to stopped.
+          // When algorithm.Stop() is called during that operation, an InvalidOperationException is thrown because Stop is called on the engine but the engine is already stopped.
+          // This exception can be ignored, as the algorithm will stop immediately after the clearing of its stateful items is finished.
+        }
+      })) {
+        algorithm.StoreAlgorithmInEachRun = false;
+        algorithm.Prepare(true);
+        algorithm.ExceptionOccurred += (sender, args) => { exception = args.Value; };
+        algorithm.Started += (sender, args) => { started.Set(); startedAlgorithms.Add((IAlgorithm)sender); };
+        algorithm.Stopped += (sender, args) => { stopped.Set(); startedAlgorithms.Remove((IAlgorithm)sender); };
+        algorithm.Start();
+        stopped.WaitOne();
+      }
+
+      if (exception != null) throw exception;
+      token.ThrowIfCancellationRequested();
+
+      // retrieve results
+      var run = algorithm.Runs.First();
+      foreach (var v in message.Values) {
+        IItem result = null;
+        if (run.Results.TryGetValue(v.Name, out result)) {
+          v.Value = result;
+        }
+      }
+
+      lock (locker) {
+        Runs.Add(run);
+      }
+    }
+
+    public event EventHandler AlgorithmChanged;
+    protected virtual void OnAlgorithmChanged() {
+      var handler = AlgorithmChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler StartedAlgorithmsChanged;
+    protected virtual void OnStartedAlgorithmsChanged() {
+      var handler = StartedAlgorithmsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region Ports Events
+    protected override void RegisterPortsEvents() {
+      base.RegisterPortsEvents();
+      foreach (var p in Ports)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsAdded(sender, e);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsRemoved(sender, e);
+      foreach (var p in e.Items)
+        DeregisterPortEvents(p);
+    }
+    protected override void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsReplaced(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_CollectionReset(sender, e);
+      foreach (var p in e.OldItems)
+        DeregisterPortEvents(p);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    #endregion
+
+    #region Port Events
+    private void RegisterPortEvents(IPort port) {
+      IConfigurationPort c = port as IConfigurationPort;
+      if (c != null) {
+        c.MessageReceived += ConfigurationPort_MessageReceived;
+      }
+      IExecutionPort e = port as IExecutionPort;
+      if (e != null) {
+        e.MessageReceived += ExecutionPort_MessageReceived;
+      }
+    }
+    private void DeregisterPortEvents(IPort port) {
+      IConfigurationPort c = port as IConfigurationPort;
+      if (c != null) {
+        c.MessageReceived -= ConfigurationPort_MessageReceived;
+      }
+      IExecutionPort e = port as IExecutionPort;
+      if (e != null) {
+        e.MessageReceived -= ExecutionPort_MessageReceived;
+      }
+    }
+    protected virtual void ConfigurationPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Configure((IConfigurationPort)sender, e.Value, e.Value2);
+    }
+    protected virtual void ExecutionPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Execute((IExecutionPort)sender, e.Value, e.Value2);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.Designer.cs	(revision 15895)
@@ -0,0 +1,205 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Networks {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class CodeResources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal CodeResources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Networks.CodeResources", typeof(CodeResources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to #region License Information
+        ////* HeuristicLab
+        /// * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+        /// *
+        /// * This file is part of HeuristicLab.
+        /// *
+        /// * HeuristicLab is free software: you can redistribute it and/or modify
+        /// * it under the terms of the GNU General Public License as published by
+        /// * the Free Software Foundation, either version 3 of the License, or
+        /// * (at your option) any later version.
+        /// *
+        /// * HeuristicLab is distributed in the hope that it will be useful,
+        /// * but  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string KSPTSPConcurrentControlNetworkCode {
+            get {
+                return ResourceManager.GetString("KSPTSPConcurrentControlNetworkCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to #region License Information
+        ////* HeuristicLab
+        /// * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+        /// *
+        /// * This file is part of HeuristicLab.
+        /// *
+        /// * HeuristicLab is free software: you can redistribute it and/or modify
+        /// * it under the terms of the GNU General Public License as published by
+        /// * the Free Software Foundation, either version 3 of the License, or
+        /// * (at your option) any later version.
+        /// *
+        /// * HeuristicLab is distributed in the hope that it will be useful,
+        /// * but  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string KSPTSPConnectorCode {
+            get {
+                return ResourceManager.GetString("KSPTSPConnectorCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to #region License Information
+        ////* HeuristicLab
+        /// * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+        /// *
+        /// * This file is part of HeuristicLab.
+        /// *
+        /// * HeuristicLab is free software: you can redistribute it and/or modify
+        /// * it under the terms of the GNU General Public License as published by
+        /// * the Free Software Foundation, either version 3 of the License, or
+        /// * (at your option) any later version.
+        /// *
+        /// * HeuristicLab is distributed in the hope that it will be useful,
+        /// * but  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string KSPTSPControlCode {
+            get {
+                return ResourceManager.GetString("KSPTSPControlCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to #region License Information
+        ////* HeuristicLab
+        /// * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+        /// *
+        /// * This file is part of HeuristicLab.
+        /// *
+        /// * HeuristicLab is free software: you can redistribute it and/or modify
+        /// * it under the terms of the GNU General Public License as published by
+        /// * the Free Software Foundation, either version 3 of the License, or
+        /// * (at your option) any later version.
+        /// *
+        /// * HeuristicLab is distributed in the hope that it will be useful,
+        /// * but  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string KSPTSPNetworkCode {
+            get {
+                return ResourceManager.GetString("KSPTSPNetworkCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Core.Networks;
+        ///using System;
+        ///using System.Threading;
+        ///
+        ///#region How to use the variable store?
+        ///// use &quot;Vars&quot; to access variables in the variable store (e.g. Vars.x = 5)
+        ///// use &quot;Vars[string]&quot; to access variables using runtime strings (e.g. Vars[&quot;x&quot;] = 5)
+        ///// use &quot;Vars.Contains(string)&quot; to check if a variable exists
+        ///// use &quot;Vars.Clear()&quot; to remove all variables
+        ///// use &quot;foreach (KeyValuePair&lt;string, object&gt; v in Vars) { ... }&quot; to it [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string ProgrammableNetworkCode {
+            get {
+                return ResourceManager.GetString("ProgrammableNetworkCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///
+        ///#region How to use the variable store?
+        ///// use &quot;Vars&quot; to access variables in the variable store (e.g. Vars.x = 5)
+        ///// use &quot;Vars[string]&quot; to access variables using runtime strings (e.g. Vars[&quot;x&quot;] = 5)
+        ///// use &quot;Vars.Contains(string)&quot; to check if a variable exists
+        ///// use &quot;Vars.Clear()&quot; to remove all variables
+        ///// use &quot;foreach (KeyValuePair&lt;string, object&gt; v in Vars) { ... }&quot; to iterate over all variables
+        ///// use &quot;Variables&quot; to work with IEnumerable&lt;T&gt; ex [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string ProgrammableNetworkItemCode {
+            get {
+                return ResourceManager.GetString("ProgrammableNetworkItemCode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Core.Networks;
+        ///using System;
+        ///using System.Threading;
+        ///
+        ///#region How to use the variable store?
+        ///// use &quot;Vars&quot; to access variables in the variable store (e.g. Vars.x = 5)
+        ///// use &quot;Vars[string]&quot; to access variables using runtime strings (e.g. Vars[&quot;x&quot;] = 5)
+        ///// use &quot;Vars.Contains(string)&quot; to check if a variable exists
+        ///// use &quot;Vars.Clear()&quot; to remove all variables
+        ///// use &quot;foreach (KeyValuePair&lt;string, object&gt; v in Vars) { ... }&quot; to it [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string ProgrammableNodeCode {
+            get {
+                return ResourceManager.GetString("ProgrammableNodeCode", resourceCulture);
+            }
+        }
+    }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.resx
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.resx	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/CodeResources.resx	(revision 15895)
@@ -0,0 +1,142 @@
+﻿<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="KSPTSPConcurrentControlNetworkCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>KSPTSPConcurrentControlNetworkCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="KSPTSPConnectorCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>KSPTSPConnectorCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="KSPTSPControlCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>KSPTSPControlCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="KSPTSPNetworkCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>KSPTSPNetworkCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="ProgrammableNetworkCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Programmable\ProgrammableNetworkCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="ProgrammableNetworkItemCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Programmable\ProgrammableNetworkItemCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="ProgrammableNodeCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Programmable\ProgrammableNodeCode.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+</root>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ConfigurationPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ConfigurationPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ConfigurationPort.cs	(revision 15895)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("ConfigurationPort", "A port of a network node which triggers configuration changes and can be defined by the user.")]
+  [StorableClass]
+  public class ConfigurationPort : UserDefinedMessagePort, IConfigurationPort {
+    [StorableConstructor]
+    protected ConfigurationPort(bool deserializing) : base(deserializing) { }
+    protected ConfigurationPort(ConfigurationPort original, Cloner cloner) : base(original, cloner) { }
+    public ConfigurationPort() : base("ConfigurationPort") { }
+    public ConfigurationPort(string name) : base(name) { }
+    public ConfigurationPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConfigurationPort(this, cloner);
+    }
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IConnectablePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IConnectablePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IConnectablePort.cs	(revision 15895)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IConnectablePort : IPort {
+    IPort ConnectedPort { get; set; }
+    bool PortConnectionValid { get; }
+
+    bool CanConnectToPort(IPort port);
+
+    event EventHandler ConnectedPortChanged;
+    event EventHandler PortConnectionValidChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessage.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessage.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessage.cs	(revision 15895)
@@ -0,0 +1,27 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks {
+  public interface IMessage : IItem {
+    MessageValueCollection Values { get; }
+    IItem this[string valueName] { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessagePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessagePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessagePort.cs	(revision 15895)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IMessagePort : IParameterizedPort, IConnectablePort {
+    new IMessagePort ConnectedPort { get; set; }
+
+    IMessage LastMessage { get; }
+    event EventHandler LastMessageChanged;
+
+    IMessage PrepareMessage();
+    void SendMessage(IMessage message);
+    void SendMessage(IMessage message, CancellationToken token);
+    Task SendMessageAsync(IMessage message);
+    Task SendMessageAsync(IMessage message, CancellationToken token);
+    void ReceiveMessage(IMessage message, CancellationToken token);
+
+    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
+    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessageValue.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessageValue.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IMessageValue.cs	(revision 15895)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IMessageValue : IItem {
+    string Name { get; }
+    Type DataType { get; }
+    IItem Value { get; set; }
+
+    event EventHandler ValueChanged;
+  }
+
+  public interface IMessageValue<T> : IMessageValue where T : class, IItem {
+    new T Value { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetwork.cs	(revision 15895)
@@ -0,0 +1,26 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks {
+  public interface INetwork : INode {
+    IKeyedItemCollection<string, INode> Nodes { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetworkItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetworkItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INetworkItem.cs	(revision 15895)
@@ -0,0 +1,29 @@
+#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.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  public interface INetworkItem : INamedItem, IVisualizable {
+    INetworkItem Parent { get; }
+    IEnumerable<INetworkItem> Children { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/INode.cs	(revision 15895)
@@ -0,0 +1,27 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Core.Networks {
+  public interface INode : INetworkItem {
+    new INetwork Parent { get; set; }
+    IKeyedItemCollection<string, IPort> Ports { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IParameterizedPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IParameterizedPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IParameterizedPort.cs	(revision 15895)
@@ -0,0 +1,32 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IParameterizedPort : IPort {
+    IKeyedItemCollection<string, IPortParameter> Parameters { get; }
+
+    void CloneParametersFromPort(IParameterizedPort port);
+
+    event EventHandler InterfaceChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPort.cs	(revision 15895)
@@ -0,0 +1,26 @@
+#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.Core.Networks {
+  public interface IPort : INetworkItem {
+    new INode Parent { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPortParameter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPortParameter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IPortParameter.cs	(revision 15895)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IPortParameter : INetworkItem {
+    new IPort Parent { get; set; }
+    Type DataType { get; }
+    PortParameterType Type { get; set; }
+    IItem DefaultValue { get; set; }
+
+    event EventHandler TypeChanged;
+    event EventHandler DefaultValueChanged;
+
+    IMessageValue CreateMessageValue();
+  }
+
+  public interface IPortParameter<T> : IPortParameter where T : class, IItem {
+    new T DefaultValue { get; set; }
+
+    new IMessageValue<T> CreateMessageValue();
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualProperties.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#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;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IVisualProperties : IDeepCloneable {
+    event EventHandler Changed;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualizable.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualizable.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/IVisualizable.cs	(revision 15895)
@@ -0,0 +1,26 @@
+﻿#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.Core.Networks {
+  public interface IVisualizable {
+    IVisualProperties VisualProperties { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Message.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Message.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Message.cs	(revision 15895)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Drawing;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("Message", "A message sent between ports.")]
+  [StorableClass]
+  public class Message : Item, IMessage {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Comment; }
+    }
+
+    [Storable]
+    protected MessageValueCollection values;
+    public MessageValueCollection Values {
+      get { return values; }
+    }
+    public IItem this[string valueName] {
+      get { return Values[valueName].Value; }
+      set { Values[valueName].Value = value; }
+    }
+
+    [StorableConstructor]
+    protected Message(bool deserializing) : base(deserializing) { }
+    protected Message(Message original, Cloner cloner)
+      : base(original, cloner) {
+      values = cloner.Clone(original.values);
+    }
+    public Message() {
+      values = new MessageValueCollection();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Message(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageCollection.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  [Item("MessageCollection", "A collection of messages.")]
+  public class MessageCollection : ItemCollection<IMessage> {
+    [StorableConstructor]
+    protected MessageCollection(bool deserializing) : base(deserializing) { }
+    protected MessageCollection(MessageCollection original, Cloner cloner) : base(original, cloner) { }
+    public MessageCollection() : base() { }
+    public MessageCollection(int capacity) : base(capacity) { }
+    public MessageCollection(IEnumerable<IMessage> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new MessageCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessagePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessagePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessagePort.cs	(revision 15895)
@@ -0,0 +1,255 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("MessagePort", "A port of a network node for sending and receiving messages.")]
+  [StorableClass]
+  public class MessagePort : ParameterizedPort, IMessagePort {
+    public override Image ItemImage {
+      get {
+        if (PortConnectionValid) return base.ItemImage;
+        else return HeuristicLab.Common.Resources.VSImageLibrary.Error;
+      }
+    }
+
+    new public PortParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [Storable]
+    protected IMessagePort connectedPort;
+    public IMessagePort ConnectedPort {
+      get { return connectedPort; }
+      set {
+        if (connectedPort != value) {
+          DeregisterConnectedPortEvents();
+          connectedPort = value;
+          RegisterConnectedPortEvents();
+          OnConnectedPortChanged();
+          CheckPortConnection();
+        }
+      }
+    }
+    IPort IConnectablePort.ConnectedPort {
+      get { return ConnectedPort; }
+      set {
+        if (!(value is IMessagePort))
+          throw new InvalidOperationException("Type mismatch. ConnectedPort is not an IMessagePort.");
+        ConnectedPort = (IMessagePort)value;
+      }
+    }
+    [Storable]
+    protected bool portConnectionValid;
+    public bool PortConnectionValid {
+      get { return portConnectionValid; }
+      protected set {
+        if (value != portConnectionValid) {
+          portConnectionValid = value;
+          OnPortConnectionValidChanged();
+          OnItemImageChanged();
+        }
+      }
+    }
+    [Storable]
+    protected IMessage lastMessage;
+    public IMessage LastMessage {
+      get { return lastMessage; }
+      protected set {
+        if (value != lastMessage) {
+          lastMessage = value;
+          OnLastMessageChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    protected MessagePort(bool deserializing) : base(deserializing) { }
+    protected MessagePort(MessagePort original, Cloner cloner)
+      : base(original, cloner) {
+      connectedPort = cloner.Clone(original.connectedPort);
+      portConnectionValid = original.portConnectionValid;
+      lastMessage = null;
+      RegisterConnectedPortEvents();
+    }
+    public MessagePort()
+      : base("MessagePort") {
+      portConnectionValid = true;
+      lastMessage = null;
+    }
+    public MessagePort(string name)
+      : base(name) {
+      portConnectionValid = true;
+      lastMessage = null;
+    }
+    public MessagePort(string name, string description)
+      : base(name, description) {
+      portConnectionValid = true;
+      lastMessage = null;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterConnectedPortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MessagePort(this, cloner);
+    }
+
+    public bool CanConnectToPort(IPort port) {
+      return (port == null) || (port is IMessagePort);
+    }
+
+    public IMessage PrepareMessage() {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      var message = new Message();
+
+      // collect output parameters from local port
+      message.Values.AddRange(
+        Parameters
+          .Where(p => p.Type.HasFlag(PortParameterType.Output))
+          .Select(p => p.CreateMessageValue())
+      );
+
+      // collect remaining parameters from connected port
+      if (ConnectedPort != null) {
+        message.Values.AddRange(
+          ConnectedPort.Parameters
+            .Where(p => !message.Values.ContainsKey(p.Name))
+            .Select(p => p.CreateMessageValue())
+        );
+      }
+
+      // collect remaining input parameters from local port
+      message.Values.AddRange(
+        Parameters
+          .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))
+          .Select(p => p.CreateMessageValue())
+      );
+
+      return message;
+    }
+    public void SendMessage(IMessage message) {
+      SendMessage(message, CancellationToken.None);
+    }
+    public void SendMessage(IMessage message, CancellationToken token) {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      if (ConnectedPort != null) ConnectedPort.ReceiveMessage(message, token);
+      LastMessage = message;
+      OnMessageSent(message, token);
+    }
+    public async Task SendMessageAsync(IMessage message) {
+      await SendMessageAsync(message, CancellationToken.None);
+    }
+    public async Task SendMessageAsync(IMessage message, CancellationToken token) {
+      await Task.Run(() => { SendMessage(message, token); }, token);
+    }
+    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
+    protected virtual void OnMessageSent(IMessage message, CancellationToken token) {
+      var handler = MessageSent;
+      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
+    }
+
+    public void ReceiveMessage(IMessage message, CancellationToken token) {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      LastMessage = message;
+      OnMessageReceived(message, token);
+      token.ThrowIfCancellationRequested();
+    }
+    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
+    protected virtual void OnMessageReceived(IMessage message, CancellationToken token) {
+      var handler = MessageReceived;
+      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
+    }
+
+    public event EventHandler ConnectedPortChanged;
+    protected virtual void OnConnectedPortChanged() {
+      var handler = ConnectedPortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PortConnectionValidChanged;
+    protected virtual void OnPortConnectionValidChanged() {
+      var handler = PortConnectionValidChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler LastMessageChanged;
+    protected virtual void OnLastMessageChanged() {
+      var handler = LastMessageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    protected override void OnInterfaceChanged() {
+      CheckPortConnection();
+      base.OnInterfaceChanged();
+    }
+
+    #region ConnectedPort Events
+    protected virtual void RegisterConnectedPortEvents() {
+      if (connectedPort != null) {
+        connectedPort.InterfaceChanged += ConnectedPort_InterfaceChanged;
+        connectedPort.MessageSent += ConnectedPort_MessageSent;
+      }
+    }
+    protected virtual void DeregisterConnectedPortEvents() {
+      if (connectedPort != null) {
+        connectedPort.InterfaceChanged -= ConnectedPort_InterfaceChanged;
+        connectedPort.MessageSent -= ConnectedPort_MessageSent;
+      }
+    }
+    protected virtual void ConnectedPort_InterfaceChanged(object sender, EventArgs e) {
+      CheckPortConnection();
+    }
+    protected virtual void ConnectedPort_MessageSent(object sender, EventArgs<IMessage, CancellationToken> e) {
+      ReceiveMessage(e.Value, e.Value2);
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void CheckPortConnection() {
+      PortConnectionValid = (ConnectedPort == null) ||
+                            (ParametersCompatibleToTarget(Parameters, ConnectedPort.Parameters) &&
+                             ParametersCompatibleToTarget(ConnectedPort.Parameters, Parameters));
+    }
+    protected virtual bool ParametersCompatibleToTarget(IEnumerable<IPortParameter> source, IEnumerable<IPortParameter> target) {
+      // checks if the source parameters are compatible to the input parameters of the target
+      foreach (var input in target.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
+        var param = source.Where(p => input.Name == p.Name).FirstOrDefault();
+        if (param == null) {
+          if (input.DefaultValue == null) return false;
+        } else {
+          if (!param.Type.HasFlag(PortParameterType.Output)) return false;
+          if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
+        }
+      }
+      return true;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValue.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValue.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValue.cs	(revision 15895)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("MessageValue", "A value of a message sent between ports.")]
+  [StorableClass]
+  public class MessageValue<T> : Item, IMessageValue<T> where T : class, IItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
+    }
+    public override Image ItemImage {
+      get {
+        if (value != null) return value.ItemImage;
+        else return base.ItemImage;
+      }
+    }
+
+    [Storable]
+    protected string name;
+    public string Name {
+      get { return name; }
+    }
+    public Type DataType {
+      get { return typeof(T); }
+    }
+    [Storable]
+    protected T value;
+    public T Value {
+      get { return value; }
+      set {
+        if (value != this.value) {
+          DeregisterValueEvents();
+          this.value = value;
+          RegisterValueEvents();
+          OnValueChanged();
+        }
+      }
+    }
+    IItem IMessageValue.Value {
+      get { return Value; }
+      set {
+        T val = value as T;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Value is not a \"{0}\".",
+                          typeof(T).GetPrettyName())
+          );
+        Value = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected MessageValue(bool deserializing) : base(deserializing) { }
+    protected MessageValue(MessageValue<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.name = original.name;
+      this.value = cloner.Clone(original.value);
+      RegisterValueEvents();
+    }
+    public MessageValue() {
+      name = "MessageValue";
+    }
+    public MessageValue(string name) {
+      if (name == null) this.name = string.Empty;
+      else this.name = name;
+    }
+    public MessageValue(string name, T value)
+      : this(name) {
+      this.value = value;
+      RegisterValueEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterValueEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MessageValue<T>(this, cloner);
+    }
+
+    public override string ToString() {
+      if (Value == null)
+        return string.Format("{0}: null", Name);
+      else
+        return string.Format("{0}: {1}", Name, Value.ToString());
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnItemImageChanged();
+      OnToStringChanged();
+    }
+    protected virtual void RegisterValueEvents() {
+      if (value != null) {
+        value.ItemImageChanged += Value_ItemImageChanged;
+        value.ToStringChanged += Value_ToStringChanged;
+      }
+    }
+    protected virtual void DeregisterValueEvents() {
+      if (value != null) {
+        value.ItemImageChanged -= Value_ItemImageChanged;
+        value.ToStringChanged -= Value_ToStringChanged;
+      }
+    }
+    private void Value_ItemImageChanged(object sender, EventArgs e) {
+      OnItemImageChanged();
+    }
+    private void Value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValueCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValueCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/MessageValueCollection.cs	(revision 15895)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  [Item("MessageValueCollection", "A collection of message values.")]
+  public class MessageValueCollection : KeyedItemCollection<string, IMessageValue> {
+    [StorableConstructor]
+    protected MessageValueCollection(bool deserializing) : base(deserializing) { }
+    protected MessageValueCollection(MessageValueCollection original, Cloner cloner) : base(original, cloner) { }
+    public MessageValueCollection() : base() { }
+    public MessageValueCollection(int capacity) : base(capacity) { }
+    public MessageValueCollection(IEnumerable<IMessageValue> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new MessageValueCollection(this, cloner); }
+
+    protected override string GetKeyForItem(IMessageValue item) {
+      return item.Name;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Network.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Network.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Network.cs	(revision 15895)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("Network", "Abstract base class for networks.")]
+  [StorableClass]
+  public abstract class Network : Node, INetwork, IStorableContent {
+    public string Filename { get; set; }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    public override IEnumerable<INetworkItem> Children {
+      get { return base.Children.Concat(Nodes.AsEnumerable<INetworkItem>()); }
+    }
+
+    [Storable]
+    private NodeCollection nodes;
+    protected NodeCollection Nodes {
+      get { return nodes; }
+    }
+    private ReadOnlyKeyedItemCollection<string, INode> readOnlyNodes;
+    IKeyedItemCollection<string, INode> INetwork.Nodes {
+      get {
+        if (readOnlyNodes == null) readOnlyNodes = nodes.AsReadOnly();
+        return readOnlyNodes;
+      }
+    }
+
+    [StorableConstructor]
+    protected Network(bool deserializing) : base(deserializing) { }
+    protected Network(Network original, Cloner cloner)
+      : base(original, cloner) {
+      nodes = cloner.Clone(original.nodes);
+      foreach (var n in Nodes)
+        n.Parent = this;
+      readOnlyNodes = null;
+      RegisterNodesEvents();
+    }
+    protected Network()
+      : base("Network") {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+      RegisterNodesEvents();
+    }
+    protected Network(string name)
+      : base(name) {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+      RegisterNodesEvents();
+    }
+    protected Network(string name, string description)
+      : base(name, description) {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+      RegisterNodesEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var n in Nodes.ToList())
+        n.Parent = this;
+      RegisterNodesEvents();
+    }
+
+    #region Nodes Events
+    protected virtual void RegisterNodesEvents() {
+      nodes.ItemsAdded += Nodes_ItemsAdded;
+      nodes.ItemsRemoved += Nodes_ItemsRemoved;
+      nodes.ItemsReplaced += Nodes_ItemsReplaced;
+      nodes.CollectionReset += Nodes_CollectionReset;
+    }
+    protected virtual void Nodes_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    protected virtual void Nodes_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.Items)
+        n.Parent = null;
+    }
+    protected virtual void Nodes_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.OldItems)
+        n.Parent = null;
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    protected virtual void Nodes_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.OldItems)
+        n.Parent = null;
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NetworkItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NetworkItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NetworkItem.cs	(revision 15895)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("NetworkItem", "Abstract base class for items of a network.")]
+  [StorableClass]
+  public abstract class NetworkItem : NamedItem, INetworkItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+    }
+
+    private INetworkItem parent;
+    public INetworkItem Parent {
+      get { return parent; }
+      protected set {
+        if (value != parent) {
+          parent = value;
+        }
+      }
+    }
+    public virtual IEnumerable<INetworkItem> Children {
+      get { return Enumerable.Empty<INetworkItem>(); }
+    }
+
+    [Storable]
+    public IVisualProperties VisualProperties { get; set; }
+
+    [StorableConstructor]
+    protected NetworkItem(bool deserializing) : base(deserializing) { }
+    protected NetworkItem(NetworkItem original, Cloner cloner) : base(original, cloner) {
+      VisualProperties = cloner.Clone(original.VisualProperties);
+    }
+    protected NetworkItem() : base("NetworkItem") { }
+    protected NetworkItem(string name) : base(name) { }
+    protected NetworkItem(string name, string description) : base(name, description) { }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Node.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Node.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Node.cs	(revision 15895)
@@ -0,0 +1,125 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("Node", "Abstract base class for nodes of a network.")]
+  [StorableClass]
+  public abstract class Node : NetworkItem, INode {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+
+    new public INetwork Parent {
+      get { return (INetwork)base.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the network which contains the node
+        base.Parent = value;
+      }
+    }
+    public override IEnumerable<INetworkItem> Children {
+      get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); }
+    }
+
+    [Storable]
+    private PortCollection ports;
+    protected PortCollection Ports {
+      get { return ports; }
+    }
+    private ReadOnlyKeyedItemCollection<string, IPort> readOnlyPorts;
+    IKeyedItemCollection<string, IPort> INode.Ports {
+      get {
+        if (readOnlyPorts == null) readOnlyPorts = ports.AsReadOnly();
+        return readOnlyPorts;
+      }
+    }
+
+    [StorableConstructor]
+    protected Node(bool deserializing) : base(deserializing) { }
+    protected Node(Node original, Cloner cloner)
+      : base(original, cloner) {
+      ports = cloner.Clone(original.ports);
+      foreach (var p in Ports)
+        p.Parent = this;
+      readOnlyPorts = null;
+      RegisterPortsEvents();
+    }
+    protected Node()
+      : base("Node") {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+      RegisterPortsEvents();
+    }
+    protected Node(string name)
+      : base(name) {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+      RegisterPortsEvents();
+    }
+    protected Node(string name, string description)
+      : base(name, description) {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+      RegisterPortsEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var p in Ports)
+        p.Parent = this;
+      RegisterPortsEvents();
+    }
+
+    #region Ports Events
+    protected virtual void RegisterPortsEvents() {
+      ports.ItemsAdded += Ports_ItemsAdded;
+      ports.ItemsRemoved += Ports_ItemsRemoved;
+      ports.ItemsReplaced += Ports_ItemsReplaced;
+      ports.CollectionReset += Ports_CollectionReset;
+    }
+    protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.Items)
+        p.Parent = null;
+    }
+    protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.OldItems)
+        p.Parent = null;
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.OldItems)
+        p.Parent = null;
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NodeCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NodeCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/NodeCollection.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  [Item("NodeCollection", "A collection of network nodes.")]
+  public class NodeCollection : NamedItemCollection<INode> {
+    [StorableConstructor]
+    protected NodeCollection(bool deserializing) : base(deserializing) { }
+    protected NodeCollection(NodeCollection original, Cloner cloner) : base(original, cloner) { }
+    public NodeCollection() : base() { }
+    public NodeCollection(int capacity) : base(capacity) { }
+    public NodeCollection(IEnumerable<INode> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new NodeCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/ParameterizedPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/ParameterizedPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/ParameterizedPort.cs	(revision 15895)
@@ -0,0 +1,166 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("ParameterizedPort", "Abstract base class for parameterized ports of network nodes.")]
+  [StorableClass]
+  public abstract class ParameterizedPort : Port, IParameterizedPort {
+    public override IEnumerable<INetworkItem> Children {
+      get { return base.Children.Concat(Parameters.AsEnumerable<INetworkItem>()); }
+    }
+
+    [Storable]
+    private PortParameterCollection parameters;
+    protected PortParameterCollection Parameters {
+      get { return parameters; }
+    }
+    private ReadOnlyKeyedItemCollection<string, IPortParameter> readOnlyParameters;
+    IKeyedItemCollection<string, IPortParameter> IParameterizedPort.Parameters {
+      get {
+        if (readOnlyParameters == null) readOnlyParameters = parameters.AsReadOnly();
+        return readOnlyParameters;
+      }
+    }
+
+    [StorableConstructor]
+    protected ParameterizedPort(bool deserializing) : base(deserializing) { }
+    protected ParameterizedPort(ParameterizedPort original, Cloner cloner)
+      : base(original, cloner) {
+      parameters = cloner.Clone(original.parameters);
+      foreach (var p in Parameters)
+        p.Parent = this;
+      readOnlyParameters = null;
+      RegisterParametersEvents();
+    }
+    protected ParameterizedPort()
+      : base("ParameterizedPort") {
+      parameters = new PortParameterCollection();
+      readOnlyParameters = null;
+      RegisterParametersEvents();
+    }
+    protected ParameterizedPort(string name)
+      : base(name) {
+      parameters = new PortParameterCollection();
+      readOnlyParameters = null;
+      RegisterParametersEvents();
+    }
+    protected ParameterizedPort(string name, string description)
+      : base(name, description) {
+      parameters = new PortParameterCollection();
+      readOnlyParameters = null;
+      RegisterParametersEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var p in Parameters)
+        p.Parent = this;
+      RegisterParametersEvents();
+    }
+
+    public virtual void CloneParametersFromPort(IParameterizedPort port) {
+      Parameters.Clear();
+      foreach (var p in port.Parameters) {
+        var param = (IPortParameter)p.Clone();
+        if (!(param.Type.HasFlag(PortParameterType.Input) && param.Type.HasFlag(PortParameterType.Output))) {
+          param.Type = ~param.Type;  // bitwise negation: input -> output, output -> input
+        }
+        Parameters.Add(param);
+      }
+    }
+
+    public event EventHandler InterfaceChanged;
+    protected virtual void OnInterfaceChanged() {
+      var handler = InterfaceChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region Parameters Events
+    protected virtual void RegisterParametersEvents() {
+      parameters.ItemsAdded += Parameters_ItemsAdded;
+      parameters.ItemsRemoved += Parameters_ItemsRemoved;
+      parameters.ItemsReplaced += Parameters_ItemsReplaced;
+      parameters.CollectionReset += Parameters_CollectionReset;
+      foreach (var p in parameters)
+        RegisterParameterEvents(p);
+    }
+    protected virtual void Parameters_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) {
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) {
+      foreach (var p in e.Items) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) {
+      foreach (var p in e.OldItems) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameters_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPortParameter> e) {
+      foreach (var p in e.OldItems) {
+        p.Parent = null;
+        DeregisterParameterEvents(p);
+      }
+      foreach (var p in e.Items) {
+        p.Parent = this;
+        RegisterParameterEvents(p);
+      }
+      OnInterfaceChanged();
+    }
+    #endregion
+
+    #region Parameter Events
+    protected virtual void RegisterParameterEvents(IPortParameter parameter) {
+      parameter.NameChanged += Parameter_NameChanged;
+      parameter.TypeChanged += Parameter_TypeChanged;
+    }
+    protected virtual void DeregisterParameterEvents(IPortParameter parameter) {
+      parameter.NameChanged -= Parameter_NameChanged;
+      parameter.TypeChanged -= Parameter_TypeChanged;
+    }
+    protected virtual void Parameter_NameChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    protected virtual void Parameter_TypeChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Port.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Port.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/Port.cs	(revision 15895)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("Port", "Abstract base class for ports of network nodes.")]
+  [StorableClass]
+  public abstract class Port : NetworkItem, IPort {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Interface; }
+    }
+
+    new public INode Parent {
+      get { return (INode)base.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the node which contains the port
+        base.Parent = value;
+      }
+    }
+
+    [StorableConstructor]
+    protected Port(bool deserializing) : base(deserializing) { }
+    protected Port(Port original, Cloner cloner) : base(original, cloner) { }
+    protected Port() : base("Port") { }
+    protected Port(string name) : base(name) { }
+    protected Port(string name, string description) : base(name, description) { }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortCollection.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  [Item("PortCollection", "A collection of ports of a network node.")]
+  public class PortCollection : NamedItemCollection<IPort> {
+    [StorableConstructor]
+    protected PortCollection(bool deserializing) : base(deserializing) { }
+    protected PortCollection(PortCollection original, Cloner cloner) : base(original, cloner) { }
+    public PortCollection() : base() { }
+    public PortCollection(INode node, int capacity) : base(capacity) { }
+    public PortCollection(INode node, IEnumerable<IPort> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new PortCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameter.cs	(revision 15895)
@@ -0,0 +1,171 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Drawing;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("PortParameter", "A parameter of a port.")]
+  [StorableClass]
+  public class PortParameter<T> : NetworkItem, IPortParameter<T> where T : class, IItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
+    }
+    public override Image ItemImage {
+      get {
+        if (Type.HasFlag(PortParameterType.Input) && Type.HasFlag(PortParameterType.Output))
+          return HeuristicLab.Common.Resources.VSImageLibrary.ArrowUpDown;
+        else if (Type.HasFlag(PortParameterType.Input))
+          return HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown;
+        else if (Type.HasFlag(PortParameterType.Output))
+          return HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp;
+        else
+          return base.ItemImage; ;
+      }
+    }
+
+    new public IPort Parent {
+      get { return (IPort)base.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the node which contains the port
+        base.Parent = value;
+      }
+    }
+    public Type DataType {
+      get { return typeof(T); }
+    }
+    [Storable]
+    private PortParameterType type;
+    public PortParameterType Type {
+      get { return type; }
+      set {
+        if (value != type) {
+          type = value;
+          OnTypeChanged();
+        }
+      }
+    }
+    [Storable]
+    protected T defaultValue;
+    public T DefaultValue {
+      get { return defaultValue; }
+      set {
+        if (value != this.defaultValue) {
+          DeregisterDefaultValueEvents();
+          this.defaultValue = value;
+          RegisterDefaultValueEvents();
+          OnDefaultValueChanged();
+        }
+      }
+    }
+    IItem IPortParameter.DefaultValue {
+      get { return DefaultValue; }
+      set {
+        T val = value as T;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Value is not a \"{0}\".",
+                          typeof(T).GetPrettyName())
+          );
+        DefaultValue = val;
+      }
+    }
+
+    [StorableConstructor]
+    protected PortParameter(bool deserializing) : base(deserializing) { }
+    protected PortParameter(PortParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.type = original.type;
+      this.defaultValue = cloner.Clone(original.defaultValue);
+      RegisterDefaultValueEvents();
+    }
+    public PortParameter()
+      : base("PortParameter") {
+      type = PortParameterType.Input;
+    }
+    public PortParameter(string name)
+      : base(name) {
+      type = PortParameterType.Input;
+    }
+    public PortParameter(string name, string description)
+      : base(name, description) {
+      type = PortParameterType.Input;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterDefaultValueEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PortParameter<T>(this, cloner);
+    }
+
+    public override string ToString() {
+      var s = base.ToString();
+      if (DefaultValue != null)
+        s += ": " + DefaultValue.ToString();
+      return s;
+    }
+
+    public event EventHandler TypeChanged;
+    protected virtual void OnTypeChanged() {
+      var handler = TypeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnItemImageChanged();
+    }
+
+    public event EventHandler DefaultValueChanged;
+    protected virtual void OnDefaultValueChanged() {
+      var handler = DefaultValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+
+    public IMessageValue<T> CreateMessageValue() {
+      if (DefaultValue == null)
+        return new MessageValue<T>(Name);
+      else
+        return new MessageValue<T>(Name, (T)DefaultValue.Clone());
+    }
+    IMessageValue IPortParameter.CreateMessageValue() {
+      return CreateMessageValue();
+    }
+
+    #region DefaultValue Events
+    protected virtual void RegisterDefaultValueEvents() {
+      if (defaultValue != null) {
+        defaultValue.ToStringChanged += new EventHandler(DefaultValue_ToStringChanged);
+      }
+    }
+    protected virtual void DeregisterDefaultValueEvents() {
+      if (defaultValue != null) {
+        defaultValue.ToStringChanged -= new EventHandler(DefaultValue_ToStringChanged);
+      }
+    }
+    private void DefaultValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterCollection.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterCollection.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterCollection.cs	(revision 15895)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  [Item("PortParameterCollection", "A collection of port parameters.")]
+  public class PortParameterCollection : NamedItemCollection<IPortParameter> {
+    [StorableConstructor]
+    protected PortParameterCollection(bool deserializing) : base(deserializing) { }
+    protected PortParameterCollection(PortParameterCollection original, Cloner cloner) : base(original, cloner) { }
+    public PortParameterCollection() : base() { }
+    public PortParameterCollection(int capacity) : base(capacity) { }
+    public PortParameterCollection(IEnumerable<IPortParameter> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new PortParameterCollection(this, cloner); }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterType.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterType.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/PortParameterType.cs	(revision 15895)
@@ -0,0 +1,30 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Core.Networks {
+  [Flags]
+  public enum PortParameterType {
+    Input = 1,
+    Output = 2
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/VisualProperties.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/VisualProperties.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Core/VisualProperties.cs	(revision 15895)
@@ -0,0 +1,43 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [StorableClass]
+  public abstract class VisualProperties : DeepCloneable, IVisualProperties {
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected VisualProperties(bool deserializing) : base() { }
+    protected VisualProperties(VisualProperties original, Cloner cloner) : base(original, cloner) { }
+
+    protected VisualProperties() { }
+    #endregion
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      var handler = Changed;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ExecutionPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ExecutionPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/ExecutionPort.cs	(revision 15895)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("ExecutionPort", "A port of a network node which triggers execution and can be defined by the user.")]
+  [StorableClass]
+  public class ExecutionPort : UserDefinedMessagePort, IExecutionPort {
+    [StorableConstructor]
+    protected ExecutionPort(bool deserializing) : base(deserializing) { }
+    protected ExecutionPort(ExecutionPort original, Cloner cloner) : base(original, cloner) { }
+    public ExecutionPort() : base("ExecutionPort") { }
+    public ExecutionPort(string name) : base(name) { }
+    public ExecutionPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExecutionPort(this, cloner);
+    }
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionConnector.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionConnector.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionConnector.cs	(revision 15895)
@@ -0,0 +1,104 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Networks.FeatureSelection_Network {
+  [Item("FeatureSelectionConnector", "")]
+  public sealed class FeatureSelectionConnector : Node {
+    private FeatureSelectionConnector(FeatureSelectionConnector original, Cloner cloner) : base(original, cloner) { }
+    public FeatureSelectionConnector()
+      : base() {
+      if (Ports.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FeatureSelectionConnector(this, cloner);
+    }
+
+    public void Initialize() {
+      var parameters = new MessagePort("Parameters");
+      Ports.Add(parameters);
+      parameters.Parameters.Add(new PortParameter<IRegressionProblemData>("ProblemData") { Type = PortParameterType.Input });
+
+      var selectionPort = new MessagePort("Selection Connector");
+      Ports.Add(selectionPort);
+      selectionPort.Parameters.Add(new PortParameter<BinaryVector>("Selection") { Type = PortParameterType.Input });
+      selectionPort.Parameters.Add(new PortParameter<DoubleValue>("Quality") { Type = PortParameterType.Input | PortParameterType.Output });
+
+      var regressionPort = new MessagePort("Regression Connector");
+      Ports.Add(regressionPort);
+      regressionPort.Parameters.Add(new PortParameter<IRegressionProblemData>("ProblemData") { Type = PortParameterType.Output });
+      regressionPort.Parameters.Add(new PortParameter<IRegressionSolution>("Linear regression solution") { Type = PortParameterType.Input });
+      RegisterEvents();
+    }
+
+    public void RegisterEvents() {
+      var selection = (IMessagePort)Ports["Selection Connector"];
+      selection.MessageReceived += Selection_MessageReceived;
+    }
+    public void DeregisterEvents() {
+      var selection = (IMessagePort)Ports["Selection Connector"];
+      selection.MessageReceived -= Selection_MessageReceived;
+    }
+
+    private Dictionary<BinaryVector, double> solutionCache = new Dictionary<BinaryVector, double>(new BinaryVectorComparer());
+
+    private void Selection_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      // get parameters
+      var parametersPort = (IMessagePort)Ports["Parameters"];
+      var parameters = parametersPort.PrepareMessage();
+      parametersPort.SendMessage(parameters, e.Value2);
+      var problemData = (IRegressionProblemData)parameters["ProblemData"];
+
+      // filter allowed variables
+      var selectionMsg = e.Value;
+      var selection = (BinaryVector)selectionMsg["Selection"];
+
+      // if possible return the cached answer 
+      double solutionQuality;
+      if (solutionCache.TryGetValue(selection, out solutionQuality)) {
+        selectionMsg["Quality"] = new DoubleValue(solutionQuality);
+      } else {
+        var allowedVariables = problemData.AllowedInputVariables;
+
+        var selectedInputVariables = from t in selection.Zip(allowedVariables, Tuple.Create)
+                                     where t.Item1
+                                     select t.Item2;
+
+        var clonedProblemData = new RegressionProblemData(problemData.Dataset, selectedInputVariables, problemData.TargetVariable);
+
+        // solve Regression
+        var regressionConPort = (IMessagePort)Ports["Regression Connector"];
+        var regressionMsg = regressionConPort.PrepareMessage();
+        regressionMsg["ProblemData"] = clonedProblemData;
+        regressionConPort.SendMessage(regressionMsg, e.Value2);
+        var solution = regressionMsg.Values.Select(v => v.Value).OfType<IRegressionSolution>().Single();
+
+        selectionMsg["Quality"] = new DoubleValue(solution.TestNormalizedMeanSquaredError);
+        // cache solution quality
+        solutionCache.Add(selection, solution.TestNormalizedMeanSquaredError);
+      }
+    }
+  }
+
+  internal class BinaryVectorComparer : IEqualityComparer<BinaryVector> {
+    public bool Equals(BinaryVector x, BinaryVector y) {
+      return x.Length == y.Length &&
+        x.Zip(y, Tuple.Create).All(t => t.Item1 == t.Item2);
+    }
+
+    public int GetHashCode(BinaryVector obj) {
+      // return number of set bits
+      return obj.Count(t => t);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/FeatureSelectionNetwork.cs	(revision 15895)
@@ -0,0 +1,153 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Networks.FeatureSelection_Network;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Networks {
+  [Creatable("Optimization Networks")]
+  [Item("Feature Selection Network", "An optimization network which contains a binary GA and a LR.")]
+  public sealed class FeatureSelectionNetwork : Network {
+    private FeatureSelectionNetwork(FeatureSelectionNetwork original, Cloner cloner) : base(original, cloner) { }
+    public FeatureSelectionNetwork()
+      : base() {
+      if (Nodes.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FeatureSelectionNetwork(this, cloner);
+    }
+
+    public void Initialize() {
+
+
+      #region ParametersNode
+      var paramsNode = new UserDefinedNode("ParametersNode");
+      Nodes.Add(paramsNode);
+
+      var paramsPort = new MessagePort("Parameters");
+      paramsNode.Ports.Add(paramsPort);
+
+      var rand = new MersenneTwister();
+      var normRand = new NormalDistributedRandom(rand, 0, 1);
+      var instanceProvider = new FeatureSelectionInstanceProvider();
+      var problemData = instanceProvider.LoadData(new FeatureSelection(100, 0.1, 0.2, rand, normRand));
+
+      paramsPort.Parameters.Add(new PortParameter<IRegressionProblemData>("ProblemData") {
+        Type = PortParameterType.Output,
+        DefaultValue = problemData
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntValue>("Length") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntValue(problemData.AllowedInputVariables.Count())
+      });
+      #endregion
+
+      #region Selection Node
+      var selectionNode = new AlgorithmNode("SelectionNode");
+      Nodes.Add(selectionNode);
+
+      var configPort = new ConfigurationPort("ConfigureSelection");
+      selectionNode.Ports.Add(configPort);
+
+      configPort.Parameters.Add(new PortParameter<IRegressionProblemData>("ProblemData") {
+        Type = PortParameterType.Input
+      });
+
+      var evaluatePort = new MessagePort("EvaluateSelection");
+      selectionNode.Ports.Add(evaluatePort);
+
+      evaluatePort.Parameters.Add(new PortParameter<BinaryVector>("Selection") {
+        Type = PortParameterType.Output
+      });
+      evaluatePort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Output | PortParameterType.Input
+      });
+
+      Func<BinaryVector, double> eval = vector => {
+        // hook returns test quality!, LR optimizes training quality only!
+
+        var msg = evaluatePort.PrepareMessage();
+        msg["Selection"] = vector;
+        evaluatePort.SendMessage(msg, new CancellationToken(false));
+
+        return ((DoubleValue)msg["Quality"]).Value;
+      };
+
+      var selectionGa = new GeneticAlgorithm();
+      var selectionProb = new SelectionProblem(eval, false);
+
+      selectionGa.Problem = selectionProb;
+      selectionGa.MaximumGenerations.Value = 50;
+      selectionGa.PopulationSize.Value = 10;
+      selectionGa.Mutator = selectionGa.MutatorParameter.ValidValues.Where(x => x.Name == "SinglePositionBitflipManipulator").First();
+      selectionNode.Algorithm = selectionGa;
+
+      #endregion
+
+      #region RegressionNode
+      var regressionNode = new AlgorithmNode("Regression");
+      Nodes.Add(regressionNode);
+
+      var executePort = new ExecutionPort("Execute");
+      regressionNode.Ports.Add(executePort);
+
+      executePort.Parameters.Add(new PortParameter<IRegressionProblemData>("ProblemData") {
+        Type = PortParameterType.Input
+      });
+      executePort.Parameters.Add(new PortParameter<IRegressionSolution>("Linear regression solution") {
+        Type = PortParameterType.Output
+      });
+
+      var linReg = new LinearRegression();
+      regressionNode.Algorithm = linReg;
+      #endregion
+
+      #region Connector
+      var featureSelectionConnector = (INode)new FeatureSelectionConnector();
+      Nodes.Add(featureSelectionConnector);
+      #endregion
+
+      #region Wire Ports
+      configPort.ConnectedPort = paramsPort;
+      evaluatePort.ConnectedPort = (IMessagePort)featureSelectionConnector.Ports["Selection Connector"];
+      ((IMessagePort)featureSelectionConnector.Ports["Parameters"]).ConnectedPort = paramsPort;
+      ((IMessagePort)featureSelectionConnector.Ports["Regression Connector"]).ConnectedPort = executePort;
+
+      paramsPort.SendMessage(paramsPort.PrepareMessage());
+      #endregion
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/SelectionProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/SelectionProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/FeatureSelection Network/SelectionProblem.cs	(revision 15895)
@@ -0,0 +1,50 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+
+namespace HeuristicLab.Networks.FeatureSelection_Network {
+  public class SelectionProblem : BinaryProblem {
+    private Func<BinaryVector, double> eval;
+
+    protected SelectionProblem(SelectionProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    [StorableConstructor]
+    protected SelectionProblem(bool deserializing) : base(deserializing) { }
+
+    public SelectionProblem(Func<BinaryVector, double> eval, bool maximization)
+      : base() {
+      this.maximization = maximization;
+      this.eval = eval;
+
+
+      var lengthParam = new ValueParameter<IntValue>("Length");
+
+
+      lengthParam.ValueChanged += (o, s) => { Length = lengthParam.Value.Value; };
+      // we cannot use the fixed value parameter from BinaryProblem in the network
+      Parameters.Remove("Length");
+      Parameters.Add(lengthParam);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SelectionProblem(this, cloner);
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      return eval(vector);
+
+    }
+
+    private readonly bool maximization;
+    public override bool Maximization {
+      get { return maximization; }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj	(revision 15895)
@@ -0,0 +1,305 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{7CF51332-0E37-447C-8017-82A258C59EF2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Networks</RootNamespace>
+    <AssemblyName>HeuristicLab.Networks-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Binary-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Binary-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances.DataAnalysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances.DataAnalysis-3.3.dll</HintPath>
+      <EmbedInteropTypes>False</EmbedInteropTypes>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Knapsack-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Knapsack-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TravelingSalesman-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.TravelingSalesman-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Scripting-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Scripting-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AlgorithmNode.cs" />
+    <Compile Include="CodeResources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>CodeResources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ConfigurationPort.cs" />
+    <Compile Include="Core\IVisualizable.cs" />
+    <Compile Include="Core\IVisualProperties.cs" />
+    <Compile Include="Core\VisualProperties.cs" />
+    <Compile Include="ExecutionPort.cs" />
+    <Compile Include="FeatureSelection Network\FeatureSelectionConnector.cs" />
+    <Compile Include="FeatureSelection Network\FeatureSelectionNetwork.cs" />
+    <Compile Include="FeatureSelection Network\SelectionProblem.cs" />
+    <Compile Include="IAlgorithmNode.cs" />
+    <Compile Include="IConfigurationPort.cs" />
+    <Compile Include="IExecutionPort.cs" />
+    <Compile Include="IUserDefinedMessagePort.cs" />
+    <EmbeddedResource Include="CodeResources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>CodeResources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <Compile Include="KSPTSPConnectorCode.cs" />
+    <Compile Include="KSPTSPConcurrentControlNetwork.cs" />
+    <Compile Include="KSPTSPConnector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="KSPTSPControl.cs" />
+    <Compile Include="KSPTSPControlCode.cs" />
+    <Compile Include="KSPTSPNetwork.cs" />
+    <Compile Include="KSPTSPNetworkCode.cs" />
+    <Compile Include="KSPTSPConcurrentControlNetworkCode.cs" />
+    <Compile Include="Core\IConnectablePort.cs" />
+    <Compile Include="Core\IMessage.cs" />
+    <Compile Include="Core\IMessagePort.cs" />
+    <Compile Include="Core\IMessageValue.cs" />
+    <Compile Include="Core\INetwork.cs" />
+    <Compile Include="Core\INetworkItem.cs" />
+    <Compile Include="Core\INode.cs" />
+    <Compile Include="Core\IParameterizedPort.cs" />
+    <Compile Include="Core\IPort.cs" />
+    <Compile Include="Core\IPortParameter.cs" />
+    <Compile Include="Core\Message.cs" />
+    <Compile Include="Core\MessageCollection.cs" />
+    <Compile Include="Core\MessagePort.cs" />
+    <Compile Include="Core\MessageValue.cs" />
+    <Compile Include="Core\MessageValueCollection.cs" />
+    <Compile Include="Core\Network.cs" />
+    <Compile Include="Core\NetworkItem.cs" />
+    <Compile Include="Core\Node.cs" />
+    <Compile Include="Core\NodeCollection.cs" />
+    <Compile Include="Core\ParameterizedPort.cs" />
+    <Compile Include="Core\Port.cs" />
+    <Compile Include="Core\PortCollection.cs" />
+    <Compile Include="Core\PortParameter.cs" />
+    <Compile Include="Core\PortParameterCollection.cs" />
+    <Compile Include="Core\PortParameterType.cs" />
+    <Compile Include="Operators\HookOperator.cs" />
+    <Compile Include="Operators\IHookOperator.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Programmable\IProgrammableNetwork.cs" />
+    <Compile Include="Programmable\IProgrammableNetworkItem.cs" />
+    <Compile Include="Programmable\IProgrammableNode.cs" />
+    <Compile Include="Programmable\IUserDefinedNetwork.cs" />
+    <Compile Include="Programmable\IUserDefinedNode.cs" />
+    <Compile Include="Programmable\ProgrammableNetwork.cs" />
+    <Compile Include="Programmable\ProgrammableNetworkCode.cs" />
+    <Compile Include="Programmable\ProgrammableNetworkItem.cs" />
+    <Compile Include="Programmable\ProgrammableNetworkItemCode.cs" />
+    <Compile Include="Programmable\ProgrammableNode.cs" />
+    <Compile Include="Programmable\ProgrammableNodeCode.cs" />
+    <Compile Include="Programmable\UserDefinedNetwork.cs" />
+    <Compile Include="Programmable\UserDefinedNode.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Scripting\IProgrammableItem.cs" />
+    <Compile Include="UserDefinedMessagePort.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </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/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IAlgorithmNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IAlgorithmNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IAlgorithmNode.cs	(revision 15895)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Networks {
+  public interface IAlgorithmNode : INode {
+    new PortCollection Ports { get; }
+    IAlgorithm Algorithm { get; set; }
+    RunCollection Runs { get; }
+    IItemCollection<IAlgorithm> StartedAlgorithms { get; }
+
+    event EventHandler AlgorithmChanged;
+    event EventHandler StartedAlgorithmsChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IConfigurationPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IConfigurationPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IConfigurationPort.cs	(revision 15895)
@@ -0,0 +1,25 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks {
+  public interface IConfigurationPort : IUserDefinedMessagePort { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IExecutionPort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IExecutionPort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IExecutionPort.cs	(revision 15895)
@@ -0,0 +1,25 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Networks {
+  public interface IExecutionPort : IUserDefinedMessagePort { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IUserDefinedMessagePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IUserDefinedMessagePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/IUserDefinedMessagePort.cs	(revision 15895)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks {
+  public interface IUserDefinedMessagePort : IMessagePort {
+    new PortParameterCollection Parameters { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSP Concurrent-Control Network", "An optimization network which connects a KSP and a TSP.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public class KSPTSPConcurrentControlNetwork : ProgrammableNetwork {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    protected override string CodeTemplate {
+      get { return CodeResources.KSPTSPConcurrentControlNetworkCode; }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPConcurrentControlNetwork(bool deserializing) : base(deserializing) { }
+    protected KSPTSPConcurrentControlNetwork(KSPTSPConcurrentControlNetwork original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPConcurrentControlNetwork() : base("KSPTSPConcurrentControlNetwork") { }
+    public KSPTSPConcurrentControlNetwork(string name) : base(name) { }
+    public KSPTSPConcurrentControlNetwork(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPConcurrentControlNetwork(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs	(revision 15895)
@@ -0,0 +1,224 @@
+#pragma warning disable 436
+
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Drawing;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSP Concurrent-Control Network", "An optimization network which connects a KSP and a TSP.")]
+  public class CompiledKSPTSPConcurrentControlNetwork : ProgrammableNetwork.CompiledProgrammableNetwork {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    protected CompiledKSPTSPConcurrentControlNetwork(CompiledKSPTSPConcurrentControlNetwork original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPConcurrentControlNetwork(ProgrammableNetwork context)
+      : base(context) {
+      if (Nodes.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPConcurrentControlNetwork(this, cloner);
+    }
+
+    public void Initialize() {
+      #region ParametersNode
+      var paramsNode = new UserDefinedNode("ParametersNode");
+      Nodes.Add(paramsNode);
+
+      var paramsPort = new MessagePort("Parameters");
+      paramsNode.Ports.Add(paramsPort);
+
+      paramsPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleMatrix(new double[,] {
+          {00, 00}, {10, 00}, {20, 00}, {30, 00}, {40, 00}, 
+          {00, 10}, {10, 10}, {20, 10}, {30, 10}, {40, 10}, 
+          {00, 20}, {10, 20}, {20, 20}, {30, 20}, {40, 20}, 
+          {00, 30}, {10, 30}, {20, 30}, {30, 30}, {40, 30}, 
+          {00, 40}, {10, 40}, {20, 40}, {30, 40}, {40, 40}
+        })
+      });
+      paramsPort.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleValue(0.1)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntValue(10)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 })
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 })
+      });
+      #endregion
+
+      #region ControlNode
+      var controlNode = new KSPTSPControl("KSPTSP Control");
+      Nodes.Add(controlNode);
+      #endregion
+
+      #region KSPNode
+      var kspNode = new AlgorithmNode("KSPNode");
+      Nodes.Add(kspNode);
+
+      var kspConfigPort = new ConfigurationPort("ConfigureKSP");
+      kspNode.Ports.Add(kspConfigPort);
+
+      kspConfigPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Input
+      });
+      kspConfigPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Input
+      });
+      kspConfigPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Input
+      });
+
+      var kspControlPort = new MessagePort("ControlPort");
+      kspNode.Ports.Add(kspControlPort);
+
+      kspControlPort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Output
+      });
+      kspControlPort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Input
+      });
+
+      var kspReportPort = new MessagePort("ReportPort");
+      kspNode.Ports.Add(kspReportPort);
+
+      kspReportPort.Parameters.Add(new PortParameter<KnapsackSolution>("BestSolution") {
+        Type = PortParameterType.Output
+      });
+
+      var kspGa = new GeneticAlgorithm {
+        Problem = new KnapsackProblem(),
+        MaximumGenerations = { Value = 500 },
+        PopulationSize = { Value = 200 }
+      };
+      kspGa.Mutator = kspGa.MutatorParameter.ValidValues.First(x => x.Name == "SinglePositionBitflipManipulator");
+      kspGa.Crossover = kspGa.CrossoverParameter.ValidValues.First(x => x.Name == "SinglePointCrossover");
+      kspGa.Selector = kspGa.SelectorParameter.ValidValues.First(x => x.Name == "TournamentSelector");
+      kspNode.Algorithm = kspGa;
+
+      var kspEvalHook = new HookOperator() { Name = "KSP Eval Hook" };
+      kspEvalHook.Parameters.Add(new LookupParameter<BinaryVector>("KnapsackSolution") { Hidden = false });
+      kspEvalHook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = false });
+      ((InstrumentedOperator)kspGa.Problem.Evaluator).AfterExecutionOperators.Add(kspEvalHook);
+
+      var kspIterHook = new HookOperator() { Name = "KSP Iter Hook" };
+      kspIterHook.Parameters.Add(new LookupParameter<KnapsackSolution>("BestSolution") { Hidden = false });
+      kspGa.Analyzer.AfterExecutionOperators.Add(kspIterHook);
+      #endregion
+
+      #region TSPNode
+      var tspNode = new AlgorithmNode("TSPNode");
+      Nodes.Add(tspNode);
+
+      var tspConfigPort = new ConfigurationPort("ConfigureTSP");
+      tspNode.Ports.Add(tspConfigPort);
+
+      tspConfigPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+
+      var tspControlPort = new MessagePort("ControlPort");
+      tspNode.Ports.Add(tspControlPort);
+
+      tspControlPort.Parameters.Add(new PortParameter<Permutation>("TSPTour") {
+        Type = PortParameterType.Output
+      });
+      tspControlPort.Parameters.Add(new PortParameter<DoubleValue>("TSPTourLength") {
+        Type = PortParameterType.Input
+      });
+
+      var tspReportPort = new MessagePort("ReportPort");
+      tspNode.Ports.Add(tspReportPort);
+
+      tspReportPort.Parameters.Add(new PortParameter<PathTSPTour>("BestSolution") {
+        Type = PortParameterType.Output
+      });
+
+      var tspGa = new GeneticAlgorithm {
+        Problem = new TravelingSalesmanProblem(),
+        MaximumGenerations = { Value = 500 },
+        PopulationSize = { Value = 200 }
+      };
+      ((IValueParameter<BoolValue>)tspGa.Problem.MaximizationParameter).Value.Value = true;
+      tspGa.Crossover = tspGa.CrossoverParameter.ValidValues.First(x => x.Name == "EdgeRecombinationCrossover");
+      tspGa.Mutator = tspGa.MutatorParameter.ValidValues.First(x => x.Name == "InversionManipulator");
+      tspGa.Selector = tspGa.SelectorParameter.ValidValues.First(x => x.Name == "TournamentSelector");
+      ((TournamentSelector)tspGa.Selector).GroupSizeParameter.Value.Value = 3;
+      tspNode.Algorithm = tspGa;
+
+      var tspEvalHook = new HookOperator() { Name = "TSP Eval Hook" };
+      tspEvalHook.Parameters.Add(new LookupParameter<Permutation>("TSPTour") { Hidden = false });
+      tspEvalHook.Parameters.Add(new LookupParameter<DoubleValue>("TSPTourLength") { Hidden = false });
+      ((InstrumentedOperator)tspGa.Problem.Evaluator).AfterExecutionOperators.Add(tspEvalHook);
+
+      var tspIterHook = new HookOperator() { Name = "TSP Iter Hook" };
+      tspIterHook.Parameters.Add(new LookupParameter<PathTSPTour>("BestSolution") { Hidden = false });
+      tspGa.Analyzer.AfterExecutionOperators.Add(tspIterHook);
+      #endregion
+
+
+      #region Wire Ports
+      ((ConfigurationPort)((INode)controlNode).Ports["Configure"]).ConnectedPort = paramsPort;
+      kspConfigPort.ConnectedPort = paramsPort;
+      tspConfigPort.ConnectedPort = paramsPort;
+
+      kspEvalHook.Port = kspControlPort;
+      kspControlPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Evaluate KSP"];
+      tspEvalHook.Port = tspControlPort;
+      tspControlPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Evaluate TSP"];
+
+      kspIterHook.Port = kspReportPort;
+      kspReportPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Add KSP Solution"];
+      tspIterHook.Port = tspReportPort;
+      tspReportPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Add TSP Solution"];
+      #endregion
+
+      paramsPort.SendMessage(paramsPort.PrepareMessage());
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnector.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnector.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnector.cs	(revision 15895)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPConnector", "A node of an optimization network which connects a KSP and a TSP.")]
+  [StorableClass]
+  public class KSPTSPConnector : ProgrammableNode {
+    protected override string CodeTemplate {
+      get { return CodeResources.KSPTSPConnectorCode; }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPConnector(bool deserializing) : base(deserializing) { }
+    protected KSPTSPConnector(KSPTSPConnector original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPConnector() : base("KSPTSPConnector") { }
+    public KSPTSPConnector(string name) : base(name) { }
+    public KSPTSPConnector(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPConnector(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnectorCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnectorCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConnectorCode.cs	(revision 15895)
@@ -0,0 +1,116 @@
+#pragma warning disable 436
+
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Problems.TravelingSalesman;
+using System.Linq;
+using System.Threading;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPConnector", "A node of an optimization network which connects a KSP and a TSP.")]
+  public class CompiledKSPTSPConnector : ProgrammableNode.CompiledProgrammableNode {
+    protected CompiledKSPTSPConnector(CompiledKSPTSPConnector original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPConnector(ProgrammableNode context)
+      : base(context) {
+      if (Ports.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPConnector(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      var parameters = new MessagePort("Parameters");
+      Ports.Add(parameters);
+      parameters.Parameters.Add(new PortParameter<DoubleMatrix>("Cities") { Type = PortParameterType.Input });
+      parameters.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") { Type = PortParameterType.Input });
+
+      var ksp = new MessagePort("KSP Connector");
+      Ports.Add(ksp);
+      ksp.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") { Type = PortParameterType.Input });
+      ksp.Parameters.Add(new PortParameter<DoubleValue>("Quality") { Type = PortParameterType.Input | PortParameterType.Output });
+      ksp.Parameters.Add(new PortParameter<DoubleValue>("TransportCosts") { Type = PortParameterType.Output });
+      ksp.Parameters.Add(new PortParameter<PathTSPTour>("Route") { Type = PortParameterType.Output });
+
+      var tsp = new MessagePort("TSP Connector");
+      Ports.Add(tsp);
+      tsp.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") { Type = PortParameterType.Output });
+      tsp.Parameters.Add(new PortParameter<PathTSPTour>("Best TSP Solution") { Type = PortParameterType.Input });
+      tsp.Parameters.Add(new PortParameter<DoubleValue>("BestQuality") { Type = PortParameterType.Input });
+    }
+
+    public override void RegisterEvents() {
+      base.RegisterEvents();
+      var ksp = (IMessagePort)Ports["KSP Connector"];
+      ksp.MessageReceived += Knapsack_MessageReceived;
+    }
+    public override void DeregisterEvents() {
+      var ksp = (IMessagePort)Ports["KSP Connector"];
+      ksp.MessageReceived -= Knapsack_MessageReceived;
+      base.DeregisterEvents();
+    }
+
+    private void Knapsack_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      // get parameters
+      var parametersPort = (IMessagePort)Ports["Parameters"];
+      var parameters = parametersPort.PrepareMessage();
+      parametersPort.SendMessage(parameters, e.Value2);
+      var cities = (DoubleMatrix)parameters["Cities"];
+      var factor = ((DoubleValue)parameters["TransportCostsFactor"]).Value;
+
+      // build coordinates
+      var kspMsg = e.Value;
+      var kspSolution = (BinaryVector)kspMsg["KnapsackSolution"];
+      var kspQuality = ((DoubleValue)kspMsg["Quality"]).Value;
+      var coords = new DoubleMatrix(kspSolution.Count(x => x), 2);
+      int j = 0;
+      for (int i = 0; i < kspSolution.Length; i++) {
+        if (kspSolution[i]) {
+          coords[j, 0] = cities[i, 0];
+          coords[j, 1] = cities[i, 1];
+          j++;
+        }
+      }
+
+      // solve TSP
+      var tspConnectorPort = (IMessagePort)Ports["TSP Connector"];
+      var tspMsg = tspConnectorPort.PrepareMessage();
+      tspMsg["Coordinates"] = coords;
+      tspConnectorPort.SendMessage(tspMsg, e.Value2);
+      var tspSolution = (PathTSPTour)tspMsg["Best TSP Solution"];
+      var tspQuality = ((DoubleValue)tspMsg["BestQuality"]).Value;
+
+      // calculate transport costs
+      ((DoubleValue)kspMsg["Quality"]).Value = kspQuality - factor * tspQuality;
+      kspMsg["TransportCosts"] = new DoubleValue(factor * tspQuality);
+      kspMsg["Route"] = tspSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPControl", "A node of an optimization network which connects a KSP and a TSP.")]
+  [StorableClass]
+  public class KSPTSPControl : ProgrammableNode {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+    public object Locker = new object();
+
+    [Storable]
+    public List<BinaryVector> SelectedCities = new List<BinaryVector>();
+    [Storable]
+    public List<Permutation> PredefinedTrip = new List<Permutation>();
+
+    public AutoResetEvent TspWait = new AutoResetEvent(false);
+    public AutoResetEvent KspWait = new AutoResetEvent(false);
+
+    [Storable]
+    public DoubleMatrix Coordinates, Distances;
+    [Storable]
+    public IntArray CityValues, CityWeights;
+    [Storable]
+    public DoubleValue TransportCostFactor;
+    [Storable]
+    public IntValue CityLimit;
+
+    protected override string CodeTemplate {
+      get { return CodeResources.KSPTSPControlCode; }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPControl(bool deserializing) : base(deserializing) { }
+    protected KSPTSPControl(KSPTSPControl original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPControl() : base("KSPTSPControl") { }
+    public KSPTSPControl(string name) : base(name) { }
+    public KSPTSPControl(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPControl(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs	(revision 15895)
@@ -0,0 +1,224 @@
+#pragma warning disable 436
+
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPControl", "A node of an optimization network which connects a KSP and a TSP.")]
+  public class CompiledKSPTSPControl : ProgrammableNode.CompiledProgrammableNode {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+
+    new protected KSPTSPControl Context {
+      get { return (KSPTSPControl)base.Context; }
+    }
+
+    protected CompiledKSPTSPControl(CompiledKSPTSPControl original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPControl(ProgrammableNode context)
+      : base(context) {
+      if (Ports.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPControl(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      var configPort = new ConfigurationPort("Configure");
+      Ports.Add(configPort);
+
+      configPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") {
+        Type = PortParameterType.Input
+      });
+
+      var evalKspPort = new MessagePort("Evaluate KSP");
+      Ports.Add(evalKspPort);
+      evalKspPort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Input
+      });
+      evalKspPort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Output
+      });
+
+      var evalTspPort = new MessagePort("Evaluate TSP");
+      Ports.Add(evalTspPort);
+      evalTspPort.Parameters.Add(new PortParameter<Permutation>("TSPTour") {
+        Type = PortParameterType.Input
+      });
+      evalTspPort.Parameters.Add(new PortParameter<DoubleValue>("TSPTourLength") {
+        Type = PortParameterType.Output
+      });
+
+      var addKspSolultionPort = new MessagePort("Add KSP Solution");
+      Ports.Add(addKspSolultionPort);
+      addKspSolultionPort.Parameters.Add(new PortParameter<KnapsackSolution>("BestSolution") {
+        Type = PortParameterType.Input
+      });
+
+      var addTspSolutionPort = new MessagePort("Add TSP Solution");
+      Ports.Add(addTspSolutionPort);
+      addTspSolutionPort.Parameters.Add(new PortParameter<PathTSPTour>("BestSolution") {
+        Type = PortParameterType.Input
+      });
+    }
+
+    private void AddKspSolultionPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var cities = (KnapsackSolution)(e.Value.Values["BestSolution"]).Value;
+      AddSelectedCities(cities.BinaryVector);
+    }
+
+    private void AddTspSolutionPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var trip = (PathTSPTour)(e.Value.Values["BestSolution"]).Value;
+      AddPredefinedTrip(trip.Permutation);
+    }
+
+    private void ConfigPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Context.TransportCostFactor = (DoubleValue)(e.Value["TransportCostsFactor"]);
+      Context.Coordinates = (DoubleMatrix)(e.Value["Coordinates"]);
+      Context.Distances = CalculateEuclidean(Context.Coordinates);
+      Context.CityValues = (IntArray)(e.Value["Values"]);
+      Context.CityWeights = (IntArray)(e.Value["Weights"]);
+      Context.CityLimit = (IntValue)(e.Value["KnapsackCapacity"]);
+    }
+
+    private void EvalKspPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var cities = (BinaryVector)(e.Value.Values["KnapsackSolution"]).Value;
+      e.Value.Values["Quality"].Value = new DoubleValue(EvaluatePredefinedTrip(cities));
+    }
+
+    private void EvalTspPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var trip = (Permutation)(e.Value.Values["TSPTour"]).Value;
+      e.Value.Values["TSPTourLength"].Value = new DoubleValue(EvaluateSelectedCities(trip));
+    }
+
+    public override void RegisterEvents() {
+      base.RegisterEvents();
+      ((IMessagePort)Ports["Configure"]).MessageReceived += ConfigPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate KSP"]).MessageReceived += EvalKspPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate TSP"]).MessageReceived += EvalTspPortOnMessageReceived;
+      ((IMessagePort)Ports["Add KSP Solution"]).MessageReceived += AddKspSolultionPortOnMessageReceived;
+      ((IMessagePort)Ports["Add TSP Solution"]).MessageReceived += AddTspSolutionPortOnMessageReceived;
+
+    }
+    public override void DeregisterEvents() {
+      ((IMessagePort)Ports["Configure"]).MessageReceived -= ConfigPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate KSP"]).MessageReceived -= EvalKspPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate TSP"]).MessageReceived -= EvalTspPortOnMessageReceived;
+      ((IMessagePort)Ports["Add KSP Solution"]).MessageReceived -= AddKspSolultionPortOnMessageReceived;
+      ((IMessagePort)Ports["Add TSP Solution"]).MessageReceived -= AddTspSolutionPortOnMessageReceived;
+      base.DeregisterEvents();
+    }
+
+    public double EvaluatePredefinedTrip(BinaryVector cities) {
+      if (Context.SelectedCities.Count == 0) {
+        Context.SelectedCities.Add(cities);
+        Context.KspWait.Set();
+        Context.TspWait.WaitOne();
+      }
+      return EvaluateBoth(cities, Context.PredefinedTrip.Last());
+    }
+
+    public double EvaluateSelectedCities(Permutation trip) {
+      if (Context.PredefinedTrip.Count == 0) {
+        Context.PredefinedTrip.Add(trip);
+        Context.TspWait.Set();
+        Context.KspWait.WaitOne();
+      }
+      return EvaluateBoth(Context.SelectedCities.Last(), trip);
+    }
+
+    public double EvaluateBoth(BinaryVector cities, Permutation trip) {
+      var cityValues = cities.Select((v, i) => v ? Context.CityValues[i] : 0).Sum();
+      var cityWeights = cities.Select((v, i) => v ? Context.CityWeights[i] : 0).Sum();
+      var subtour = trip.Where(x => cities[x]).ToArray();
+      var tourLength = 0.0;
+      for (var i = 1; i < subtour.Length; i++)
+        tourLength += Context.Distances[subtour[i - 1], subtour[i]];
+      tourLength += Context.Distances[subtour.Last(), subtour[0]];
+      if (cityWeights > Context.CityLimit.Value) // infeasible solution
+        return Context.CityLimit.Value - cityWeights - tourLength * Context.TransportCostFactor.Value;
+      return cityValues - tourLength * Context.TransportCostFactor.Value;
+    }
+
+    public void AddPredefinedTrip(Permutation trip) {
+      Context.TspWait.Set();
+      Context.KspWait.WaitOne();
+      lock (Context.Locker) {
+        Context.PredefinedTrip.Add(trip);
+      }
+    }
+
+    public void AddSelectedCities(BinaryVector cities) {
+      Context.KspWait.Set();
+      Context.TspWait.WaitOne();
+      lock (Context.Locker) {
+        Context.SelectedCities.Add(cities);
+      }
+    }
+
+    public static DoubleMatrix CalculateEuclidean(DoubleMatrix cities) {
+      var len = cities.Rows;
+      var distances = new DoubleMatrix(len, len);
+      for (var i = 0; i < len - 1; i++) {
+        var sX = cities[i, 0];
+        var sY = cities[i, 1];
+        for (var j = i + 1; j < len; j++) {
+          var tX = cities[j, 0];
+          var tY = cities[j, 1];
+          distances[i, j] = Math.Sqrt((sX - tX) * (sX - tX) + (sY - tY) * (sY - tY));
+          distances[j, i] = distances[i, j];
+        }
+      }
+      return distances;
+    }
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetwork.cs	(revision 15895)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPNetwork", "An optimization network which contains a KSP and a TSP.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public class KSPTSPNetwork : ProgrammableNetwork {
+    protected override string CodeTemplate {
+      get { return CodeResources.KSPTSPNetworkCode; }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPNetwork(bool deserializing) : base(deserializing) { }
+    protected KSPTSPNetwork(KSPTSPNetwork original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPNetwork() : base("KSPTSPNetwork") { }
+    public KSPTSPNetwork(string name) : base(name) { }
+    public KSPTSPNetwork(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPNetwork(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs	(revision 15895)
@@ -0,0 +1,180 @@
+#pragma warning disable 436
+
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+using System.Linq;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPNetwork", "An optimization network which contains a KSP and a TSP.")]
+  public class CompiledKSPTSPNetwork : ProgrammableNetwork.CompiledProgrammableNetwork {
+    protected CompiledKSPTSPNetwork(CompiledKSPTSPNetwork original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPNetwork(ProgrammableNetwork context)
+      : base(context) {
+      if (Nodes.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPNetwork(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+
+      #region ParametersNode
+      var paramsNode = new UserDefinedNode("ParametersNode");
+      Nodes.Add(paramsNode);
+
+      var paramsPort = new MessagePort("Parameters");
+      paramsNode.Ports.Add(paramsPort);
+
+      paramsPort.Parameters.Add(new PortParameter<DoubleMatrix>("Cities") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleMatrix(new double[,] {
+          {00, 00}, {10, 00}, {20, 00}, {30, 00}, {40, 00}, 
+          {00, 10}, {10, 10}, {20, 10}, {30, 10}, {40, 10}, 
+          {00, 20}, {10, 20}, {20, 20}, {30, 20}, {40, 20}, 
+          {00, 30}, {10, 30}, {20, 30}, {30, 30}, {40, 30}, 
+          {00, 40}, {10, 40}, {20, 40}, {30, 40}, {40, 40}
+        })
+      });
+      paramsPort.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleValue(0.1)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntValue(10)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 })
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 })
+      });
+      #endregion
+
+      #region KSPNode
+      var kspNode = new AlgorithmNode("KSPNode");
+      Nodes.Add(kspNode);
+
+      var configPort = new ConfigurationPort("ConfigureKSP");
+      kspNode.Ports.Add(configPort);
+
+      configPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Input
+      });
+
+      var evaluatePort = new MessagePort("EvaluateRoute");
+      kspNode.Ports.Add(evaluatePort);
+
+      evaluatePort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Output
+      });
+      evaluatePort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Output | PortParameterType.Input
+      });
+      evaluatePort.Parameters.Add(new PortParameter<DoubleValue>("TransportCosts") {
+        Type = PortParameterType.Input
+      });
+      evaluatePort.Parameters.Add(new PortParameter<PathTSPTour>("Route") {
+        Type = PortParameterType.Input
+      });
+
+      var kspGA = new GeneticAlgorithm();
+      kspGA.Problem = new KnapsackProblem();
+      ((KnapsackProblem)kspGA.Problem).Penalty.Value = 100;
+      kspGA.MaximumGenerations.Value = 50;
+      kspGA.PopulationSize.Value = 10;
+      kspGA.Mutator = kspGA.MutatorParameter.ValidValues.Where(x => x.Name == "SinglePositionBitflipManipulator").First();
+      kspNode.Algorithm = kspGA;
+
+      var hook = new HookOperator();
+      hook.Parameters.Add(new LookupParameter<BinaryVector>("KnapsackSolution") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("TransportCosts") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<PathTSPTour>("Route") { Hidden = false });
+      ((FixedValueParameter<OperatorList>)kspGA.Problem.Evaluator.Parameters["AfterExecutionOperators"]).Value.Add(hook);
+      #endregion
+
+      #region TSPNode
+      var tspNode = new AlgorithmNode("TSPNode");
+      Nodes.Add(tspNode);
+
+      var executePort = new ExecutionPort("Execute");
+      tspNode.Ports.Add(executePort);
+
+      executePort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+      executePort.Parameters.Add(new PortParameter<DoubleValue>("BestQuality") {
+        Type = PortParameterType.Output
+      });
+      executePort.Parameters.Add(new PortParameter<PathTSPTour>("Best TSP Solution") {
+        Type = PortParameterType.Output
+      });
+
+      var tspGA = new GeneticAlgorithm();
+      tspGA.Problem = new TravelingSalesmanProblem();
+      tspGA.MaximumGenerations.Value = 100;
+      tspGA.PopulationSize.Value = 50;
+      tspGA.Mutator = tspGA.MutatorParameter.ValidValues.Where(x => x.Name == "InversionManipulator").First();
+      tspNode.Algorithm = tspGA;
+      #endregion
+
+      #region KSPTSPConnector
+      var ksptspConnector = (INode)new KSPTSPConnector();
+      Nodes.Add(ksptspConnector);
+      #endregion
+
+      #region Wire Ports
+      hook.Port = evaluatePort;
+      configPort.ConnectedPort = paramsPort;
+      evaluatePort.ConnectedPort = (IMessagePort)ksptspConnector.Ports["KSP Connector"];
+      ((IMessagePort)ksptspConnector.Ports["Parameters"]).ConnectedPort = paramsPort;
+      ((IMessagePort)ksptspConnector.Ports["TSP Connector"]).ConnectedPort = executePort;
+
+      paramsPort.SendMessage(paramsPort.PrepareMessage());
+      #endregion
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/HookOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/HookOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/HookOperator.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Linq;
+
+namespace HeuristicLab.Operators {
+  [Item("HookOperator", "An operator which interacts with an optimization network port.")]
+  [StorableClass]
+  public class HookOperator : Operator, IHookOperator {
+    public new ParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [Storable]
+    protected IMessagePort port;
+    public IMessagePort Port {
+      get { return port; }
+      set {
+        if (port != value) {
+          port = value;
+          OnPortChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    protected HookOperator(bool deserializing) : base(deserializing) { }
+    protected HookOperator(HookOperator original, Cloner cloner)
+      : base(original, cloner) {
+      port = cloner.Clone(original.port);
+    }
+    public HookOperator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HookOperator(this, cloner);
+    }
+
+    public event EventHandler PortChanged;
+    protected virtual void OnPortChanged() {
+      var handler = PortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public override IOperation Apply() {
+      if (Port != null) {
+        var msg = Port.PrepareMessage();
+        foreach (var output in Port.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Output))) {
+          IParameter param;
+          if (Parameters.TryGetValue(output.Name, out param)) {
+            msg[output.Name] = param.ActualValue;
+          } else if (output.DefaultValue == null) {
+            throw new InvalidOperationException(string.Format("Cannot determine value for output parameter \"{0}\".", output.Name));
+          }
+        }
+
+        Port.SendMessage(msg, CancellationToken);
+
+        foreach (var input in Port.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
+          IParameter param;
+          if (Parameters.TryGetValue(input.Name, out param)) {
+            param.ActualValue = msg[input.Name];
+          } else {
+            throw new InvalidOperationException(string.Format("Cannot find operator parameter for input parameter \"{0}\".", input.Name));
+          }
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/IHookOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/IHookOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Operators/IHookOperator.cs	(revision 15895)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using System;
+
+namespace HeuristicLab.Operators {
+  public interface IHookOperator : IOperator {
+    new ParameterCollection Parameters { get; }
+    IMessagePort Port { get; set; }
+
+    event EventHandler PortChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Networks {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Networks plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Networks", "3.3.11.$WCREV$")]
+  [PluginFile("HeuristicLab.Networks-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Algorithms.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Algorithms.GeneticAlgorithm", "3.3")]
+  [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.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Binary", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances.DataAnalysis", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Knapsack", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.TravelingSalesman", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public class HeuristicLabNetworksPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetwork.cs	(revision 15895)
@@ -0,0 +1,26 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Programmable {
+  public interface IProgrammableNetwork : IProgrammableNode, INetwork { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetworkItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetworkItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNetworkItem.cs	(revision 15895)
@@ -0,0 +1,27 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Scripting;
+
+namespace HeuristicLab.Networks.Programmable {
+  public interface IProgrammableNetworkItem : INetworkItem, IProgrammableItem { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IProgrammableNode.cs	(revision 15895)
@@ -0,0 +1,26 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Programmable {
+  public interface IProgrammableNode : IProgrammableNetworkItem, INode { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNetwork.cs	(revision 15895)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Programmable {
+  public interface IUserDefinedNetwork : IProgrammableNetwork {
+    new PortCollection Ports { get; }
+    new NodeCollection Nodes { get; }
+
+    void Initialize();
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/IUserDefinedNode.cs	(revision 15895)
@@ -0,0 +1,30 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core.Networks;
+
+namespace HeuristicLab.Networks.Programmable {
+  public interface IUserDefinedNode : IProgrammableNode {
+    new PortCollection Ports { get; }
+
+    void Initialize();
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetwork.cs	(revision 15895)
@@ -0,0 +1,168 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("ProgrammableNetwork", "Abstract base class for programmable networks.")]
+  [StorableClass]
+  public abstract class ProgrammableNetwork : ProgrammableNode, IProgrammableNetwork, IStorableContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    #region IStorableContent Members
+    public string Filename { get; set; }
+    #endregion
+
+    #region Network Members
+    [Storable]
+    private NodeCollection nodes;
+    protected NodeCollection Nodes {
+      get { return CompiledNetworkItem.Nodes; }
+    }
+    private ReadOnlyKeyedItemCollection<string, INode> readOnlyNodes;
+    IKeyedItemCollection<string, INode> INetwork.Nodes {
+      get {
+        if (readOnlyNodes == null) readOnlyNodes = Nodes.AsReadOnly();
+        return readOnlyNodes;
+      }
+    }
+    #endregion
+
+    protected override string CodeTemplate {
+      get { return CodeResources.ProgrammableNetworkCode; }
+    }
+
+    new protected CompiledProgrammableNetwork CompiledNetworkItem {
+      get { return (CompiledProgrammableNetwork)base.CompiledNetworkItem; }
+    }
+
+    [StorableConstructor]
+    protected ProgrammableNetwork(bool deserializing) : base(deserializing) { }
+    protected ProgrammableNetwork(ProgrammableNetwork original, Cloner cloner)
+      : base(original, cloner) {
+      // nodes are cloned in CompiledProgrammableNetwork
+      readOnlyNodes = null;
+    }
+    protected ProgrammableNetwork()
+      : base("ProgrammableNetwork") {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+    }
+    protected ProgrammableNetwork(string name)
+      : base(name) {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+    }
+    protected ProgrammableNetwork(string name, string description)
+      : base(name, description) {
+      nodes = new NodeCollection();
+      readOnlyNodes = null;
+    }
+
+    #region CompiledProgrammableNetwork
+    [Item("CompiledProgrammableNetwork", "Abstract base class for compiled programmable networks.")]
+    public abstract class CompiledProgrammableNetwork : CompiledProgrammableNode, INetwork {
+      public static new Image StaticItemImage {
+        get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+      }
+
+      #region Network Members
+      public override IEnumerable<INetworkItem> Children {
+        get { return base.Children.Concat(Nodes.AsEnumerable<INetworkItem>()); }
+      }
+
+      public NodeCollection Nodes {
+        get { return Context.nodes; }
+      }
+      IKeyedItemCollection<string, INode> INetwork.Nodes {
+        get { return Nodes; }
+      }
+      #endregion
+
+      new protected ProgrammableNetwork Context {
+        get { return (ProgrammableNetwork)base.Context; }
+      }
+
+      protected CompiledProgrammableNetwork(CompiledProgrammableNetwork original, Cloner cloner)
+        : base(original, cloner) {
+        Context.nodes = cloner.Clone(original.Context.nodes);
+      }
+      protected CompiledProgrammableNetwork(ProgrammableNetwork context)
+        : base(context) {
+      }
+
+      public override void Initialize() {
+        base.Initialize();
+        Nodes.Clear();
+      }
+
+      #region Events
+      public override void RegisterEvents() {
+        base.RegisterEvents();
+        Nodes.ItemsAdded += Nodes_ItemsAdded;
+        Nodes.ItemsRemoved += Nodes_ItemsRemoved;
+        Nodes.ItemsReplaced += Nodes_ItemsReplaced;
+        Nodes.CollectionReset += Nodes_CollectionReset;
+        foreach (var n in Nodes.ToList())
+          n.Parent = this;
+      }
+      public override void DeregisterEvents() {
+        foreach (var n in Nodes)
+          n.Parent = null;
+        Nodes.ItemsAdded -= Nodes_ItemsAdded;
+        Nodes.ItemsRemoved -= Nodes_ItemsRemoved;
+        Nodes.ItemsReplaced -= Nodes_ItemsReplaced;
+        Nodes.CollectionReset -= Nodes_CollectionReset;
+        base.DeregisterEvents();
+      }
+      protected virtual void Nodes_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+        foreach (var n in e.Items)
+          n.Parent = this;
+      }
+      protected virtual void Nodes_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+        foreach (var n in e.Items)
+          n.Parent = null;
+      }
+      protected virtual void Nodes_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+        foreach (var n in e.OldItems)
+          n.Parent = null;
+        foreach (var n in e.Items)
+          n.Parent = this;
+      }
+      protected virtual void Nodes_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+        foreach (var n in e.OldItems)
+          n.Parent = null;
+        foreach (var n in e.Items)
+          n.Parent = this;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkCode.cs	(revision 15895)
@@ -0,0 +1,37 @@
+#pragma warning disable 436
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using System;
+using System.Threading;
+
+#region How to use the variable store?
+// use "Vars" to access variables in the variable store (e.g. Vars.x = 5)
+// use "Vars[string]" to access variables using runtime strings (e.g. Vars["x"] = 5)
+// use "Vars.Contains(string)" to check if a variable exists
+// use "Vars.Clear()" to remove all variables
+// use "foreach (KeyValuePair<string, object> v in Vars) { ... }" to iterate over all variables
+// use "Variables" to work with IEnumerable<T> extension methods on the variable store
+#endregion
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("MyProgrammableNetwork", "A programmable network.")]
+  public class MyProgrammableNetwork : ProgrammableNetwork.CompiledProgrammableNetwork {
+    protected MyProgrammableNetwork(MyProgrammableNetwork original, Cloner cloner) : base(original, cloner) { }
+    public MyProgrammableNetwork(ProgrammableNetwork context) : base(context) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MyProgrammableNetwork(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      // implement initialization here
+    }
+
+    protected override void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) {
+      // implement processing of messages here
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItem.cs	(revision 15895)
@@ -0,0 +1,410 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Scripting;
+using Microsoft.CSharp;
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("ProgrammableNetworkItem", "Abstract base class for programmable items of a network.")]
+  [StorableClass]
+  public abstract class ProgrammableNetworkItem : Item, IProgrammableNetworkItem {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+    }
+
+    #region Item Members
+    public override string ItemName {
+      get { return CompiledNetworkItem.ItemName; }
+    }
+    public override string ItemDescription {
+      get { return CompiledNetworkItem.ItemDescription; }
+    }
+    public override Image ItemImage {
+      get { return CompiledNetworkItem.ItemImage; }
+    }
+    #endregion
+
+    #region NamedItem Members
+    [Storable]
+    private string name;
+    public string Name {
+      get { return CompiledNetworkItem.Name; }
+      set { CompiledNetworkItem.Name = value; }
+    }
+    public bool CanChangeName {
+      get { return CompiledNetworkItem.CanChangeName; }
+    }
+    [Storable]
+    private string description;
+    public string Description {
+      get { return CompiledNetworkItem.Description; }
+      set { CompiledNetworkItem.Description = value; }
+    }
+    public virtual bool CanChangeDescription {
+      get { return CompiledNetworkItem.CanChangeDescription; }
+    }
+    public event EventHandler<CancelEventArgs<string>> NameChanging;
+    private void OnNameChanging(CancelEventArgs<string> e) {
+      var handler = NameChanging;
+      if (handler != null) handler(this, e);
+    }
+    public event EventHandler NameChanged;
+    private void OnNameChanged() {
+      var handler = NameChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler DescriptionChanged;
+    private void OnDescriptionChanged() {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region NetworkItem Members
+    public INetworkItem Parent {
+      get { return CompiledNetworkItem.Parent; }
+    }
+    public IEnumerable<INetworkItem> Children {
+      get { return CompiledNetworkItem.Children; }
+    }
+
+    [Storable]
+    public IVisualProperties VisualProperties { get; set; }
+    #endregion
+
+    protected virtual string CodeTemplate {
+      get { return CodeResources.ProgrammableNetworkItemCode; }
+    }
+    [Storable]
+    private string code;
+    public string Code {
+      get { return code; }
+      set {
+        if (!CanChangeCode) throw new NotSupportedException("Code cannot be changed.");
+        if (value != code) {
+          code = value;
+          OnCodeChanged();
+        }
+      }
+    }
+    private CompilerErrorCollection compileErrors;
+    public CompilerErrorCollection CompileErrors {
+      get { return compileErrors; }
+      protected set {
+        compileErrors = value;
+        OnCompileErrorsChanged();
+      }
+    }
+    public virtual bool CanChangeCode {
+      get { return false; }
+    }
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+
+    private Type compiledNetworkItemType;
+    private CompiledProgrammableNetworkItem compiledNetworkItem;
+    protected CompiledProgrammableNetworkItem CompiledNetworkItem {
+      get {
+        if (compiledNetworkItem == null)
+          CompiledNetworkItem = (CompiledProgrammableNetworkItem)Activator.CreateInstance(compiledNetworkItemType, this);
+        return compiledNetworkItem;
+      }
+      private set {
+        if (compiledNetworkItem != value) {
+          if (compiledNetworkItem != null) {
+            DeregisterCompiledNetworkItemEvents();
+            compiledNetworkItem.DeregisterEvents();
+          }
+          compiledNetworkItem = value;
+          if (compiledNetworkItem != null) {
+            RegisterCompiledNetworkItemEvents();
+            compiledNetworkItem.RegisterEvents();
+          }
+          OnToStringChanged();
+          OnItemImageChanged();
+          OnNameChanged();
+          OnDescriptionChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    protected ProgrammableNetworkItem(bool deserializing) : base(deserializing) { }
+    protected ProgrammableNetworkItem(ProgrammableNetworkItem original, Cloner cloner)
+      : base(original, cloner) {
+      // name and description are cloned in CompiledProgrammableNetworkItem
+      code = original.code;
+      if (original.compileErrors != null)
+        compileErrors = new CompilerErrorCollection(original.compileErrors);
+      variableStore = cloner.Clone(original.variableStore);
+      CompiledNetworkItem = cloner.Clone(original.compiledNetworkItem);
+      VisualProperties = cloner.Clone(original.VisualProperties);
+    }
+    protected ProgrammableNetworkItem()
+      : base() {
+      name = "ProgrammableNetworkItem";
+      description = string.Empty;
+      code = CodeTemplate;
+      variableStore = new VariableStore();
+      Compile();
+    }
+    protected ProgrammableNetworkItem(string name)
+      : base() {
+      this.name = string.IsNullOrEmpty(name) ? string.Empty : name;
+      description = string.Empty;
+      code = CodeTemplate;
+      variableStore = new VariableStore();
+      Compile();
+    }
+    protected ProgrammableNetworkItem(string name, string description)
+      : base() {
+      this.name = string.IsNullOrEmpty(name) ? string.Empty : name;
+      this.description = string.IsNullOrEmpty(description) ? string.Empty : description;
+      code = CodeTemplate;
+      variableStore = new VariableStore();
+      Compile();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Compile();
+    }
+
+    public override string ToString() {
+      return CompiledNetworkItem.ToString();
+    }
+
+    #region Compilation
+    public virtual void Compile() {
+      var codeProvider = new CSharpCodeProvider(
+        new Dictionary<string, string> {
+          {"CompilerVersion", "v4.0"}, // support C# 4.0 syntax
+        }
+      );
+      var compilerParams = new CompilerParameters {
+        GenerateExecutable = false,
+        GenerateInMemory = true,
+        IncludeDebugInformation = true,
+        WarningLevel = 4
+      };
+      compilerParams.ReferencedAssemblies.AddRange(
+        GetAssemblies().Select(a => a.Location).ToArray()
+      );
+      var results = codeProvider.CompileAssemblyFromSource(compilerParams, code);
+      CompileErrors = results.Errors;
+      if (results.Errors.HasErrors) {
+        var sb = new StringBuilder();
+        foreach (CompilerError error in results.Errors) {
+          sb.Append(error.Line).Append(':')
+            .Append(error.Column).Append(": ")
+            .AppendLine(error.ErrorText);
+        }
+        throw new InvalidOperationException(string.Format("Compilation of \"{0}\" failed:{1}{2}",
+          Name, Environment.NewLine, sb.ToString()));
+      }
+      compiledNetworkItemType = results.CompiledAssembly.GetTypes()
+          .Single(x => typeof(CompiledProgrammableNetworkItem).IsAssignableFrom(x));
+      CompiledNetworkItem = null;
+    }
+    public virtual IEnumerable<Assembly> GetAssemblies() {
+      var assemblies = AppDomain.CurrentDomain.GetAssemblies()
+        .Where(a => !a.IsDynamic && File.Exists(a.Location))
+        .ToList();
+      assemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly);  // for dlr functionality
+      return assemblies;
+    }
+    #endregion
+
+    public event EventHandler CodeChanged;
+    protected virtual void OnCodeChanged() {
+      var handler = CodeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler CompileErrorsChanged;
+    protected virtual void OnCompileErrorsChanged() {
+      var handler = CompileErrorsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region CompiledNetworkItem Events
+    protected virtual void RegisterCompiledNetworkItemEvents() {
+      CompiledNetworkItem.ToStringChanged += CompiledNetworkItem_ToStringChanged;
+      CompiledNetworkItem.ItemImageChanged += CompiledNetworkItem_ItemImageChanged;
+      CompiledNetworkItem.NameChanging += CompiledNetworkItem_NameChanging;
+      CompiledNetworkItem.NameChanged += CompiledNetworkItem_NameChanged;
+      CompiledNetworkItem.DescriptionChanged += CompiledNetworkItem_DescriptionChanged;
+    }
+    protected virtual void DeregisterCompiledNetworkItemEvents() {
+      CompiledNetworkItem.ToStringChanged -= CompiledNetworkItem_ToStringChanged;
+      CompiledNetworkItem.ItemImageChanged -= CompiledNetworkItem_ItemImageChanged;
+      CompiledNetworkItem.NameChanging -= CompiledNetworkItem_NameChanging;
+      CompiledNetworkItem.NameChanged -= CompiledNetworkItem_NameChanged;
+      CompiledNetworkItem.DescriptionChanged -= CompiledNetworkItem_DescriptionChanged;
+    }
+    private void CompiledNetworkItem_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    private void CompiledNetworkItem_ItemImageChanged(object sender, EventArgs e) {
+      OnItemImageChanged();
+    }
+    private void CompiledNetworkItem_NameChanging(object sender, CancelEventArgs<string> e) {
+      OnNameChanging(e);
+    }
+    private void CompiledNetworkItem_NameChanged(object sender, EventArgs e) {
+      OnNameChanged();
+    }
+    private void CompiledNetworkItem_DescriptionChanged(object sender, EventArgs e) {
+      OnDescriptionChanged();
+    }
+    #endregion
+
+    #region CompiledProgrammableNetworkItem
+    [Item("CompiledProgrammableNetworkItem", "Abstract base class for compiled programmable items of a network.")]
+    public abstract class CompiledProgrammableNetworkItem : Item, INetworkItem {
+      public static new Image StaticItemImage {
+        get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+      }
+
+      #region NamedItem Members
+      public string Name {
+        get { return Context.name; }
+        set {
+          if (!CanChangeName) throw new NotSupportedException("Name cannot be changed.");
+          if (!(Context.name.Equals(value) || (value == null) && (Context.name == string.Empty))) {
+            CancelEventArgs<string> e = value == null ? new CancelEventArgs<string>(string.Empty) : new CancelEventArgs<string>(value);
+            OnNameChanging(e);
+            if (!e.Cancel) {
+              Context.name = value == null ? string.Empty : value;
+              OnNameChanged();
+            }
+          }
+        }
+      }
+      public virtual bool CanChangeName {
+        get { return true; }
+      }
+      public string Description {
+        get { return Context.description; }
+        set {
+          if (!CanChangeDescription) throw new NotSupportedException("Description cannot be changed.");
+          if (!(Context.description.Equals(value) || (value == null) && (Context.description == string.Empty))) {
+            Context.description = value == null ? string.Empty : value;
+            OnDescriptionChanged();
+          }
+        }
+      }
+      public virtual bool CanChangeDescription {
+        get { return true; }
+      }
+
+      public event EventHandler<CancelEventArgs<string>> NameChanging;
+      protected virtual void OnNameChanging(CancelEventArgs<string> e) {
+        var handler = NameChanging;
+        if (handler != null) handler(this, e);
+      }
+      public event EventHandler NameChanged;
+      protected virtual void OnNameChanged() {
+        var handler = NameChanged;
+        if (handler != null) handler(this, EventArgs.Empty);
+        OnToStringChanged();
+      }
+      public event EventHandler DescriptionChanged;
+      protected virtual void OnDescriptionChanged() {
+        var handler = DescriptionChanged;
+        if (handler != null) handler(this, EventArgs.Empty);
+      }
+      #endregion
+
+      #region NetworkItem Members
+      private INetworkItem parent;
+      public INetworkItem Parent {
+        get { return parent; }
+        protected set {
+          if (value != parent) {
+            parent = value;
+          }
+        }
+      }
+      public virtual IEnumerable<INetworkItem> Children {
+        get { return Enumerable.Empty<INetworkItem>(); }
+      }
+
+      // TODO: no visual properties needed here
+      public IVisualProperties VisualProperties {
+        get { return Context.VisualProperties; }
+        set { Context.VisualProperties = value; }
+      }
+      #endregion
+
+      protected ProgrammableNetworkItem Context { get; private set; }
+      private Variables variables;
+      protected Variables Variables {
+        get {
+          if (variables == null) variables = new Variables(Context.variableStore);
+          return variables;
+        }
+      }
+      protected dynamic Vars {
+        get { return Variables; }
+      }
+
+      protected CompiledProgrammableNetworkItem(CompiledProgrammableNetworkItem original, Cloner cloner)
+        : base(original, cloner) {
+        Context = cloner.Clone(original.Context);
+        Context.name = original.Context.name;
+        Context.description = original.Context.description;
+      }
+      protected CompiledProgrammableNetworkItem(ProgrammableNetworkItem context)
+        : base() {
+        Context = context;
+      }
+
+      public virtual void Initialize() {
+        Variables.Clear();
+      }
+
+      public override string ToString() {
+        return Name;
+      }
+
+      #region Events
+      public virtual void RegisterEvents() { }
+      public virtual void DeregisterEvents() { }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItemCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItemCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNetworkItemCode.cs	(revision 15895)
@@ -0,0 +1,30 @@
+#pragma warning disable 436
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+#region How to use the variable store?
+// use "Vars" to access variables in the variable store (e.g. Vars.x = 5)
+// use "Vars[string]" to access variables using runtime strings (e.g. Vars["x"] = 5)
+// use "Vars.Contains(string)" to check if a variable exists
+// use "Vars.Clear()" to remove all variables
+// use "foreach (KeyValuePair<string, object> v in Vars) { ... }" to iterate over all variables
+// use "Variables" to work with IEnumerable<T> extension methods on the variable store
+#endregion
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("MyProgrammableNetworkItem", "A programmable item of a network.")]
+  public class MyProgrammableNetworkItem : ProgrammableNetworkItem.CompiledProgrammableNetworkItem {
+    protected MyProgrammableNetworkItem(MyProgrammableNetworkItem original, Cloner cloner) : base(original, cloner) { }
+    public MyProgrammableNetworkItem(ProgrammableNetworkItem context) : base(context) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MyProgrammableNetworkItem(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      // implement initialization here
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNode.cs	(revision 15895)
@@ -0,0 +1,214 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("ProgrammableNode", "Abstract base class for programmable nodes of a network.")]
+  [StorableClass]
+  public abstract class ProgrammableNode : ProgrammableNetworkItem, IProgrammableNode {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+
+    #region Node Members
+    new public INetwork Parent {
+      get { return CompiledNetworkItem.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the network which contains the node
+        CompiledNetworkItem.Parent = value;
+      }
+    }
+
+    [Storable]
+    private PortCollection ports;
+    protected PortCollection Ports {
+      get { return CompiledNetworkItem.Ports; }
+    }
+    private ReadOnlyKeyedItemCollection<string, IPort> readOnlyPorts;
+    IKeyedItemCollection<string, IPort> INode.Ports {
+      get {
+        if (readOnlyPorts == null) readOnlyPorts = Ports.AsReadOnly();
+        return readOnlyPorts;
+      }
+    }
+    #endregion
+
+    protected override string CodeTemplate {
+      get { return CodeResources.ProgrammableNodeCode; }
+    }
+
+    new protected CompiledProgrammableNode CompiledNetworkItem {
+      get { return (CompiledProgrammableNode)base.CompiledNetworkItem; }
+    }
+
+    [StorableConstructor]
+    protected ProgrammableNode(bool deserializing) : base(deserializing) { }
+    protected ProgrammableNode(ProgrammableNode original, Cloner cloner)
+      : base(original, cloner) {
+      // ports are cloned in CompiledProgrammableNode
+      readOnlyPorts = null;
+    }
+    protected ProgrammableNode()
+      : base("ProgrammableNode") {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+    }
+    protected ProgrammableNode(string name)
+      : base(name) {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+    }
+    protected ProgrammableNode(string name, string description)
+      : base(name, description) {
+      ports = new PortCollection();
+      readOnlyPorts = null;
+    }
+
+    #region CompiledProgrammableNode
+    [Item("CompiledProgrammableNode", "Abstract base class for compiled programmable nodes of a network.")]
+    public abstract class CompiledProgrammableNode : CompiledProgrammableNetworkItem, INode {
+      public static new Image StaticItemImage {
+        get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+      }
+
+      #region Node Members
+      new public INetwork Parent {
+        get { return (INetwork)base.Parent; }
+        set {
+          // NOTE: never call setter directly as the Parent property is set by the network which contains the node
+          base.Parent = value;
+        }
+      }
+      public override IEnumerable<INetworkItem> Children {
+        get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); }
+      }
+
+      public PortCollection Ports {
+        get { return Context.ports; }
+      }
+      IKeyedItemCollection<string, IPort> INode.Ports {
+        get { return Ports; }
+      }
+      #endregion
+
+      new protected ProgrammableNode Context {
+        get { return (ProgrammableNode)base.Context; }
+      }
+
+      protected CompiledProgrammableNode(CompiledProgrammableNode original, Cloner cloner)
+        : base(original, cloner) {
+        Context.ports = cloner.Clone(original.Context.ports);
+      }
+      protected CompiledProgrammableNode(ProgrammableNode context)
+        : base(context) {
+      }
+
+      public override void Initialize() {
+        base.Initialize();
+        Ports.Clear();
+      }
+
+      private void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+        ProcessMessage(e.Value, (IMessagePort)sender, e.Value2);
+      }
+      protected virtual void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) { }
+
+      #region Events
+      public override void RegisterEvents() {
+        base.RegisterEvents();
+        Ports.ItemsAdded += Ports_ItemsAdded;
+        Ports.ItemsRemoved += Ports_ItemsRemoved;
+        Ports.ItemsReplaced += Ports_ItemsReplaced;
+        Ports.CollectionReset += Ports_CollectionReset;
+        foreach (var p in Ports) {
+          p.Parent = this;
+          RegisterPortEvents(p);
+        }
+      }
+      public override void DeregisterEvents() {
+        foreach (var p in Ports) {
+          DeregisterPortEvents(p);
+          p.Parent = null;
+        }
+        Ports.ItemsAdded -= Ports_ItemsAdded;
+        Ports.ItemsRemoved -= Ports_ItemsRemoved;
+        Ports.ItemsReplaced -= Ports_ItemsReplaced;
+        Ports.CollectionReset -= Ports_CollectionReset;
+        base.DeregisterEvents();
+      }
+      protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+        foreach (var p in e.Items) {
+          p.Parent = this;
+          RegisterPortEvents(p);
+        }
+      }
+      protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+        foreach (var p in e.Items) {
+          p.Parent = null;
+          DeregisterPortEvents(p);
+        }
+      }
+      protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+        foreach (var p in e.OldItems) {
+          p.Parent = null;
+          DeregisterPortEvents(p);
+        }
+        foreach (var p in e.Items) {
+          p.Parent = this;
+          RegisterPortEvents(p);
+        }
+      }
+      protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+        foreach (var p in e.OldItems) {
+          p.Parent = null;
+          DeregisterPortEvents(p);
+        }
+        foreach (var p in e.Items) {
+          p.Parent = this;
+          RegisterPortEvents(p);
+        }
+      }
+      #endregion
+
+      #region Port Events
+      protected virtual void RegisterPortEvents(IPort port) {
+        var mp = port as IMessagePort;
+        if (mp != null)
+          mp.MessageReceived += MessagePort_MessageReceived;
+      }
+      protected virtual void DeregisterPortEvents(IPort port) {
+        var mp = port as IMessagePort;
+        if (mp != null)
+          mp.MessageReceived -= MessagePort_MessageReceived;
+      }
+      #endregion
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNodeCode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNodeCode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/ProgrammableNodeCode.cs	(revision 15895)
@@ -0,0 +1,37 @@
+#pragma warning disable 436
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using System;
+using System.Threading;
+
+#region How to use the variable store?
+// use "Vars" to access variables in the variable store (e.g. Vars.x = 5)
+// use "Vars[string]" to access variables using runtime strings (e.g. Vars["x"] = 5)
+// use "Vars.Contains(string)" to check if a variable exists
+// use "Vars.Clear()" to remove all variables
+// use "foreach (KeyValuePair<string, object> v in Vars) { ... }" to iterate over all variables
+// use "Variables" to work with IEnumerable<T> extension methods on the variable store
+#endregion
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("MyProgrammableNode", "A programmable node of a network.")]
+  public class MyProgrammableNode : ProgrammableNode.CompiledProgrammableNode {
+    protected MyProgrammableNode(MyProgrammableNode original, Cloner cloner) : base(original, cloner) { }
+    public MyProgrammableNode(ProgrammableNode context) : base(context) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MyProgrammableNode(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      // implement initialization here
+    }
+
+    protected override void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) {
+      // implement processing of messages here
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNetwork.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNetwork.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNetwork.cs	(revision 15895)
@@ -0,0 +1,64 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Drawing;
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("User-Defined Network", "A network which can be defined and programmed by the user.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public sealed class UserDefinedNetwork : ProgrammableNetwork, IUserDefinedNetwork {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Script; }
+    }
+
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+    new public NodeCollection Nodes {
+      get { return base.Nodes; }
+    }
+    public override bool CanChangeCode {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private UserDefinedNetwork(bool deserializing) : base(deserializing) { }
+    private UserDefinedNetwork(UserDefinedNetwork original, Cloner cloner) : base(original, cloner) { }
+    public UserDefinedNetwork() : base("UserDefinedNetwork") { }
+    public UserDefinedNetwork(string name) : base(name) { }
+    public UserDefinedNetwork(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserDefinedNetwork(this, cloner);
+    }
+
+    public void Initialize() {
+      CompiledNetworkItem.DeregisterEvents();
+      CompiledNetworkItem.Initialize();
+      CompiledNetworkItem.RegisterEvents();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNode.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNode.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Programmable/UserDefinedNode.cs	(revision 15895)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Drawing;
+
+namespace HeuristicLab.Networks.Programmable {
+  [Item("User-Defined Node", "A node of a network which can be defined and programmed by the user.")]
+  [StorableClass]
+  public sealed class UserDefinedNode : ProgrammableNode, IUserDefinedNode {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Script; }
+    }
+
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+    public override bool CanChangeCode {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private UserDefinedNode(bool deserializing) : base(deserializing) { }
+    private UserDefinedNode(UserDefinedNode original, Cloner cloner) : base(original, cloner) { }
+    public UserDefinedNode() : base("UserDefinedNode") { }
+    public UserDefinedNode(string name) : base(name) { }
+    public UserDefinedNode(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserDefinedNode(this, cloner);
+    }
+
+    public void Initialize() {
+      CompiledNetworkItem.DeregisterEvents();
+      CompiledNetworkItem.Initialize();
+      CompiledNetworkItem.RegisterEvents();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+#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.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.Networks")]
+[assembly: AssemblyDescription("HeuristicLab optimization networks classes")]
+[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("82df0cfc-867b-404d-98e9-37a11ed97f4e")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.12.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Scripting/IProgrammableItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Scripting/IProgrammableItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/Scripting/IProgrammableItem.cs	(revision 15895)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace HeuristicLab.Scripting {
+  public interface IProgrammableItem : IItem {
+    string Code { get; set; }
+    CompilerErrorCollection CompileErrors { get; }
+    bool CanChangeCode { get; }
+    VariableStore VariableStore { get; }
+
+    void Compile();
+    IEnumerable<Assembly> GetAssemblies();
+
+    event EventHandler CodeChanged;
+    event EventHandler CompileErrorsChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/UserDefinedMessagePort.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/UserDefinedMessagePort.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Networks/3.3/UserDefinedMessagePort.cs	(revision 15895)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("User-Defined Message Port", "A message port of a network which can be defined by the user.")]
+  [StorableClass]
+  public class UserDefinedMessagePort : MessagePort, IUserDefinedMessagePort {
+    new public PortParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [StorableConstructor]
+    protected UserDefinedMessagePort(bool deserializing) : base(deserializing) { }
+    protected UserDefinedMessagePort(UserDefinedMessagePort original, Cloner cloner) : base(original, cloner) { }
+    public UserDefinedMessagePort() : base("UserDefinedMessagePort") { }
+    public UserDefinedMessagePort(string name) : base(name) { }
+    public UserDefinedMessagePort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserDefinedMessagePort(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPCplexSolver.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPCplexSolver.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPCplexSolver.cs	(revision 15895)
@@ -0,0 +1,152 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+using ILOG.CPLEX;
+using ILOG.OPL;
+
+namespace HeuristicLab.Problems.FacilityLocation.CplexSolver {
+  public enum FlpVariant { FLP_1, FLP_2 }
+
+  [Item("FLP CPLEX Solver", "Solves facility location problem (FLP) instances using CPLEX.")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms)]
+  [StorableClass]
+  public sealed class FLPCplexSolver : BasicAlgorithm {
+    public override bool SupportsPause {
+      get { return false; }
+    }
+
+    public override Type ProblemType {
+      get { return typeof(FacilityLocationProblem); }
+    }
+
+    public new FacilityLocationProblem Problem {
+      get { return (FacilityLocationProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+
+    [Storable]
+    private IFixedValueParameter<TimeSpanValue> maximumRuntimeParameter;
+    public IFixedValueParameter<TimeSpanValue> MaximumRuntimeParameter {
+      get { return maximumRuntimeParameter; }
+    }
+
+    public TimeSpan MaximumRuntime {
+      get { return maximumRuntimeParameter.Value.Value; }
+      set { maximumRuntimeParameter.Value.Value = value; }
+    }
+
+    [Storable]
+    private IFixedValueParameter<EnumValue<FlpVariant>> flpVariantParameter;
+    public IFixedValueParameter<EnumValue<FlpVariant>> FlpVariantParameter {
+      get { return flpVariantParameter; }
+    }
+
+    public FlpVariant FlpVariant {
+      get { return flpVariantParameter.Value.Value; }
+      set { flpVariantParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    private FLPCplexSolver(bool deserializing) : base(deserializing) { }
+    private FLPCplexSolver(FLPCplexSolver original, Cloner cloner)
+      : base(original, cloner) {
+      maximumRuntimeParameter = cloner.Clone(original.maximumRuntimeParameter);
+      flpVariantParameter = cloner.Clone(original.flpVariantParameter);
+    }
+    public FLPCplexSolver() {
+      Parameters.Add(maximumRuntimeParameter = new FixedValueParameter<TimeSpanValue>("Maximum Runtime", "Specifies how long CPLEX should be allowed to run.", new TimeSpanValue(TimeSpan.FromSeconds(60))));
+      Parameters.Add(flpVariantParameter = new FixedValueParameter<EnumValue<FlpVariant>>("FLP Variant", "Which FLP variant should be run.", new EnumValue<FlpVariant>(FlpVariant.FLP_1)));
+      Problem = new FacilityLocationProblem();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FLPCplexSolver(this, cloner);
+    }
+
+    protected override void Run(CancellationToken cancellationToken) {
+      var factory = new OplFactory();
+      var cplex = factory.CreateCplex();
+
+
+      var model = Assembly.GetExecutingAssembly().GetManifestResourceNames().SingleOrDefault(x => x.EndsWith(@"." + FlpVariant.ToString() + ".mod"));
+      var modelStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(model);
+
+      var depots = Problem.DepotCapacitiesParameter.Value.Length;
+      var customers = Problem.CustomerDemandsParameter.Value.Length;
+
+      using (var reader = new StreamReader(modelStream))
+      using (var modelSource = factory.CreateOplModelSourceFromString(reader.ReadToEnd(), Path.GetFileNameWithoutExtension(model)))
+      using (var errorHandler = factory.CreateOplErrorHandler())
+      using (var settings = factory.CreateOplSettings(errorHandler))
+      using (var def = factory.CreateOplModelDefinition(modelSource, settings))
+      using (var opl = factory.CreateOplModel(def, cplex))
+      using (var dataSource = new FLPDataSource(factory, Problem)) {
+        opl.AddDataSource(dataSource);
+        opl.Generate();
+        cplex.SetParam(Cplex.DoubleParam.TiLim, MaximumRuntimeParameter.Value.Value.TotalSeconds);
+        var solved = cplex.Solve();
+        var assignment = new IntegerVector(customers);
+        if (solved) {
+          Results.Add(new Result("BestQuality", new DoubleValue(cplex.ObjValue)));
+          Results.Add(new Result("Best Solution Optimal", new BoolValue(
+            opl.Cplex.GetCplexStatus().Equals(Cplex.CplexStatus.Optimal)
+            || opl.Cplex.GetCplexStatus().Equals(Cplex.CplexStatus.OptimalTol))));
+          Results.Add(new Result("Best Solution Feasible", new BoolValue(true)));
+
+          var sol = opl.GetElement(FLPDataSource.CustomerDepotAssignment).AsIntMap();
+
+          for (var i = 0; i < depots; i++) {
+            var solI = sol.GetSub(i);
+            for (var j = 0; j < customers; j++) {
+              var solIJ = solI.Get(j);
+              if (solIJ == 0) continue;
+              assignment[j] = i;
+            }
+          }
+        } else {
+          var demands = Problem.CustomerDemandsParameter.Value;
+          var capacities = Problem.DepotCapacitiesParameter.Value;
+
+          assignment.Randomize(new FastRandom(), 0, depots); // output a random solution
+
+          Results.Add(new Result("Best Solution Optimal", new BoolValue(false)));
+          var feasible = assignment.Select((v, i) => new { Demand = demands[i], Depot = v }).GroupBy(x => x.Depot, x => x.Demand).All(x => capacities[x.Key] <= x.Sum());
+          Results.Add(new Result("Best Solution Feasible", new BoolValue(feasible)));
+          Results.Add(new Result("BestQuality", new DoubleValue(Problem.Evaluate(assignment))));
+        }
+        Results.Add(new Result("Best Solution", assignment));
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPDataSource.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPDataSource.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLPDataSource.cs	(revision 15895)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Data;
+using ILOG.OPL;
+
+namespace HeuristicLab.Problems.FacilityLocation.CplexSolver {
+  public class FLPDataSource : CustomOplDataSource {
+    #region Inputs
+    public const string TotalDepots = "I";
+    public const string TotalCustomers = "J";
+    public const string OpeningCosts = "f";
+    public const string DepotCapacities = "s";
+    public const string CustomerDemands = "d";
+    public const string DeliveryCosts = "c";
+    #endregion
+    #region Variables
+    public const string CustomerDepotDeliverAmount = "x";
+    public const string DepotOpening = "y";
+    public const string CustomerDepotAssignment = "z";
+    #endregion
+
+    private FacilityLocationProblem problem;
+
+    public FLPDataSource(OplFactory factory, FacilityLocationProblem problem) : base(factory) {
+      this.problem = problem;
+    }
+
+    public override void CustomRead() {
+      NewElement(TotalDepots, () => Add(problem.DepotCapacitiesParameter.Value.Length));
+      NewElement(TotalCustomers, () => Add(problem.CustomerDemandsParameter.Value.Length));
+      NewElement(OpeningCosts, () => Add(problem.OpeningCostsParameter.Value));
+      NewElement(DepotCapacities, () => Add(problem.DepotCapacitiesParameter.Value));
+      NewElement(CustomerDemands, () => Add(problem.CustomerDemandsParameter.Value));
+      NewElement(DeliveryCosts, () => Add(problem.DeliveryCostsParameter.Value));
+    }
+
+    protected void NewElement(string name, Action add) {
+      DataHandler.StartElement(name);
+      add();
+      DataHandler.EndElement();
+    }
+    protected void Add(int value) {
+      DataHandler.AddIntItem(value);
+    }
+    protected void Add(double value) {
+      DataHandler.AddNumItem(value);
+    }
+    protected void Add(DoubleArray values) {
+      DataHandler.StartArray();
+      foreach (double value in values) {
+        DataHandler.AddNumItem(value);
+      }
+      DataHandler.EndArray();
+    }
+    protected void Add(DoubleMatrix values) {
+      DataHandler.StartArray();
+      for (var i = 0; i < values.Rows; i++) {
+        DataHandler.StartArray();
+        for (var j = 0; j < values.Columns; j++) {
+          Add(values[i, j]);
+        }
+        DataHandler.EndArray();
+      }
+      DataHandler.EndArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_1.mod
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_1.mod	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_1.mod	(revision 15895)
@@ -0,0 +1,45 @@
+﻿//Capacitated Facility Location Problem:
+ 
+int I = ...;
+int J = ...;
+float f[0..(I-1)] = ...;				//Kosten Depot i
+float s[0..(I-1)] = ...;				//KAP Depot i
+float d[0..(J-1)] = ...;				//Bedarf Kunde j
+float c[0..(I-1)][0..(J-1)] = ...;		//Wegkosten von i nach j
+
+range RI = 0..(I-1);
+range RJ = 0..(J-1);
+ 
+dvar float+ x[0..(I-1)][0..(J-1)];		//Transportmenge
+dvar boolean y[0..(I-1)];				//Eröffnung Depot i
+dvar boolean z[0..(I-1)][0..(J-1)];		//Depot i beliefert Kunde j
+
+execute
+ {
+ 	cplex.threads=1;
+ }
+
+minimize
+( sum ( i in 0..(I-1), j in 0..(J-1) ) ( c[i][j] * x[i][j] ) + sum ( i in 0..(I-1) ) ( f[i] * y[i] ) );
+
+
+subject to 
+{
+	//Für jedes Depot gilt: Ausliefermenge x kann maximal so groß sein wie Depot-KAP y
+	forall ( i in 0..(I-1) ) 
+		sum ( j in 0..(J-1) ) ( x[i][j] ) <= s[i] * y[i];
+	
+	//Die Ausliefermenge x kann maximal so groß sein wie der Bedarf des Kunden und es kann nur ausgeliefert werden, wenn das Depot eröffnet wird
+	forall ( i in 0..(I-1), j in 0..(J-1) ) 
+		( x[i][j] ) == ( d[j] * z[i][j] );
+	
+	//Jeder Kunde muss insgesamt genau den Bedarf d geliefert bekommen:
+	forall ( j in 0..(J-1) )
+		sum ( i in 0..(I-1) )  ( x[i][j] ) == d[j];
+	
+	forall ( j in 0..(J-1) )
+		sum ( i in 0..(I-1) ) ( z[i][j] ) == 1;   
+
+	forall ( i in 0..(I-1) )
+		sum ( j in 0..(J-1) ) z[i][j] <= J * y[i];
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_2.mod
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_2.mod	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/FLP_2.mod	(revision 15895)
@@ -0,0 +1,45 @@
+﻿//Capacitated Facility Location Problem:
+ 
+int I = ...;
+int J = ...;
+float f[0..(I-1)] = ...;				//Kosten Depot i
+float s[0..(I-1)] = ...;				//KAP Depot i
+float d[0..(J-1)] = ...;				//Bedarf Kunde j
+float c[0..(I-1)][0..(J-1)] = ...;		//Wegkosten von i nach j
+
+range RI = 0..(I-1);
+range RJ = 0..(J-1);
+ 
+dvar float+ x[0..(I-1)][0..(J-1)];		//Transportmenge
+dvar boolean y[0..(I-1)];				//Eröffnung Depot i
+dvar boolean z[0..(I-1)][0..(J-1)];		//Depot i beliefert Kunde j
+
+execute
+ {
+ 	cplex.threads=1;
+ }
+ 
+minimize
+( sum ( i in 0..(I-1) ) ( f[i] * y[i] ) );
+
+
+subject to 
+{
+	//Für jedes Depot gilt: Ausliefermenge x kann maximal so groß sein wie Depot-KAP y
+	forall ( i in 0..(I-1) ) 
+		sum ( j in 0..(J-1) ) ( x[i][j] ) <= s[i] * y[i];
+	
+	//Die Ausliefermenge x kann maximal so groß sein wie der Bedarf des Kunden und es kann nur ausgeliefert werden, wenn das Depot eröffnet wird
+	forall ( i in 0..(I-1), j in 0..(J-1) ) 
+		( x[i][j] ) == ( d[j] * z[i][j] );
+	
+	//Jeder Kunde muss insgesamt genau den Bedarf d geliefert bekommen:
+	forall ( j in 0..(J-1) )
+		sum ( i in 0..(I-1) )  ( x[i][j] ) == d[j];
+	
+	forall ( j in 0..(J-1) )
+		sum ( i in 0..(I-1) ) ( z[i][j] ) == 1;   
+
+	forall ( i in 0..(I-1) )
+		sum ( j in 0..(J-1) ) z[i][j] <= J * y[i];
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.csproj	(revision 15895)
@@ -0,0 +1,149 @@
+﻿<?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>{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.FacilityLocation.CplexSolver</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.FacilityLocation.CplexSolver-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\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\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="oplall, Version=12.7.0.0, Culture=neutral, PublicKeyToken=7906592bc7cc7340, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\IBM\ILOG\CPLEX_Studio127\opl\lib\oplall.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>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="FLPCplexSolver.cs" />
+    <Compile Include="FLPDataSource.cs" />
+    <Compile Include="Plugin.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="FLP_1.mod" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.FacilityLocation\3.3\HeuristicLab.Problems.FacilityLocation-3.3.csproj">
+      <Project>{aa9d05e4-eae1-45ca-97d2-275110a7e58d}</Project>
+      <Name>HeuristicLab.Problems.FacilityLocation-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="FLP_2.mod" />
+  </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/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.FacilityLocation.CplexSolver {
+  [Plugin("HeuristicLab.Problems.FacilityLocation.CplexSolver", "Plugin that provides a CPLEX solver for the FLP", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.dll", PluginFileType.Assembly)]
+  [PluginFile("oplall.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.FacilityLocation", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class HeuristicLabProblemsFacilityLocationCplexSolverPlugin : PluginBase {
+    }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation.CplexSolver/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.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.FacilityLocation.CplexSolver")]
+[assembly: AssemblyDescription("Plugin that provides a CPLEX solver for the FLP")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2017 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("307df76a-9d9d-4d0a-bb67-deef934a70ff")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationProblem.cs	(revision 15895)
@@ -0,0 +1,278 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.FacilityLocation {
+  [Item("Facility Location Problem (FLP)", "Problem that represents the delivery to multiple customers from a set of depots. Solutions to this problem define which depots to open and which customer to serve from which depot.")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 230)]
+  [StorableClass]
+  public sealed class FacilityLocationProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding> {
+    public override bool Maximization {
+      get { return false; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleArray> openingCostsParameter;
+    public IValueParameter<DoubleArray> OpeningCostsParameter {
+      get { return openingCostsParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleArray> depotCapacitiesParameter;
+    public IValueParameter<DoubleArray> DepotCapacitiesParameter {
+      get { return depotCapacitiesParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleArray> customerDemandsParameter;
+    public IValueParameter<DoubleArray> CustomerDemandsParameter {
+      get { return customerDemandsParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleMatrix> deliveryCostsParameter;
+    public IValueParameter<DoubleMatrix> DeliveryCostsParameter {
+      get { return deliveryCostsParameter; }
+    }
+
+    [StorableConstructor]
+    private FacilityLocationProblem(bool deserializing) : base(deserializing) { }
+    private FacilityLocationProblem(FacilityLocationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      openingCostsParameter = cloner.Clone(original.openingCostsParameter);
+      depotCapacitiesParameter = cloner.Clone(original.depotCapacitiesParameter);
+      customerDemandsParameter = cloner.Clone(original.customerDemandsParameter);
+      deliveryCostsParameter = cloner.Clone(original.deliveryCostsParameter);
+      RegisterEventHandlers();
+    }
+    public FacilityLocationProblem() {
+      Parameters.Add(openingCostsParameter = new ValueParameter<DoubleArray>("Opening Costs", "For each possible depot location the costs to open it."));
+      Parameters.Add(depotCapacitiesParameter = new ValueParameter<DoubleArray>("Depot Capacities", "For each depot d in D the capacity value which is used to satisfy the customer demands."));
+      Parameters.Add(customerDemandsParameter = new ValueParameter<DoubleArray>("Customer Demands", "For each customer c in C the demand that has to be delivered."));
+      Parameters.Add(deliveryCostsParameter = new ValueParameter<DoubleMatrix>("Delivery Costs", "A DxC matrix with service costs for each pair (d, c)."));
+
+      OpeningCostsParameter.Value = new DoubleArray(new double[] { 55929, 53094, 53842, 47865, 47995, 57991, 55903, 51308, 49140, 59082 } );
+      DepotCapacitiesParameter.Value = new DoubleArray(new double[] { 490, 420, 420, 490, 560, 490, 490, 490, 420, 560 });
+      CustomerDemandsParameter.Value = new DoubleArray(new double[] { 14, 19, 16, 18, 16, 14, 18, 12, 14, 20, 19, 20, 19, 18, 19, 18, 20, 20, 19, 15, 19, 18, 12, 19, 20, 19, 11, 16, 20, 17, 15, 19, 19, 11, 20, 12, 14, 19, 12, 20, 12, 20, 15, 16, 13, 15, 18, 19, 12, 19, 18, 20, 13, 17, 17, 11, 16, 16, 17, 16, 18, 16, 18, 19, 18, 17, 16, 13, 16, 15, 11, 15, 13, 16, 18, 15, 11, 14, 12, 16, 17, 17, 12, 14, 14, 15, 19, 16, 19, 12, 16, 11, 11, 14, 17, 15, 17, 20, 15, 12 });
+      DeliveryCostsParameter.Value = new DoubleMatrix(new double[,] {
+  { 29.73, 30.81, 27.07, 25.08, 20.00, 46.23, 4.24, 28.23, 36.22, 27.02, 51.62, 37.66, 12.04, 25.81, 17.46, 10.44, 5.00, 46.04, 35.69, 39.66, 57.80, 48.09, 33.54, 42.06, 41.19, 41.19, 47.38, 45.28, 43.19, 22.02, 30.61, 55.23, 43.60, 28.86, 24.74, 34.00, 38.00, 17.12, 27.20, 39.62, 36.06, 5.66, 47.63, 24.84, 19.31, 25.96, 17.09, 29.15, 8.06, 18.03, 40.11, 18.25, 38.33, 22.80, 53.82, 49.52, 60.61, 41.11, 30.08, 28.02, 42.58, 7.07, 28.02, 47.01, 32.25, 28.07, 14.76, 41.04, 28.65, 43.19, 7.28, 40.01, 32.53, 45.62, 39.60, 52.40, 31.24, 41.59, 20.10, 21.19, 42.64, 32.02, 31.06, 30.68, 47.41, 31.38, 25.32, 25.00, 10.30, 51.89, 21.93, 49.24, 43.01, 48.80, 23.77, 48.66, 44.28, 49.20, 37.11, 44.78, }
+, { 8.49, 30.41, 33.84, 25.00, 21.26, 13.15, 33.62, 9.43, 42.94, 34.79, 20.22, 9.49, 26.93, 13.04, 38.01, 37.48, 32.70, 23.41, 9.06, 6.08, 30.02, 44.55, 10.05, 31.89, 39.05, 45.49, 50.61, 17.26, 13.15, 20.02, 17.00, 25.18, 20.62, 42.72, 14.14, 4.00, 40.50, 22.02, 18.97, 35.47, 28.43, 39.85, 21.38, 15.00, 41.05, 41.98, 20.59, 8.60, 39.05, 21.93, 14.32, 20.62, 44.78, 16.12, 28.16, 18.11, 32.14, 11.40, 43.97, 35.11, 37.48, 44.38, 19.31, 45.28, 41.23, 34.18, 27.17, 12.65, 9.22, 13.15, 30.41, 16.16, 13.04, 28.65, 13.42, 19.65, 16.12, 4.24, 36.22, 27.29, 11.05, 15.13, 39.00, 27.29, 28.64, 6.40, 15.00, 13.45, 44.38, 33.24, 43.19, 39.41, 42.64, 18.03, 40.61, 41.23, 6.71, 14.87, 47.42, 29.68, }
+, { 47.63, 19.24, 20.40, 26.83, 51.89, 42.05, 44.28, 45.61, 11.18, 20.22, 40.52, 55.87, 39.29, 39.41, 30.07, 37.01, 44.41, 29.41, 54.49, 43.01, 37.01, 5.10, 53.91, 16.55, 8.49, 6.32, 4.00, 35.85, 38.47, 34.00, 31.14, 39.46, 30.46, 19.65, 48.55, 44.55, 9.22, 48.85, 30.81, 12.04, 19.10, 43.05, 33.53, 37.44, 29.43, 22.56, 44.78, 46.23, 40.05, 50.16, 60.83, 48.33, 9.49, 38.59, 33.14, 40.16, 39.01, 38.59, 18.97, 19.24, 10.30, 48.26, 30.00, 3.00, 15.13, 19.42, 35.17, 37.22, 42.64, 38.47, 45.89, 62.29, 34.66, 22.80, 35.51, 42.72, 31.83, 48.01, 27.00, 28.46, 40.31, 57.20, 16.00, 21.63, 24.52, 46.75, 50.77, 47.71, 42.58, 24.00, 27.89, 13.04, 5.00, 39.22, 24.33, 10.05, 50.48, 44.38, 13.04, 20.88, }
+, { 15.00, 14.42, 17.72, 9.06, 22.02, 18.38, 24.84, 13.04, 26.93, 18.68, 22.80, 23.43, 17.03, 7.28, 23.54, 25.06, 24.21, 17.46, 21.93, 14.00, 28.84, 30.53, 21.26, 18.97, 24.21, 29.83, 35.36, 16.28, 14.76, 7.07, 2.00, 26.17, 14.76, 26.68, 16.76, 12.53, 24.84, 20.10, 3.00, 20.81, 13.89, 29.21, 18.60, 6.00, 26.31, 26.17, 16.28, 13.60, 27.46, 21.02, 28.32, 19.03, 28.84, 8.06, 25.06, 20.81, 31.62, 13.00, 27.89, 18.97, 23.32, 34.71, 3.16, 30.81, 25.08, 18.03, 15.00, 12.53, 10.00, 14.76, 23.32, 29.70, 4.12, 19.03, 10.82, 23.85, 2.24, 18.25, 21.10, 12.17, 14.87, 24.70, 22.85, 11.40, 20.22, 14.14, 18.97, 15.81, 32.76, 25.18, 28.07, 27.20, 27.66, 20.00, 25.02, 28.23, 21.21, 21.54, 31.30, 19.03, }
+, { 15.23, 15.65, 16.28, 8.06, 17.09, 25.55, 17.03, 13.00, 26.91, 17.03, 30.48, 24.70, 9.22, 7.07, 18.03, 18.03, 16.40, 25.06, 22.85, 19.92, 36.62, 33.84, 21.47, 24.02, 26.93, 30.81, 36.89, 24.04, 22.20, 1.00, 9.43, 33.97, 22.47, 24.19, 14.14, 16.00, 26.08, 14.32, 6.32, 24.04, 18.11, 21.63, 26.40, 5.00, 21.10, 22.85, 10.20, 13.93, 20.12, 15.52, 29.07, 13.60, 29.07, 4.47, 32.76, 28.43, 39.41, 20.25, 25.55, 17.69, 26.93, 27.02, 7.28, 33.62, 24.08, 16.97, 7.62, 20.00, 11.18, 22.20, 15.65, 30.02, 11.40, 25.71, 18.44, 31.40, 10.00, 23.19, 16.49, 8.06, 21.95, 23.43, 21.93, 13.60, 27.20, 15.52, 16.28, 13.45, 25.50, 32.02, 23.35, 32.14, 29.97, 27.66, 21.19, 32.56, 26.17, 28.65, 30.48, 25.32, }
+, { 26.08, 18.68, 15.00, 13.60, 21.63, 38.01, 9.06, 24.02, 24.74, 15.03, 42.44, 35.36, 6.71, 19.24, 7.81, 5.39, 9.22, 35.38, 33.38, 32.57, 47.38, 36.01, 31.58, 30.08, 29.07, 29.61, 35.90, 35.81, 34.48, 13.00, 20.81, 45.45, 33.24, 18.36, 22.80, 28.28, 26.08, 18.03, 17.20, 27.46, 24.17, 10.00, 37.54, 17.46, 10.82, 15.81, 15.23, 25.02, 7.81, 19.42, 39.05, 18.36, 26.93, 16.12, 43.19, 40.50, 50.21, 32.65, 19.72, 16.03, 30.41, 15.81, 17.80, 35.01, 20.88, 16.00, 5.10, 32.25, 23.09, 34.48, 11.18, 39.56, 23.71, 34.13, 30.53, 43.57, 21.63, 35.69, 8.94, 9.43, 34.44, 31.95, 19.42, 18.79, 36.06, 27.00, 24.35, 22.56, 13.04, 40.31, 13.60, 37.11, 31.02, 39.66, 13.60, 36.50, 38.64, 41.15, 26.40, 33.12, }
+, { 8.06, 35.61, 36.80, 28.32, 9.22, 27.89, 26.02, 9.49, 47.38, 37.54, 34.93, 9.43, 22.14, 15.26, 36.25, 32.98, 25.02, 36.12, 7.81, 20.40, 44.41, 52.84, 5.66, 41.23, 46.32, 51.09, 57.01, 31.06, 27.17, 21.21, 24.17, 39.81, 33.14, 44.41, 6.40, 14.04, 46.23, 12.00, 23.85, 43.05, 36.24, 33.06, 35.01, 17.20, 39.40, 42.72, 13.60, 9.22, 33.38, 11.05, 11.05, 11.05, 49.52, 16.28, 42.05, 32.76, 46.69, 25.08, 45.80, 38.21, 45.65, 36.12, 24.70, 53.00, 44.60, 37.48, 24.60, 26.02, 12.65, 27.17, 22.00, 11.05, 21.84, 40.02, 26.02, 34.48, 23.77, 18.79, 35.85, 28.43, 25.32, 3.16, 42.45, 33.02, 40.61, 10.00, 4.47, 7.07, 38.12, 45.54, 42.05, 49.40, 49.65, 32.56, 40.82, 50.57, 20.25, 29.73, 50.99, 40.52, }
+, { 21.54, 13.00, 18.25, 12.21, 30.00, 16.03, 31.91, 19.92, 24.74, 19.24, 18.03, 28.60, 24.19, 15.03, 27.29, 30.48, 31.38, 10.00, 27.46, 15.26, 21.93, 24.76, 27.29, 12.21, 19.42, 26.40, 31.06, 11.40, 12.04, 14.32, 6.08, 20.25, 7.81, 27.07, 24.33, 17.20, 21.54, 28.16, 8.94, 15.81, 8.94, 35.38, 12.21, 14.04, 29.55, 27.46, 24.33, 20.25, 33.24, 29.07, 33.60, 27.07, 26.25, 16.12, 17.80, 16.49, 24.76, 11.40, 28.02, 19.10, 17.69, 41.11, 8.06, 25.50, 24.08, 18.11, 21.40, 10.20, 16.76, 12.04, 30.87, 35.23, 7.62, 11.00, 8.25, 19.65, 6.00, 20.25, 24.17, 16.40, 13.34, 31.38, 22.02, 10.05, 12.17, 20.12, 26.48, 23.35, 38.29, 17.12, 30.68, 20.12, 23.02, 15.52, 26.93, 21.63, 22.83, 19.00, 29.61, 11.18, }
+, { 10.30, 27.73, 27.80, 20.12, 5.10, 29.41, 16.12, 9.22, 38.60, 28.43, 35.85, 18.11, 11.70, 10.20, 25.94, 22.56, 15.13, 33.73, 16.12, 22.02, 44.01, 45.88, 14.04, 35.51, 39.00, 42.72, 48.88, 30.46, 27.29, 13.00, 19.00, 40.25, 30.81, 34.71, 5.10, 15.56, 38.08, 3.61, 17.26, 36.06, 29.83, 23.02, 33.84, 11.00, 29.07, 32.80, 3.16, 10.00, 23.09, 4.12, 21.10, 2.24, 40.80, 9.06, 40.80, 33.62, 46.62, 25.06, 36.12, 29.21, 38.90, 26.68, 18.25, 45.69, 35.47, 28.60, 14.42, 25.50, 10.82, 27.29, 12.37, 21.38, 18.44, 36.01, 24.70, 36.06, 19.03, 22.80, 25.81, 19.21, 26.08, 13.60, 33.42, 25.63, 37.12, 12.21, 6.08, 5.39, 28.00, 42.11, 31.76, 43.74, 42.05, 33.12, 30.81, 44.38, 25.24, 32.02, 41.77, 36.01, }
+, { 29.73, 32.02, 37.64, 31.76, 42.05, 9.22, 49.50, 29.55, 42.05, 38.60, 2.24, 31.02, 41.73, 28.60, 46.96, 49.65, 48.80, 12.00, 31.14, 16.76, 8.54, 36.40, 32.39, 25.08, 34.13, 42.11, 44.91, 8.60, 10.82, 31.89, 23.60, 3.16, 12.37, 46.10, 34.93, 23.41, 38.00, 41.68, 27.20, 31.02, 26.31, 54.04, 8.06, 29.07, 49.24, 46.84, 38.83, 29.15, 52.20, 42.06, 35.06, 40.31, 43.00, 31.24, 9.22, 4.47, 10.05, 13.04, 46.87, 38.33, 31.26, 59.55, 26.63, 38.08, 42.43, 37.36, 39.82, 12.81, 27.29, 10.82, 47.51, 37.05, 21.21, 18.25, 14.14, 3.16, 22.80, 19.03, 43.86, 35.85, 12.08, 37.48, 40.61, 29.41, 16.49, 27.51, 36.40, 34.01, 57.43, 18.36, 50.33, 28.79, 37.34, 5.00, 46.49, 31.62, 19.10, 8.06, 47.04, 20.22, }
+      });
+
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = DepotCapacitiesParameter.Value.Length;
+      Encoding.Length = CustomerDemandsParameter.Value.Length;
+
+      InitializeOperators();
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FacilityLocationProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void InitializeOperators() {
+      Operators.Add(new IntegerVectorHammingSimilarityOperator());
+      Operators.Add(new QualitySimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<SingleObjectiveSolutionSimilarityCalculator>()));
+    }
+
+    private void RegisterEventHandlers() {
+      CustomerDemandsParameter.ValueChanged += CustomerDemandsParameterOnValueChanged;
+      CustomerDemandsParameter.Value.ToStringChanged += CustomerDemandsParameterValueOnToStringChanged;
+      DepotCapacitiesParameter.ValueChanged += DepotCapacitiesParameterOnValueChanged;
+      DepotCapacitiesParameter.Value.ToStringChanged += DepotCapacitiesParameterValueOnToStringChanged;
+    }
+
+    private void CustomerDemandsParameterOnValueChanged(object sender, EventArgs eventArgs) {
+      CustomerDemandsParameter.Value.ToStringChanged += CustomerDemandsParameterValueOnToStringChanged;
+      Encoding.Length = CustomerDemandsParameter.Value.Length;
+    }
+
+    private void CustomerDemandsParameterValueOnToStringChanged(object sender, EventArgs eventArgs) {
+      Encoding.Length = CustomerDemandsParameter.Value.Length;
+    }
+
+    private void DepotCapacitiesParameterOnValueChanged(object sender, EventArgs eventArgs) {
+      DepotCapacitiesParameter.Value.ToStringChanged += DepotCapacitiesParameterValueOnToStringChanged;
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = DepotCapacitiesParameter.Value.Length;
+    }
+
+    private void DepotCapacitiesParameterValueOnToStringChanged(object sender, EventArgs eventArgs) {
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = DepotCapacitiesParameter.Value.Length;
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var vec = individual.IntegerVector(Encoding.Name);
+      return Evaluate(vec);
+    }
+
+    public double Evaluate(IntegerVector depotAssignment) {
+      var openingCosts = OpeningCostsParameter.Value;
+      var capacities = DepotCapacitiesParameter.Value;
+      var demands = CustomerDemandsParameter.Value;
+      var deliveryCosts = DeliveryCostsParameter.Value;
+
+      double totalOpeningCosts, totalDeliveryCosts;
+      double[] depotUsage;
+
+      try {
+        return Evaluate(depotAssignment, openingCosts, capacities, demands, deliveryCosts, out totalOpeningCosts, out totalDeliveryCosts, out depotUsage);
+      } catch (IndexOutOfRangeException) {
+        throw new ArgumentException("The solution contains more customers than there are problem data for.");
+      }
+    }
+
+    public FacilityLocationSolution GetSolution(IntegerVector depotAssignment) {
+      var openingCosts = OpeningCostsParameter.Value;
+      var capacities = DepotCapacitiesParameter.Value;
+      var demands = CustomerDemandsParameter.Value;
+      var deliveryCosts = DeliveryCostsParameter.Value;
+
+      double totalOpeningCosts, totalDeliveryCosts, fitness;
+      double[] depotUsage;
+
+      try {
+        fitness = Evaluate(depotAssignment, openingCosts, capacities, demands, deliveryCosts, out totalOpeningCosts, out totalDeliveryCosts, out depotUsage);
+      } catch (IndexOutOfRangeException) {
+        throw new ArgumentException("The solution contains more customers than there are problem data for.");
+      }
+
+      var overbooking = depotUsage.Zip(capacities, (a, b) => a > b ? a - b : 0).Sum();
+
+      return new FacilityLocationSolution() {
+        OpeningCosts = (DoubleArray)openingCosts.Clone(),
+        DepotCapacities = (DoubleArray)capacities.Clone(),
+        CustomerDemands = (DoubleArray)demands.Clone(),
+        DeliveryCosts = (DoubleMatrix)deliveryCosts.Clone(),
+        CustomerToDepotAssignmentParameter = { Value = (IntegerVector)depotAssignment.Clone() },
+        FitnessValueParameter = { Value = new DoubleValue(fitness) },
+        TotalOpeningCostsParameter = { Value = new DoubleValue(totalOpeningCosts) },
+        TotalDeliveryCostsParameter = { Value = new DoubleValue(totalDeliveryCosts) },
+        TotalOverbookedCapacityParameter = { Value = new DoubleValue(overbooking) }
+      };
+    } 
+
+    public static double Evaluate(IEnumerable<int> customer2Depot, DoubleArray openingCosts, DoubleArray capacities, DoubleArray demands, DoubleMatrix deliveryCosts, out double totalOpeningCosts, out double totalDeliveryCosts, out double[] capacityDemandsPerDepot) {
+      var D = capacities.Length;
+
+      capacityDemandsPerDepot = new double[D];
+      totalOpeningCosts = 0.0;
+      totalDeliveryCosts = 0.0;
+
+      var customer = 0;
+      foreach (var depot in customer2Depot) {
+        if (capacityDemandsPerDepot[depot] == 0) totalOpeningCosts += openingCosts[depot];
+        capacityDemandsPerDepot[depot] += demands[customer];
+        totalDeliveryCosts += deliveryCosts[depot, customer];
+        customer++;
+      }
+
+
+      var overbooking = capacityDemandsPerDepot.Zip(capacities, (a, b) => a > b ? a - b : 0).Sum();
+      if (overbooking > 0) // infeasible
+        return openingCosts.Sum() + deliveryCosts.Sum() + overbooking;
+
+      return totalOpeningCosts + totalDeliveryCosts;
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+      var best = Maximization ? orderedIndividuals.Last() : orderedIndividuals.First();
+      var bestSol = best.Individual.IntegerVector(Encoding.Name);
+
+      FacilityLocationSolution bestSoFar = null;
+      IResult bestSoFarResult;
+      results.TryGetValue("Best Solution", out bestSoFarResult);
+      if (bestSoFarResult != null) bestSoFar = bestSoFarResult.Value as FacilityLocationSolution;
+
+      if (bestSoFar == null || bestSoFar.FitnessValueParameter.Value.Value > best.Quality) {
+
+        var openingCosts = OpeningCostsParameter.Value;
+        var capacities = DepotCapacitiesParameter.Value;
+        var demands = CustomerDemandsParameter.Value;
+        var deliveryCosts = DeliveryCostsParameter.Value;
+
+        double totalOpeningCosts, totalDeliveryCosts;
+        double[] depotUsage;
+
+        try {
+          Evaluate(bestSol, openingCosts, capacities, demands, deliveryCosts, out totalOpeningCosts, out totalDeliveryCosts, out depotUsage);
+        } catch (IndexOutOfRangeException) {
+          throw new ArgumentException("The solution contains more customers than there are problem data for.");
+        }
+        var overbooking = depotUsage.Zip(capacities, (a, b) => a > b ? a - b : 0).Sum();
+
+        if (bestSoFar == null) {
+          bestSoFar = new FacilityLocationSolution() {
+            OpeningCosts = (DoubleArray)openingCosts.Clone(),
+            DepotCapacities = (DoubleArray)capacities.Clone(),
+            CustomerDemands = (DoubleArray)demands.Clone(),
+            DeliveryCosts = (DoubleMatrix)deliveryCosts.Clone(),
+            CustomerToDepotAssignmentParameter = {Value = (IntegerVector)bestSol.Clone()},
+            FitnessValueParameter = {Value = new DoubleValue(best.Quality)},
+            TotalOpeningCostsParameter = {Value = new DoubleValue(totalOpeningCosts)},
+            TotalDeliveryCostsParameter = {Value = new DoubleValue(totalDeliveryCosts)},
+            TotalOverbookedCapacityParameter = {Value = new DoubleValue(overbooking)}
+          };
+        } else {
+          bestSoFar.CustomerToDepotAssignmentParameter.Value = (IntegerVector)bestSol.Clone();
+          bestSoFar.FitnessValueParameter.Value.Value = best.Quality;
+          bestSoFar.TotalOpeningCostsParameter.Value.Value = totalOpeningCosts;
+          bestSoFar.TotalDeliveryCostsParameter.Value.Value = totalDeliveryCosts;
+          bestSoFar.TotalOverbookedCapacityParameter.Value.Value = overbooking;
+        }
+      }
+
+      if (bestSoFarResult == null) {
+        bestSoFarResult = new Result("Best Solution", bestSoFar);
+        results.Add(bestSoFarResult);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationSolution.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationSolution.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/FacilityLocationSolution.cs	(revision 15895)
@@ -0,0 +1,118 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.FacilityLocation {
+  [Item("Facility Location Solution", "Solution to the facility layout problem")]
+  [StorableClass]
+  public class FacilityLocationSolution : ParameterizedNamedItem {
+    
+    [Storable]
+    private DoubleArray openingCosts;
+    public DoubleArray OpeningCosts {
+      get { return openingCosts; }
+      set { openingCosts = value; }
+    }
+
+    [Storable]
+    private DoubleArray depotCapacities;
+    public DoubleArray DepotCapacities {
+      get { return depotCapacities; }
+      set { depotCapacities = value; }
+    }
+
+    [Storable]
+    private DoubleArray customerDemands;
+    public DoubleArray CustomerDemands {
+      get { return customerDemands; }
+      set { customerDemands = value; }
+    }
+
+    [Storable]
+    private ValueTypeMatrix<double> deliveryCosts;
+    public ValueTypeMatrix<double> DeliveryCosts {
+      get { return deliveryCosts; }
+      set { deliveryCosts = value; }
+    }
+
+    [Storable]
+    private IValueParameter<IntegerVector> customerToDepotAssignmentParameter;
+    public IValueParameter<IntegerVector> CustomerToDepotAssignmentParameter {
+      get { return customerToDepotAssignmentParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleValue> fitnessValueParameter;
+    public IValueParameter<DoubleValue> FitnessValueParameter {
+      get { return fitnessValueParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleValue> totalOpeningCostsParameter;
+    public IValueParameter<DoubleValue> TotalOpeningCostsParameter {
+      get { return totalOpeningCostsParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleValue> totalDeliveryCostsParameter;
+    public IValueParameter<DoubleValue> TotalDeliveryCostsParameter {
+      get { return totalDeliveryCostsParameter; }
+    }
+
+    [Storable]
+    private IValueParameter<DoubleValue> totalOverbookedCapacityParameter;
+    public IValueParameter<DoubleValue> TotalOverbookedCapacityParameter {
+      get { return totalOverbookedCapacityParameter; }
+    }
+
+    [StorableConstructor]
+    protected FacilityLocationSolution(bool deserializing) : base(deserializing) { }
+    protected FacilityLocationSolution(FacilityLocationSolution original, Cloner cloner)
+      : base(original, cloner) {
+      openingCosts = cloner.Clone(original.openingCosts);
+      depotCapacities = cloner.Clone(original.depotCapacities);
+      customerDemands = cloner.Clone(original.customerDemands);
+      deliveryCosts = cloner.Clone(original.deliveryCosts);
+      customerToDepotAssignmentParameter = cloner.Clone(original.customerToDepotAssignmentParameter);
+      fitnessValueParameter = cloner.Clone(original.fitnessValueParameter);
+      totalOpeningCostsParameter = cloner.Clone(original.totalOpeningCostsParameter);
+      totalDeliveryCostsParameter = cloner.Clone(original.totalDeliveryCostsParameter);
+      totalOverbookedCapacityParameter = cloner.Clone(original.totalOverbookedCapacityParameter);
+    }
+    public FacilityLocationSolution() {
+      Parameters.Add(customerToDepotAssignmentParameter = new ValueParameter<IntegerVector>("Customer-Depot Assignment", "The assignment vector that assigns each customer to one depot."));
+      Parameters.Add(fitnessValueParameter = new ValueParameter<DoubleValue>("Fitness Value", "The fitness value of the solution."));
+      Parameters.Add(totalOpeningCostsParameter = new ValueParameter<DoubleValue>("Total Opening Costs", "The sum of all opening costs."));
+      Parameters.Add(totalDeliveryCostsParameter = new ValueParameter<DoubleValue>("Total Delivery Costs", "The sum of all delivery costs."));
+      Parameters.Add(totalOverbookedCapacityParameter = new ValueParameter<DoubleValue>("Total Overbooked Capacity", "The total amount of capacity that would additionally be required to fulfill all the customer demands."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FacilityLocationSolution(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/HeuristicLab.Problems.FacilityLocation-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/HeuristicLab.Problems.FacilityLocation-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/HeuristicLab.Problems.FacilityLocation-3.3.csproj	(revision 15895)
@@ -0,0 +1,148 @@
+﻿<?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>{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.FacilityLocation</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.FacilityLocation-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\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\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\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="FacilityLocationProblem.cs" />
+    <Compile Include="FacilityLocationSolution.cs" />
+    <Compile Include="IntegerVectorHammingSimilarityOperator.cs" />
+    <Compile Include="Plugin.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.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/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/IntegerVectorHammingSimilarityOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/IntegerVectorHammingSimilarityOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/IntegerVectorHammingSimilarityOperator.cs	(revision 15895)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.FacilityLocation {
+  [Item("IntegerVector Hamming Similarity Calculator", "Calculates the hamming similarity of two integer vectors (relative amount of identical positions")]
+  [StorableClass]
+  public class IntegerVectorHammingSimilarityOperator : SingleObjectiveSolutionSimilarityCalculator {
+
+    protected override bool IsCommutative {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    protected IntegerVectorHammingSimilarityOperator(bool deserializing) : base(deserializing) { }
+    protected IntegerVectorHammingSimilarityOperator(IntegerVectorHammingSimilarityOperator original, Cloner cloner) : base(original, cloner) { }
+    public IntegerVectorHammingSimilarityOperator() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerVectorHammingSimilarityOperator(this, cloner);
+    }
+
+    public override double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution) {
+      var a = leftSolution.Variables[SolutionVariableName] as IntegerVector;
+      var b = rightSolution.Variables[SolutionVariableName] as IntegerVector;
+      if (a == null || b == null) throw new ArgumentException("Scopes do not contain a solution variable.");
+      if (a.Length != b.Length) throw new ArgumentException("Solutions are of unequal length.");
+
+      var similarity = 0;
+      var len = a.Length;
+      for (var i = 0; i < len; i++)
+        if (a[i] == b[i]) similarity++;
+
+      return similarity / (double)len;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.FacilityLocation {
+  [Plugin("HeuristicLab.Problems.FacilityLocation", "Plugin that provides the definition for the facility location problem (FLP)", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.FacilityLocation-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabProblemsFacilityLocationPlugin : PluginBase { }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.FacilityLocation/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.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.FacilityLocation")]
+[assembly: AssemblyDescription("Plugin that provides the definition for the facility location problem (FLP)")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2017 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("aa9d05e4-eae1-45ca-97d2-275110a7e58d")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.0")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class CVRPPDTWView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPPDTWView.cs	(revision 15895)
@@ -0,0 +1,196 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("CVRPPDTWProblemInstance View")]
+  [Content(typeof(CVRPPDTWProblemInstance), true)]
+  public partial class CVRPPDTWView : VRPProblemInstanceView {
+    public new CVRPPDTWProblemInstance Content {
+      get { return (CVRPPDTWProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public CVRPPDTWView() {
+      InitializeComponent();
+    }
+
+    private bool drawFlow = false;
+
+    protected override void pictureBox_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
+      if (e.Button == System.Windows.Forms.MouseButtons.Right) {
+        drawFlow = !drawFlow;
+        GenerateImage();
+      }      
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+      DoubleArray dueTime = Content.DueTime;
+      DoubleArray serviceTime = Content.ServiceTime;
+      DoubleArray readyTime = Content.ReadyTime;
+      DoubleArray demand = Content.Demand;
+      IntArray pickupDeliveryLocation = Content.PickupDeliveryLocation;
+
+      Pen flowPen = new Pen(Brushes.Red, 3);
+      flowPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
+      flowPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+            int currentTour = 0;
+
+            List<Tour> tours = Solution.GetTours();
+            List<Pen> pens = GetColors(tours.Count);
+
+            foreach (Tour tour in tours) {
+              double t = 0.0;
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              Pen[] customerPens = new Pen[tour.Stops.Count];
+              bool[] validPickupDelivery = new bool[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              Dictionary<int, bool> stops = new Dictionary<int, bool>();
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint = new Point(border + ((int)((coordinates[location, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[location, 1] - yMin) * yStep))));
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+                  Pen customerPen = Pens.Black;
+
+                  t += Content.GetDistance(
+                    lastCustomer, location, Solution);
+
+                  if (t < readyTime[location]) {
+                    t = readyTime[location];
+                    customerBrush = Brushes.Orange;
+                    customerPen = Pens.Orange;
+
+                  } else if (t > dueTime[location]) {
+                    customerBrush = Brushes.Red;
+                    customerPen = Pens.Red;
+                  }
+
+                  t += serviceTime[location];
+
+                  validPickupDelivery[i] =
+                    ((demand[location] >= 0) ||
+                     (stops.ContainsKey(pickupDeliveryLocation[location])));
+
+                  customerBrushes[i] = customerBrush;
+                  customerPens[i] = customerPen;
+
+                  stops.Add(location, true);
+                }
+                lastCustomer = location;
+              }
+
+              if (!drawFlow)
+                graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                if (validPickupDelivery[i]) {
+                  graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+
+                  if (demand[tour.Stops[i]] < 0 && drawFlow) {
+                    int location = pickupDeliveryLocation[tour.Stops[i]];
+                    int source = tour.Stops.IndexOf(location);
+
+                    graphics.DrawLine(flowPen, tourPoints[source + 1], tourPoints[i + 1]);
+                  }
+                } else
+                  graphics.DrawRectangle(customerPens[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.Blue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+              pens[i].Dispose();
+          } else {
+            {
+              Point[] locationPoints = new Point[coordinates.Rows];
+              //just draw customers
+              for (int i = 1; i < coordinates.Rows; i++) {
+                locationPoints[i] = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+
+                graphics.FillRectangle(Brushes.Black, locationPoints[i].X - 3, locationPoints[i].Y - 3, 6, 6);
+              }
+
+              if (drawFlow) {
+                for (int i = 1; i < coordinates.Rows; i++) {
+                  if (demand[i] < 0) {
+
+                    graphics.DrawLine(flowPen, locationPoints[pickupDeliveryLocation[i]], locationPoints[i]);
+                  }
+                }
+              }
+
+              Point locationPoint = new Point(border + ((int)((coordinates[0, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[0, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+          }
+        }
+      }
+
+      flowPen.Dispose();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class CVRPTWView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/CVRPTWView.cs	(revision 15895)
@@ -0,0 +1,142 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("CVRPTWProblemInstance View")]
+  [Content(typeof(CVRPTWProblemInstance), true)]
+  public partial class CVRPTWView : VRPProblemInstanceView {
+    public new CVRPTWProblemInstance Content {
+      get { return (CVRPTWProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public CVRPTWView() {
+      InitializeComponent();
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+      DoubleArray dueTime = Content.DueTime;
+      DoubleArray serviceTime = Content.ServiceTime;
+      DoubleArray readyTime = Content.ReadyTime;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+            int currentTour = 0;
+
+            List<Tour> tours = Solution.GetTours();
+            List<Pen> pens = GetColors(tours.Count);
+
+            foreach (Tour tour in tours) {
+              double t = 0.0;
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint = new Point(border + ((int)((coordinates[location, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[location, 1] - yMin) * yStep))));
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+
+                  t += Content.GetDistance(
+                    lastCustomer, location, Solution);
+
+                  if (t < readyTime[location]) {
+                    t = readyTime[location];
+                    customerBrush = Brushes.Orange;
+                  } else if (t > dueTime[location]) {
+                    customerBrush = Brushes.Red;
+                  }
+
+                  t += serviceTime[location];
+                  customerBrushes[i] = customerBrush;
+                }
+                lastCustomer = location;
+              }
+
+              graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.Blue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+              pens[i].Dispose();
+          } else {
+            Point locationPoint;
+            //just draw customers
+            for (int i = 1; i < coordinates.Rows; i++) {
+              locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+
+              graphics.FillRectangle(Brushes.Black, locationPoint.X - 3, locationPoint.Y - 3, 6, 6);
+            }
+
+            locationPoint = new Point(border + ((int)((coordinates[0, 0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((coordinates[0, 1] - yMin) * yStep))));
+            graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj	(revision 15895)
@@ -0,0 +1,324 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.VehicleRouting.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.VehicleRouting.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Problems.VehicleRouting.Views-3.4.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="MDCVRPPDTWView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MDCVRPPDTWView.Designer.cs">
+      <DependentUpon>MDCVRPPDTWView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MDCVRPTWView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MDCVRPTWView.Designer.cs">
+      <DependentUpon>MDCVRPTWView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MultiDepotVRPView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MultiDepotVRPView.Designer.cs">
+      <DependentUpon>MultiDepotVRPView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CVRPPDTWView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CVRPPDTWView.Designer.cs">
+      <DependentUpon>CVRPPDTWView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CVRPTWView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CVRPTWView.Designer.cs">
+      <DependentUpon>CVRPTWView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="SingleDepotVRPView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SingleDepotVRPView.Designer.cs">
+      <DependentUpon>SingleDepotVRPView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VRPImportDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="VRPImportDialog.Designer.cs">
+      <DependentUpon>VRPImportDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VRPProblemInstanceView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VRPProblemInstanceView.Designer.cs">
+      <DependentUpon>VRPProblemInstanceView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VehicleRoutingProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VehicleRoutingProblemView.Designer.cs">
+      <DependentUpon>VehicleRoutingProblemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VRPSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VRPSolutionView.Designer.cs">
+      <DependentUpon>VRPSolutionView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.VehicleRouting\3.4\HeuristicLab.Problems.VehicleRouting-3.4.csproj">
+      <Project>{B94FFB82-43D4-40AB-9980-B03470ADF221}</Project>
+      <Name>HeuristicLab.Problems.VehicleRouting-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- 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>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class MDCVRPPDTWView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPPDTWView.cs	(revision 15895)
@@ -0,0 +1,223 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("MDCVRPPDTWProblemInstance View")]
+  [Content(typeof(MDCVRPPDTWProblemInstance), true)]
+  public partial class MDCVRPPDTWView : VRPProblemInstanceView {
+    public new MDCVRPPDTWProblemInstance Content {
+      get { return (MDCVRPPDTWProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MDCVRPPDTWView() {
+      InitializeComponent();
+    }
+
+    private bool drawFlow = false;
+
+    protected override void pictureBox_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
+      if (e.Button == System.Windows.Forms.MouseButtons.Right) {
+        drawFlow = !drawFlow;
+        GenerateImage();
+      }      
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+      DoubleArray dueTime = Content.DueTime;
+      DoubleArray serviceTime = Content.ServiceTime;
+      DoubleArray readyTime = Content.ReadyTime;
+      DoubleArray demand = Content.Demand;
+      IntArray pickupDeliveryLocation = Content.PickupDeliveryLocation;
+      IntArray vehicleAssignment = Content.VehicleDepotAssignment;
+
+      int depots = Content.Depots.Value;
+      int cities = Content.Cities.Value;
+
+      Pen flowPen = new Pen(Brushes.Red, 3);
+      flowPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
+      flowPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+            for (int i = 0; i < Content.Depots.Value; i++) {
+              Point locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+
+            int currentTour = 0;
+
+            List<Tour> tours = Solution.GetTours();
+            List<Pen> pens = GetColors(tours.Count);
+
+            foreach (Tour tour in tours) {
+              int tourIndex = Solution.GetTourIndex(tour);
+              int vehicle = Solution.GetVehicleAssignment(tourIndex);
+              int depot = vehicleAssignment[vehicle];
+
+              double t = 0.0;
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              Pen[] customerPens = new Pen[tour.Stops.Count];
+              bool[] validPickupDelivery = new bool[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              Dictionary<int, bool> stops = new Dictionary<int, bool>();
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint;
+                if (location == 0) {
+                  locationPoint = new Point(border + ((int)((Content.Coordinates[depot, 0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.Coordinates[depot, 1] - yMin) * yStep))));
+                } else {
+                  locationPoint = new Point(border + ((int)((Content.GetCoordinates(location)[0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.GetCoordinates(location)[1] - yMin) * yStep))));
+                }
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+                  Pen customerPen = Pens.Black;
+
+                  t += Content.GetDistance(
+                    lastCustomer, location, Solution);
+
+                  int locationIndex;
+                  if (location == 0)
+                    locationIndex = depot;
+                  else
+                    locationIndex = location + depots - 1;
+
+                  if (t < readyTime[locationIndex]) {
+                    t = readyTime[locationIndex];
+                    customerBrush = Brushes.Orange;
+                    customerPen = Pens.Orange;
+
+                  } else if (t > dueTime[locationIndex]) {
+                    customerBrush = Brushes.Red;
+                    customerPen = Pens.Red;
+                  }
+
+                  t += serviceTime[location - 1];
+
+                  validPickupDelivery[i] =
+                    ((demand[location - 1] >= 0) ||
+                     (stops.ContainsKey(pickupDeliveryLocation[location - 1])));
+
+                  customerBrushes[i] = customerBrush;
+                  customerPens[i] = customerPen;
+
+                  stops.Add(location, true);
+                }
+                lastCustomer = location;
+              }
+
+              if (!drawFlow)
+                graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                if (validPickupDelivery[i]) {
+                  graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+
+                  if (demand[tour.Stops[i] - 1] < 0 && drawFlow) {
+                    int location = pickupDeliveryLocation[tour.Stops[i] - 1];
+                    int source = tour.Stops.IndexOf(location);
+
+                    graphics.DrawLine(flowPen, tourPoints[source + 1], tourPoints[i + 1]);
+                  }
+                } else
+                  graphics.DrawRectangle(customerPens[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.DarkBlue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+              pens[i].Dispose();
+          } else {
+            {
+              Point[] locationPoints = new Point[cities];
+              //just draw customers
+              for (int i = 0; i < cities; i++) {
+                locationPoints[i] = new Point(border + ((int)((Content.GetCoordinates(i + 1)[0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((Content.GetCoordinates(i + 1)[1] - yMin) * yStep))));
+
+                graphics.FillRectangle(Brushes.Black, locationPoints[i].X - 3, locationPoints[i].Y - 3, 6, 6);
+              }
+
+              if (drawFlow) {
+                for (int i = 0; i < cities; i++) {
+                  if (demand[i] < 0) {
+                    graphics.DrawLine(flowPen, locationPoints[pickupDeliveryLocation[i] - 1], locationPoints[i]);
+                  }
+                }
+              }
+
+              for (int i = 0; i < Content.Depots.Value; i++) {
+                Point locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+                graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+              }
+            }
+          }
+        }
+      }
+
+      flowPen.Dispose();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class MDCVRPTWView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MDCVRPTWView.cs	(revision 15895)
@@ -0,0 +1,169 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("MDCVRPTWProblemInstance View")]
+  [Content(typeof(MDCVRPTWProblemInstance), true)]
+  public partial class MDCVRPTWView : VRPProblemInstanceView {
+    public new MDCVRPTWProblemInstance Content {
+      get { return (MDCVRPTWProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MDCVRPTWView() {
+      InitializeComponent();
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+      DoubleArray dueTime = Content.DueTime;
+      DoubleArray serviceTime = Content.ServiceTime;
+      DoubleArray readyTime = Content.ReadyTime;
+      IntArray vehicleAssignment = Content.VehicleDepotAssignment;
+
+      int depots = Content.Depots.Value;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+            for (int i = 0; i < Content.Depots.Value; i++) {
+              Point locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+
+            int currentTour = 0;
+
+            List<Tour> tours = Solution.GetTours();
+            List<Pen> pens = GetColors(tours.Count);
+
+            foreach (Tour tour in tours) {
+              int tourIndex = Solution.GetTourIndex(tour);
+              int vehicle = Solution.GetVehicleAssignment(tourIndex);
+              int depot = vehicleAssignment[vehicle];
+
+              double t = 0.0;
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint;
+                if (location == 0) {
+                  locationPoint = new Point(border + ((int)((Content.Coordinates[depot, 0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.Coordinates[depot, 1] - yMin) * yStep))));
+                } else {
+                  locationPoint = new Point(border + ((int)((Content.GetCoordinates(location)[0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.GetCoordinates(location)[1] - yMin) * yStep))));
+                }
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+
+                  t += Content.GetDistance(
+                    lastCustomer, location, Solution);
+
+                  int locationIndex;
+                  if (location == 0)
+                    locationIndex = depot;
+                  else
+                    locationIndex = location + depots - 1;
+
+                  if (t < readyTime[locationIndex]) {
+                    t = readyTime[locationIndex];
+                    customerBrush = Brushes.Orange;
+                  } else if (t > dueTime[locationIndex]) {
+                    customerBrush = Brushes.Red;
+                  }
+
+                  t += serviceTime[location - 1];
+                  customerBrushes[i] = customerBrush;
+                }
+                lastCustomer = location;
+              }
+
+              graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.DarkBlue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+              pens[i].Dispose();
+          } else {
+            Point locationPoint;
+            //just draw customers
+            for (int i = 1; i < coordinates.Rows; i++) {
+              locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+
+              graphics.FillRectangle(Brushes.Black, locationPoint.X - 3, locationPoint.Y - 3, 6, 6);
+            }
+
+            for (int i = 0; i < Content.Depots.Value; i++) {
+              locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class MultiDepotVRPView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/MultiDepotVRPView.cs	(revision 15895)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("MultiDepotVRPProblemInstance View")]
+  [Content(typeof(MultiDepotVRPProblemInstance), true)]
+  public partial class MultiDepotVRPView : VRPProblemInstanceView {
+    public new MultiDepotVRPProblemInstance Content {
+      get { return (MultiDepotVRPProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MultiDepotVRPView() {
+      InitializeComponent();
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+            for (int i = 0; i < Content.Depots.Value; i++) {
+              Point locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+
+            int currentTour = 0;
+
+            List<Tour> tours = Solution.GetTours();
+            List<Pen> pens = GetColors(tours.Count);
+
+            foreach (Tour tour in tours) {
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint;
+
+                if (location == 0) {
+                  int tourIndex = Solution.GetTourIndex(tour);
+                  int vehicle = Solution.GetVehicleAssignment(tourIndex);
+                  int depot = Content.VehicleDepotAssignment[vehicle];
+
+                  locationPoint = new Point(border + ((int)((Content.Coordinates[depot, 0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.Coordinates[depot, 1] - yMin) * yStep))));
+                } else {
+                  locationPoint = new Point(border + ((int)((Content.GetCoordinates(location)[0] - xMin) * xStep)),
+                                  bitmap.Height - (border + ((int)((Content.GetCoordinates(location)[1] - yMin) * yStep))));
+                }
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+                  customerBrushes[i] = customerBrush;
+                }
+                lastCustomer = location;
+              }
+
+              graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.DarkBlue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+              pens[i].Dispose();
+          } else {
+            Point locationPoint;
+            //just draw customers
+            for (int i = 1; i <= Content.Cities.Value; i++) {
+              locationPoint = new Point(border + ((int)((Content.GetCoordinates(i)[0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((Content.GetCoordinates(i)[1] - yMin) * yStep))));
+
+              graphics.FillRectangle(Brushes.Black, locationPoint.X - 3, locationPoint.Y - 3, 6, 6);
+            }
+
+            for (int i = 0; i < Content.Depots.Value; i++) {
+              locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+              graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+            }
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.VehicleRouting.Views plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.VehicleRouting.Views", "3.4.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.VehicleRouting.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.VehicleRouting", "3.4")]
+  public class HeuristicLabProblemsVehicleRoutingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+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.VehicleRouting.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab Vehicle Routing Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("B275C45E-790A-45C2-907F-DFF8E5F0C28E")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.7.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.Designer.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class SingleDepotVRPView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/SingleDepotVRPView.cs	(revision 15895)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("SingleDepotVRPProblemInstance View")]
+  [Content(typeof(SingleDepotVRPProblemInstance), true)]
+  public partial class SingleDepotVRPView : VRPProblemInstanceView {
+    public new SingleDepotVRPProblemInstance Content {
+      get { return (SingleDepotVRPProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SingleDepotVRPView() {
+      InitializeComponent();
+    }
+
+    protected override void DrawVisualization(Bitmap bitmap) {
+      DoubleMatrix coordinates = Content.Coordinates;
+      DoubleMatrix distanceMatrix = Content.DistanceMatrix;
+      BoolValue useDistanceMatrix = Content.UseDistanceMatrix;
+
+      if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+        double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+        for (int i = 0; i < coordinates.Rows; i++) {
+          if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+          if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+          if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+          if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+        }
+
+        int border = 20;
+        double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1;
+        double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1;
+
+        using (Graphics graphics = Graphics.FromImage(bitmap)) {
+          if (Solution != null) {
+             List<Tour> tours = Solution.GetTours();
+             List<Pen> pens = GetColors(tours.Count);
+
+            int currentTour = 0;
+            foreach (Tour tour in tours) {
+              Point[] tourPoints = new Point[tour.Stops.Count + 2];
+              Brush[] customerBrushes = new Brush[tour.Stops.Count];
+              int lastCustomer = 0;
+
+              for (int i = -1; i <= tour.Stops.Count; i++) {
+                int location = 0;
+
+                if (i == -1 || i == tour.Stops.Count)
+                  location = 0; //depot
+                else
+                  location = tour.Stops[i];
+
+                Point locationPoint = new Point(border + ((int)((coordinates[location, 0] - xMin) * xStep)),
+                                bitmap.Height - (border + ((int)((coordinates[location, 1] - yMin) * yStep))));
+                tourPoints[i + 1] = locationPoint;
+
+                if (i != -1 && i != tour.Stops.Count) {
+                  Brush customerBrush = Brushes.Black;
+                  customerBrushes[i] = customerBrush;
+                }
+                lastCustomer = location;
+              }
+
+              graphics.DrawPolygon(pens[currentTour], tourPoints);
+
+              for (int i = 0; i < tour.Stops.Count; i++) {
+                graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6);
+              }
+
+              graphics.FillEllipse(Brushes.Blue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10);
+
+              currentTour++;
+            }
+
+            for (int i = 0; i < pens.Count; i++)
+               pens[i].Dispose();
+          } else {
+            Point locationPoint;
+            //just draw customers
+            for (int i = 1; i < coordinates.Rows; i++) {
+              locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep))));
+
+              graphics.FillRectangle(Brushes.Black, locationPoint.X - 3, locationPoint.Y - 3, 6, 6);
+            }
+
+            locationPoint = new Point(border + ((int)((coordinates[0, 0] - xMin) * xStep)),
+                              bitmap.Height - (border + ((int)((coordinates[0, 1] - yMin) * yStep))));
+            graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10);
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.Designer.cs	(revision 15895)
@@ -0,0 +1,215 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class VRPImportDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.openVRPFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.tspFileLabel = new System.Windows.Forms.Label();
+      this.openVRPFileButton = new System.Windows.Forms.Button();
+      this.tspFileTextBox = new System.Windows.Forms.TextBox();
+      this.tourFileLabel = new System.Windows.Forms.Label();
+      this.openTourFileButton = new System.Windows.Forms.Button();
+      this.tourFileTextBox = new System.Windows.Forms.TextBox();
+      this.openTourFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.clearTourFileButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(422, 69);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 9;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(499, 69);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 10;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // openVRPFileDialog
+      // 
+      this.openVRPFileDialog.DefaultExt = "vrp";
+      this.openVRPFileDialog.FileName = "vrp";
+      this.openVRPFileDialog.Filter = "TSPLib Format|*.vrp|Solomon Format|*.txt|ORLib Format|*.txt|LiLim Format|*.txt|Cordeau Format|*.md";
+      this.openVRPFileDialog.Title = "Open VRP File";
+      // 
+      // tspFileLabel
+      // 
+      this.tspFileLabel.AutoSize = true;
+      this.tspFileLabel.Location = new System.Drawing.Point(12, 15);
+      this.tspFileLabel.Name = "tspFileLabel";
+      this.tspFileLabel.Size = new System.Drawing.Size(51, 13);
+      this.tspFileLabel.TabIndex = 0;
+      this.tspFileLabel.Text = "&VRP File:";
+      // 
+      // openVRPFileButton
+      // 
+      this.openVRPFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openVRPFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openVRPFileButton.Location = new System.Drawing.Point(520, 10);
+      this.openVRPFileButton.Name = "openVRPFileButton";
+      this.openVRPFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openVRPFileButton.TabIndex = 2;
+      this.openVRPFileButton.UseVisualStyleBackColor = true;
+      this.openVRPFileButton.Click += new System.EventHandler(this.openVRPFileButton_Click);
+      // 
+      // tspFileTextBox
+      // 
+      this.tspFileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tspFileTextBox.Enabled = false;
+      this.tspFileTextBox.Location = new System.Drawing.Point(136, 12);
+      this.tspFileTextBox.Name = "tspFileTextBox";
+      this.tspFileTextBox.ReadOnly = true;
+      this.tspFileTextBox.Size = new System.Drawing.Size(378, 20);
+      this.tspFileTextBox.TabIndex = 1;
+      // 
+      // tourFileLabel
+      // 
+      this.tourFileLabel.AutoSize = true;
+      this.tourFileLabel.Location = new System.Drawing.Point(12, 41);
+      this.tourFileLabel.Name = "tourFileLabel";
+      this.tourFileLabel.Size = new System.Drawing.Size(119, 13);
+      this.tourFileLabel.TabIndex = 5;
+      this.tourFileLabel.Text = "&Optimal VRP Tours File:";
+      // 
+      // openTourFileButton
+      // 
+      this.openTourFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openTourFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openTourFileButton.Location = new System.Drawing.Point(520, 35);
+      this.openTourFileButton.Name = "openTourFileButton";
+      this.openTourFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openTourFileButton.TabIndex = 7;
+      this.openTourFileButton.UseVisualStyleBackColor = true;
+      this.openTourFileButton.Click += new System.EventHandler(this.openTourFileButton_Click);
+      // 
+      // tourFileTextBox
+      // 
+      this.tourFileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tourFileTextBox.Enabled = false;
+      this.tourFileTextBox.Location = new System.Drawing.Point(136, 38);
+      this.tourFileTextBox.Name = "tourFileTextBox";
+      this.tourFileTextBox.ReadOnly = true;
+      this.tourFileTextBox.Size = new System.Drawing.Size(378, 20);
+      this.tourFileTextBox.TabIndex = 6;
+      // 
+      // openTourFileDialog
+      // 
+      this.openTourFileDialog.DefaultExt = "opt";
+      this.openTourFileDialog.FileName = "tour";
+      this.openTourFileDialog.Filter = "Optimal VRP Tour Files|*.opt";
+      this.openTourFileDialog.SupportMultiDottedExtensions = true;
+      this.openTourFileDialog.Title = "Open Optimal TSP Tour File";
+      // 
+      // clearTourFileButton
+      // 
+      this.clearTourFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.clearTourFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearTourFileButton.Location = new System.Drawing.Point(550, 35);
+      this.clearTourFileButton.Name = "clearTourFileButton";
+      this.clearTourFileButton.Size = new System.Drawing.Size(24, 24);
+      this.clearTourFileButton.TabIndex = 8;
+      this.clearTourFileButton.UseVisualStyleBackColor = true;
+      this.clearTourFileButton.Click += new System.EventHandler(this.clearTourFileButton_Click);
+      // 
+      // VRPImportDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(586, 104);
+      this.Controls.Add(this.tourFileTextBox);
+      this.Controls.Add(this.tspFileTextBox);
+      this.Controls.Add(this.clearTourFileButton);
+      this.Controls.Add(this.openTourFileButton);
+      this.Controls.Add(this.openVRPFileButton);
+      this.Controls.Add(this.tourFileLabel);
+      this.Controls.Add(this.tspFileLabel);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.HelpButton = true;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "VRPImportDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Import VRP";
+      this.HelpButtonClicked += new System.ComponentModel.CancelEventHandler(this.VRPImportDialog_HelpButtonClicked);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.OpenFileDialog openVRPFileDialog;
+    private System.Windows.Forms.Label tspFileLabel;
+    private System.Windows.Forms.Button openVRPFileButton;
+    private System.Windows.Forms.TextBox tspFileTextBox;
+    private System.Windows.Forms.Label tourFileLabel;
+    private System.Windows.Forms.Button openTourFileButton;
+    private System.Windows.Forms.TextBox tourFileTextBox;
+    private System.Windows.Forms.OpenFileDialog openTourFileDialog;
+    private System.Windows.Forms.Button clearTourFileButton;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPImportDialog.cs	(revision 15895)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  public enum VRPFormat { Empty, TSPLib, Solomon, ORLib, LiLim, Cordeau }
+
+  public sealed partial class VRPImportDialog : Form {
+    private string vrpFileName;
+    public string VRPFileName {
+      get { return vrpFileName; }
+    }
+    private string tourFileName;
+    public string TourFileName {
+      get { return tourFileName; }
+    }
+    private VRPFormat format;
+    public VRPFormat Format {
+      get { return format; }
+    }
+
+    public VRPImportDialog() {
+      InitializeComponent();
+      vrpFileName = string.Empty;
+      tourFileName = string.Empty;
+      format = VRPFormat.Empty;
+    }
+
+    private void openVRPFileButton_Click(object sender, EventArgs e) {
+      if (openVRPFileDialog.ShowDialog(this) == DialogResult.OK) {
+        tspFileTextBox.Text = openVRPFileDialog.FileName;
+        tspFileTextBox.Enabled = true;
+        vrpFileName = openVRPFileDialog.FileName;
+        okButton.Enabled = true;
+
+        tourFileTextBox.Text = string.Empty;
+        tourFileName = string.Empty;
+
+        format = (VRPFormat)(openVRPFileDialog.FilterIndex);
+      }
+    }
+    private void openTourFileButton_Click(object sender, EventArgs e) {
+      if (openTourFileDialog.ShowDialog(this) == DialogResult.OK) {
+        tourFileTextBox.Text = openTourFileDialog.FileName;
+        tourFileTextBox.Enabled = true;
+        tourFileName = openTourFileDialog.FileName;
+      }
+    }
+    private void clearTourFileButton_Click(object sender, EventArgs e) {
+      tourFileTextBox.Text = string.Empty;
+      tourFileTextBox.Enabled = false;
+      tourFileName = string.Empty;
+    }
+
+    private void VRPImportDialog_HelpButtonClicked(object sender, CancelEventArgs e) {
+      if (MessageBox.Show("Do you want to open the HeuristicLab wiki website?", "Help",
+        MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.Yes) {
+        System.Diagnostics.Process.Start("http://dev.heuristiclab.com/trac/hl/core/wiki/Vehicle%20Routing%20Problem");
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.Designer.cs	(revision 15895)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class VRPProblemInstanceView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.pictureBox = new System.Windows.Forms.PictureBox();
+      this.tabControl1 = new System.Windows.Forms.TabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.tabPage2 = new System.Windows.Forms.TabPage();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.tabControl1.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.tabPage2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
+      this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parameterCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.parameterCollectionView.Size = new System.Drawing.Size(448, 361);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(213, 20);
+      this.nameTextBox.Visible = false;
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.Visible = false;
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.pictureBox.Location = new System.Drawing.Point(3, 3);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(448, 361);
+      this.pictureBox.TabIndex = 1;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      this.pictureBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseClick);
+      // 
+      // tabControl1
+      // 
+      this.tabControl1.Controls.Add(this.tabPage1);
+      this.tabControl1.Controls.Add(this.tabPage2);
+      this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl1.Location = new System.Drawing.Point(0, 0);
+      this.tabControl1.Name = "tabControl1";
+      this.tabControl1.SelectedIndex = 0;
+      this.tabControl1.Size = new System.Drawing.Size(462, 393);
+      this.tabControl1.TabIndex = 2;
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.pictureBox);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(454, 367);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "Visualization";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // tabPage2
+      // 
+      this.tabPage2.Controls.Add(this.parameterCollectionView);
+      this.tabPage2.Location = new System.Drawing.Point(4, 22);
+      this.tabPage2.Name = "tabPage2";
+      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage2.Size = new System.Drawing.Size(454, 367);
+      this.tabPage2.TabIndex = 1;
+      this.tabPage2.Text = "Parameters";
+      this.tabPage2.UseVisualStyleBackColor = true;
+      // 
+      // VRPProblemInstanceView
+      // 
+      this.Controls.Add(this.tabControl1);
+      this.Name = "VRPProblemInstanceView";
+      this.Size = new System.Drawing.Size(462, 393);
+      this.Controls.SetChildIndex(this.tabControl1, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.tabControl1.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage2.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.TabControl tabControl1;
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.TabPage tabPage2;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPProblemInstanceView.cs	(revision 15895)
@@ -0,0 +1,133 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Optimization.Views;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("VRPProblemInstance View")]
+  [Content(typeof(IVRPProblemInstance), true)]
+  public abstract partial class VRPProblemInstanceView : ParameterizedNamedItemView {
+    public new IVRPProblemInstance Content {
+      get { return (IVRPProblemInstance)base.Content; }
+      set { base.Content = value; }
+    }
+
+    private IVRPEncoding solution;
+    public IVRPEncoding Solution {
+      get {
+        return solution;
+      }
+      set {
+        solution = value;
+        GenerateImage();
+      }
+    }
+
+    public VRPProblemInstanceView() {
+      InitializeComponent();
+      Solution = null;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        pictureBox.Image = null;
+      } else {
+        GenerateImage();
+      }
+    }
+
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      GenerateImage();
+    }
+
+    protected virtual void pictureBox_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
+    }
+
+    protected abstract void DrawVisualization(Bitmap bitmap);
+
+    protected List<Pen> GetColors(int count) {
+      List<Pen> result = new List<Pen>();
+
+      int i = 0;
+
+      int r = 255;
+      int g = 255;
+      int b = 255;
+
+      int step = Math.Max(1, 200 * 6 / count);
+
+      while (result.Count != count) {
+        switch (i) {
+          case 0: result.Add(new Pen(Color.FromArgb(0, 0, b)));
+            break;
+          case 1: result.Add(new Pen(Color.FromArgb(0, g, 0)));
+            break;
+          case 2: result.Add(new Pen(Color.FromArgb(r, 0, 0)));
+            break;
+          case 3: result.Add(new Pen(Color.FromArgb(0, g, b)));
+            break;
+          case 4: result.Add(new Pen(Color.FromArgb(r, 0, b)));
+            break;
+          case 5: result.Add(new Pen(Color.FromArgb(r, g, 0)));
+            break;
+        }
+
+        i++;
+        if (i == 6) {
+          i = 0;
+
+          if (r >= step)
+            r -= step;
+
+          if (g >= step)
+            g -= step;
+
+          if (b >= step)
+            b -= step;
+        }
+      }
+
+      return result;
+    }
+
+    protected void GenerateImage() {
+      if ((pictureBox.Width > 0) && (pictureBox.Height > 0)) {
+        if (Content == null) {
+          pictureBox.Image = null;
+        } else {
+          Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+
+          DrawVisualization(bitmap);
+
+          pictureBox.Image = bitmap;
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.Designer.cs	(revision 15895)
@@ -0,0 +1,183 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class VRPSolutionView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.tabControl1 = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.problemInstanceView = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tabPage2 = new System.Windows.Forms.TabPage();
+      this.tourGroupBox = new System.Windows.Forms.GroupBox();
+      this.valueTextBox = new System.Windows.Forms.TextBox();
+      this.tabPage3 = new System.Windows.Forms.TabPage();
+      this.resultsTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl1.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.tabPage2.SuspendLayout();
+      this.tourGroupBox.SuspendLayout();
+      this.tabPage3.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl1
+      // 
+      this.tabControl1.AllowDrop = true;
+      this.tabControl1.Controls.Add(this.tabPage1);
+      this.tabControl1.Controls.Add(this.tabPage2);
+      this.tabControl1.Controls.Add(this.tabPage3);
+      this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl1.Location = new System.Drawing.Point(0, 0);
+      this.tabControl1.Name = "tabControl1";
+      this.tabControl1.SelectedIndex = 0;
+      this.tabControl1.Size = new System.Drawing.Size(468, 415);
+      this.tabControl1.TabIndex = 0;
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.problemInstanceView);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(460, 389);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "ProblemInstance";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // problemInstanceView
+      // 
+      this.problemInstanceView.Caption = "View";
+      this.problemInstanceView.Content = null;
+      this.problemInstanceView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.problemInstanceView.Enabled = false;
+      this.problemInstanceView.Location = new System.Drawing.Point(3, 3);
+      this.problemInstanceView.Name = "problemInstanceView";
+      this.problemInstanceView.ReadOnly = false;
+      this.problemInstanceView.Size = new System.Drawing.Size(454, 383);
+      this.problemInstanceView.TabIndex = 0;
+      this.problemInstanceView.ViewsLabelVisible = true;
+      this.problemInstanceView.ViewType = null;
+      // 
+      // tabPage2
+      // 
+      this.tabPage2.Controls.Add(this.tourGroupBox);
+      this.tabPage2.Location = new System.Drawing.Point(4, 22);
+      this.tabPage2.Name = "tabPage2";
+      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage2.Size = new System.Drawing.Size(460, 389);
+      this.tabPage2.TabIndex = 1;
+      this.tabPage2.Text = "Tours";
+      this.tabPage2.UseVisualStyleBackColor = true;
+      // 
+      // tourGroupBox
+      // 
+      this.tourGroupBox.Controls.Add(this.valueTextBox);
+      this.tourGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tourGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.tourGroupBox.Name = "tourGroupBox";
+      this.tourGroupBox.Size = new System.Drawing.Size(454, 383);
+      this.tourGroupBox.TabIndex = 1;
+      this.tourGroupBox.TabStop = false;
+      this.tourGroupBox.Text = "Tour";
+      // 
+      // valueTextBox
+      // 
+      this.valueTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.valueTextBox.Location = new System.Drawing.Point(3, 16);
+      this.valueTextBox.Multiline = true;
+      this.valueTextBox.Name = "valueTextBox";
+      this.valueTextBox.ReadOnly = true;
+      this.valueTextBox.Size = new System.Drawing.Size(448, 364);
+      this.valueTextBox.TabIndex = 0;
+      // 
+      // tabPage3
+      // 
+      this.tabPage3.Controls.Add(this.resultsTextBox);
+      this.tabPage3.Location = new System.Drawing.Point(4, 22);
+      this.tabPage3.Name = "tabPage3";
+      this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage3.Size = new System.Drawing.Size(460, 389);
+      this.tabPage3.TabIndex = 2;
+      this.tabPage3.Text = "Results";
+      this.tabPage3.UseVisualStyleBackColor = true;
+      // 
+      // resultsTextBox
+      // 
+      this.resultsTextBox.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.resultsTextBox.Location = new System.Drawing.Point(6, 6);
+      this.resultsTextBox.Multiline = true;
+      this.resultsTextBox.Name = "resultsTextBox";
+      this.resultsTextBox.ReadOnly = true;
+      this.resultsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.resultsTextBox.Size = new System.Drawing.Size(448, 377);
+      this.resultsTextBox.TabIndex = 0;
+      // 
+      // VRPSolutionView
+      // 
+      this.Controls.Add(this.tabControl1);
+      this.Name = "VRPSolutionView";
+      this.Size = new System.Drawing.Size(468, 415);
+      this.tabControl1.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage2.ResumeLayout(false);
+      this.tourGroupBox.ResumeLayout(false);
+      this.tourGroupBox.PerformLayout();
+      this.tabPage3.ResumeLayout(false);
+      this.tabPage3.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl1;
+    private System.Windows.Forms.TabPage tabPage1;
+    private MainForm.WindowsForms.ViewHost problemInstanceView;
+    private System.Windows.Forms.TabPage tabPage2;
+    private System.Windows.Forms.GroupBox tourGroupBox;
+    private System.Windows.Forms.TextBox valueTextBox;
+    private System.Windows.Forms.TabPage tabPage3;
+    private System.Windows.Forms.TextBox resultsTextBox;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VRPSolutionView.cs	(revision 15895)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("VRPSolution View")]
+  [Content(typeof(VRPSolution), true)]
+  public partial class VRPSolutionView : HeuristicLab.Core.Views.ItemView {
+    public new VRPSolution Content {
+      get { return (VRPSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public VRPSolutionView() {
+      InitializeComponent();
+      problemInstanceView.ViewsLabelVisible = false;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.SolutionChanged -= new EventHandler(Content_SolutionChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.SolutionChanged += new EventHandler(Content_SolutionChanged);
+    }
+
+    private void UpdateContent() {
+      var view = problemInstanceView.ActiveView as VRPProblemInstanceView;
+      if (view != null) view.Solution = null;
+
+      problemInstanceView.Content = Content.ProblemInstance;
+
+      view = problemInstanceView.ActiveView as VRPProblemInstanceView;
+      if (view != null) view.Solution = Content.Solution;
+
+      UpdateTourView();
+      UpdateResultsView();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        problemInstanceView.Content = null;
+      } else {
+        UpdateContent();
+      }
+    }
+
+    private void Content_SolutionChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_SolutionChanged), sender, e);
+      else {
+        UpdateContent();
+      }
+    }
+
+    protected override void OnReadOnlyChanged() {
+      base.OnReadOnlyChanged();
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      tabControl1.Enabled = Content != null;
+      problemInstanceView.Enabled = Content != null;
+    }
+
+    private void UpdateTourView() {
+      var sb = new StringBuilder();
+
+      if (Content != null && Content.Solution != null) {
+        foreach (var tour in Content.Solution.GetTours()) {
+          foreach (var city in tour.Stops) {
+            sb.Append(city);
+            sb.Append(" ");
+          }
+          sb.AppendLine();
+        }
+      }
+
+      valueTextBox.Text = sb.ToString();
+    }
+    
+    private void UpdateResultsView() {
+      var builder = new StringBuilder();
+      if (Content != null && Content.Solution != null) {
+        var evaluationInfo = Content.ProblemInstance.Evaluate(Content.Solution);
+        evaluationInfo.GetReport(builder);
+      }
+      resultsTextBox.Text = builder.ToString();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.Designer.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  partial class VehicleRoutingProblemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting.Views/3.4/VehicleRoutingProblemView.cs	(revision 15895)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.VehicleRouting.Views {
+  [View("Vehicle Routing Problem View")]
+  [Content(typeof(VehicleRoutingProblem), IsDefaultView = true)]
+  public partial class VehicleRoutingProblemView : ProblemView {
+    public VehicleRoutingProblemView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursAnalyzer.cs	(revision 15895)
@@ -0,0 +1,208 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, IGeneralVRPOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstDistance"]; }
+    }
+    public ValueLookupParameter<DataTable> DistancesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Distances"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DataTable> VehiclesUtilizedValuesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["VehiclesUtilizedValues"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    private BestVRPToursMemorizer BestMemorizer {
+      get { return (BestVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstVRPToursAnalyzer()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distance of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestDistance", "The current best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageDistance", "The current average distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstDistance", "The current worst distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Distances", "The data table to store the current best, current average, current worst, best and best known distance value."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The vehicles utilized of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best  vehicles utilized value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestVehiclesUtilized", "The current best  vehicles utilized value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageVehiclesUtilized", "The current average  vehicles utilized value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstVehiclesUtilized", "The current worst  vehicles utilized value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("VehiclesUtilizedValues", "The data table to store the current best, current average, current worst, best and best known vehicles utilized value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestVRPToursMemorizer bestMemorizer = new BestVRPToursMemorizer();
+      BestAverageWorstVRPToursCalculator calculator = new BestAverageWorstVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //Distance
+      bestMemorizer.BestDistanceParameter.ActualName = BestDistanceParameter.Name;
+      bestMemorizer.DistanceParameter.ActualName = DistanceParameter.Name;
+      bestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
+
+      calculator.DistanceParameter.ActualName = DistanceParameter.Name;
+      calculator.DistanceParameter.Depth = DistanceParameter.Depth;
+      calculator.BestDistanceParameter.ActualName = CurrentBestDistanceParameter.Name;
+      calculator.AverageDistanceParameter.ActualName = CurrentAverageDistanceParameter.Name;
+      calculator.WorstDistanceParameter.ActualName = CurrentWorstDistanceParameter.Name;
+
+      DataTableValuesCollector distanceDataTablesCollector = new DataTableValuesCollector();
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestDistance", null, BestDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestDistance", null, CurrentBestDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageDistance", null, CurrentAverageDistanceParameter.Name));
+      distanceDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstDistance", null, CurrentWorstDistanceParameter.Name));
+      distanceDataTablesCollector.DataTableParameter.ActualName = DistancesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(DistancesParameter.Name));
+
+      //Vehicles Utlized
+      bestMemorizer.BestVehiclesUtilizedParameter.ActualName = BestVehiclesUtilizedParameter.Name;
+      bestMemorizer.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
+      bestMemorizer.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+
+      calculator.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
+      calculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+      calculator.BestVehiclesUtilizedParameter.ActualName = CurrentBestVehiclesUtilizedParameter.Name;
+      calculator.AverageVehiclesUtilizedParameter.ActualName = CurrentAverageVehiclesUtilizedParameter.Name;
+      calculator.WorstVehiclesUtilizedParameter.ActualName = CurrentWorstVehiclesUtilizedParameter.Name;
+
+      DataTableValuesCollector vehiclesUtilizedDataTablesCollector = new DataTableValuesCollector();
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestVehiclesUtilized", null, BestVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestVehiclesUtilized", null, CurrentBestVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageVehiclesUtilized", null, CurrentAverageVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstVehiclesUtilized", null, CurrentWorstVehiclesUtilizedParameter.Name));
+      vehiclesUtilizedDataTablesCollector.DataTableParameter.ActualName = VehiclesUtilizedValuesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(VehiclesUtilizedValuesParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = distanceDataTablesCollector;
+      distanceDataTablesCollector.Successor = vehiclesUtilizedDataTablesCollector;
+      vehiclesUtilizedDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstVRPToursAnalyzer(bool deserializing) : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstVRPToursAnalyzer(this, cloner);
+    }
+
+    private BestAverageWorstVRPToursAnalyzer(BestAverageWorstVRPToursAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      this.Initialize();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      DistanceParameter.DepthChanged += new EventHandler(DistanceParameter_DepthChanged);
+      VehiclesUtilizedParameter.DepthChanged += new EventHandler(VehiclesUtilizedParameter_DepthChanged);
+    }
+
+    void DistanceParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.DistanceParameter.Depth = DistanceParameter.Depth;
+      BestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
+    }
+
+    void VehiclesUtilizedParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
+      BestMemorizer.VehiclesUtilizedParameter.Depth = DistanceParameter.Depth;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestAverageWorstVRPToursCalculator.cs	(revision 15895)
@@ -0,0 +1,135 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstDistance"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageVehiclesUtilized"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstVehiclesUtilized"]; }
+    }
+
+    public BestAverageWorstVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageDistance", "The average distance value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstDistance", "The worst distance value of all solutions."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best utilized vehicles value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageVehiclesUtilized", "The average utilized vehicles value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstVehiclesUtilized", "The worst utilized vehicles value of all solutions."));
+    }
+
+    [StorableConstructor]
+    private BestAverageWorstVRPToursCalculator(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstVRPToursCalculator(this, cloner);
+    }
+
+    private BestAverageWorstVRPToursCalculator(BestAverageWorstVRPToursCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void UpdateDistances() {
+      ItemArray<DoubleValue> distances = DistanceParameter.ActualValue;
+      if (distances.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < distances.Length; i++) {
+          if (distances[i].Value < min) min = distances[i].Value;
+          if (distances[i].Value > max) max = distances[i].Value;
+          sum += distances[i].Value;
+        }
+
+        DoubleValue best = BestDistanceParameter.ActualValue;
+        if (best == null) BestDistanceParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageDistanceParameter.ActualValue;
+        if (average == null) AverageDistanceParameter.ActualValue = new DoubleValue(sum / distances.Length);
+        else average.Value = sum / distances.Length;
+        DoubleValue worst = WorstDistanceParameter.ActualValue;
+        if (worst == null) WorstDistanceParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+
+    private void UpdateVehiclesUtilized() {
+      ItemArray<DoubleValue> vehiclesUtilized = VehiclesUtilizedParameter.ActualValue;
+      if (vehiclesUtilized.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < vehiclesUtilized.Length; i++) {
+          if (vehiclesUtilized[i].Value < min) min = vehiclesUtilized[i].Value;
+          if (vehiclesUtilized[i].Value > max) max = vehiclesUtilized[i].Value;
+          sum += vehiclesUtilized[i].Value;
+        }
+
+        DoubleValue best = BestVehiclesUtilizedParameter.ActualValue;
+        if (best == null) BestVehiclesUtilizedParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageVehiclesUtilizedParameter.ActualValue;
+        if (average == null) AverageVehiclesUtilizedParameter.ActualValue = new DoubleValue(sum / vehiclesUtilized.Length);
+        else average.Value = sum / vehiclesUtilized.Length;
+        DoubleValue worst = WorstVehiclesUtilizedParameter.ActualValue;
+        if (worst == null) WorstVehiclesUtilizedParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdateDistances();
+      UpdateVehiclesUtilized();
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/BestVRPToursMemorizer.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestDistanceParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestDistance"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestVehiclesUtilizedParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestVehiclesUtilized"]; }
+    }
+
+    public BestVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestDistance", "The best distance found so far."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best vehicles utilized found so far."));
+
+    }
+
+    [StorableConstructor]
+    protected BestVRPToursMemorizer(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestVRPToursMemorizer(this, cloner);
+    }
+
+    protected BestVRPToursMemorizer(BestVRPToursMemorizer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      int i = DistanceParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestDistanceParameter.ActualValue == null)
+        BestDistanceParameter.ActualValue = new DoubleValue(DistanceParameter.ActualValue[i].Value);
+      else if (DistanceParameter.ActualValue[i].Value <= BestDistanceParameter.ActualValue.Value)
+        BestDistanceParameter.ActualValue.Value = DistanceParameter.ActualValue[i].Value;
+
+      i = VehiclesUtilizedParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestVehiclesUtilizedParameter.ActualValue == null)
+        BestVehiclesUtilizedParameter.ActualValue = new DoubleValue(VehiclesUtilizedParameter.ActualValue[i].Value);
+      else if (VehiclesUtilizedParameter.ActualValue[i].Value <= BestVehiclesUtilizedParameter.ActualValue.Value)
+        BestVehiclesUtilizedParameter.ActualValue.Value = VehiclesUtilizedParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursAnalyzer.cs	(revision 15895)
@@ -0,0 +1,155 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstCapaciatatedVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstCapaciatatedVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, IHomogenousCapacitatedOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstOverload"]; }
+    }
+    public ValueLookupParameter<DataTable> OverloadsParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["Overloads"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    private BestCapacitatedVRPToursMemorizer BestMemorizer {
+      get { return (BestCapacitatedVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstCapacitatedVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstCapacitatedVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstCapaciatatedVRPToursAnalyzer()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestOverload", "The current best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageOverload", "The current average overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstOverload", "The current worst overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("Overloads", "The data table to store the current best, current average, current worst, best and best known overload value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestCapacitatedVRPToursMemorizer bestMemorizer = new BestCapacitatedVRPToursMemorizer();
+      BestAverageWorstCapacitatedVRPToursCalculator calculator = new BestAverageWorstCapacitatedVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //overload
+      bestMemorizer.BestOverloadParameter.ActualName = BestOverloadParameter.Name;
+      bestMemorizer.OverloadParameter.ActualName = OverloadParameter.Name;
+      bestMemorizer.OverloadParameter.Depth = OverloadParameter.Depth;
+
+      calculator.OverloadParameter.ActualName = OverloadParameter.Name;
+      calculator.OverloadParameter.Depth = OverloadParameter.Depth;
+      calculator.BestOverloadParameter.ActualName = CurrentBestOverloadParameter.Name;
+      calculator.AverageOverloadParameter.ActualName = CurrentAverageOverloadParameter.Name;
+      calculator.WorstOverloadParameter.ActualName = CurrentWorstOverloadParameter.Name;
+
+      DataTableValuesCollector overloadDataTablesCollector = new DataTableValuesCollector();
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestOverload", null, BestOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestOverload", null, CurrentBestOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageOverload", null, CurrentAverageOverloadParameter.Name));
+      overloadDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstOverload", null, CurrentWorstOverloadParameter.Name));
+      overloadDataTablesCollector.DataTableParameter.ActualName = OverloadsParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(OverloadsParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = overloadDataTablesCollector;
+      overloadDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstCapaciatatedVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      OverloadParameter.DepthChanged += new EventHandler(OverloadParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstCapaciatatedVRPToursAnalyzer(this, cloner);
+    }
+
+    private BestAverageWorstCapaciatatedVRPToursAnalyzer(BestAverageWorstCapaciatatedVRPToursAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      this.Initialize();
+    }
+
+    void OverloadParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.OverloadParameter.Depth = OverloadParameter.Depth;
+      BestMemorizer.OverloadParameter.Depth = OverloadParameter.Depth;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestAverageWorstCapacitatedVRPToursCalculator.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstCapacitatedVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstCapacitatedVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageOverload"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstOverload"]; }
+    }
+
+    public BestAverageWorstCapacitatedVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageOverload", "The average overload value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstOverload", "The worst overload value of all solutions."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstCapacitatedVRPToursCalculator(this, cloner);
+    }
+
+    private BestAverageWorstCapacitatedVRPToursCalculator(BestAverageWorstCapacitatedVRPToursCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    private BestAverageWorstCapacitatedVRPToursCalculator(bool deserializing) : base(deserializing) { }
+
+    private void UpdateOverloads() {
+      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
+      if (overloads.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < overloads.Length; i++) {
+          if (overloads[i].Value < min) min = overloads[i].Value;
+          if (overloads[i].Value > max) max = overloads[i].Value;
+          sum += overloads[i].Value;
+        }
+
+        DoubleValue best = BestOverloadParameter.ActualValue;
+        if (best == null) BestOverloadParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageOverloadParameter.ActualValue;
+        if (average == null) AverageOverloadParameter.ActualValue = new DoubleValue(sum / overloads.Length);
+        else average.Value = sum / overloads.Length;
+        DoubleValue worst = WorstOverloadParameter.ActualValue;
+        if (worst == null) WorstOverloadParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdateOverloads();
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/Capacitated/BestCapacitatedVRPToursMemorizer.cs	(revision 15895)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestCapacitatedVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestCapacitatedVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestOverloadParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestOverload"]; }
+    }
+
+    public BestCapacitatedVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload found so far."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestCapacitatedVRPToursMemorizer(this, cloner);
+    }
+
+    protected BestCapacitatedVRPToursMemorizer(BestCapacitatedVRPToursMemorizer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected BestCapacitatedVRPToursMemorizer(bool deserializing) : base(deserializing) { }
+
+    public override IOperation Apply() {
+      int i = OverloadParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestOverloadParameter.ActualValue == null)
+        BestOverloadParameter.ActualValue = new DoubleValue(OverloadParameter.ActualValue[i].Value);
+      else if (OverloadParameter.ActualValue[i].Value <= BestOverloadParameter.ActualValue.Value)
+        BestOverloadParameter.ActualValue.Value = OverloadParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursAnalyzer.cs	(revision 15895)
@@ -0,0 +1,155 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstPickupAndDeliveryVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstPickupAndDeliveryVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, IPickupAndDeliveryOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+    public ValueLookupParameter<IntValue> BestPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["BestPickupViolations"]; }
+    }
+    public ValueLookupParameter<IntValue> CurrentBestPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["CurrentBestPickupViolations"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAveragePickupViolationsParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAveragePickupViolations"]; }
+    }
+    public ValueLookupParameter<IntValue> CurrentWorstPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["CurrentWorstPickupViolations"]; }
+    }
+    public ValueLookupParameter<DataTable> PickupViolationsValuesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["PickupViolationsValues"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    private BestPickupAndDeliveryVRPToursMemorizer BestMemorizer {
+      get { return (BestPickupAndDeliveryVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstPickupAndDeliveryVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstPickupAndDeliveryVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstPickupAndDeliveryVRPToursAnalyzer()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violations of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("BestPickupViolations", "The best pickup violations value."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("CurrentBestPickupViolations", "The current best pickup violations value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAveragePickupViolations", "The current average pickup violations value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("CurrentWorstPickupViolations", "The current worst pickup violations value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("PickupViolationsValues", "The data table to store the current best, current average, current worst, best and best known pickup violations value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestPickupAndDeliveryVRPToursMemorizer bestMemorizer = new BestPickupAndDeliveryVRPToursMemorizer();
+      BestAverageWorstPickupAndDeliveryVRPToursCalculator calculator = new BestAverageWorstPickupAndDeliveryVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //pickup violations
+      bestMemorizer.BestPickupViolationsParameter.ActualName = BestPickupViolationsParameter.Name;
+      bestMemorizer.PickupViolationsParameter.ActualName = PickupViolationsParameter.Name;
+      bestMemorizer.PickupViolationsParameter.Depth = PickupViolationsParameter.Depth;
+
+      calculator.PickupViolationsParameter.ActualName = PickupViolationsParameter.Name;
+      calculator.PickupViolationsParameter.Depth = PickupViolationsParameter.Depth;
+      calculator.BestPickupViolationsParameter.ActualName = CurrentBestPickupViolationsParameter.Name;
+      calculator.AveragePickupViolationsParameter.ActualName = CurrentAveragePickupViolationsParameter.Name;
+      calculator.WorstPickupViolationsParameter.ActualName = CurrentWorstPickupViolationsParameter.Name;
+
+      DataTableValuesCollector pickupViolationsDataTablesCollector = new DataTableValuesCollector();
+      pickupViolationsDataTablesCollector.CollectedValues.Add(new LookupParameter<IntValue>("BestPickupViolations", null, BestPickupViolationsParameter.Name));
+      pickupViolationsDataTablesCollector.CollectedValues.Add(new LookupParameter<IntValue>("CurrentBestPickupViolations", null, CurrentBestPickupViolationsParameter.Name));
+      pickupViolationsDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAveragePickupViolations", null, CurrentAveragePickupViolationsParameter.Name));
+      pickupViolationsDataTablesCollector.CollectedValues.Add(new LookupParameter<IntValue>("CurrentWorstPickupViolations", null, CurrentWorstPickupViolationsParameter.Name));
+      pickupViolationsDataTablesCollector.DataTableParameter.ActualName = PickupViolationsValuesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(PickupViolationsValuesParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = pickupViolationsDataTablesCollector;
+      pickupViolationsDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstPickupAndDeliveryVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      PickupViolationsParameter.DepthChanged += new EventHandler(PickupViolationsParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstPickupAndDeliveryVRPToursAnalyzer(this, cloner);
+    }
+
+    private BestAverageWorstPickupAndDeliveryVRPToursAnalyzer(BestAverageWorstPickupAndDeliveryVRPToursAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      this.Initialize();
+    }
+
+    void PickupViolationsParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.PickupViolationsParameter.Depth = PickupViolationsParameter.Depth;
+      BestMemorizer.PickupViolationsParameter.Depth = PickupViolationsParameter.Depth;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursCalculator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursCalculator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestAverageWorstPickupAndDeliveryVRPToursCalculator.cs	(revision 15895)
@@ -0,0 +1,93 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstPickupAndDeliveryVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstPickupAndDeliveryVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+    public ValueLookupParameter<IntValue> BestPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["BestPickupViolations"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AveragePickupViolationsParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AveragePickupViolations"]; }
+    }
+    public ValueLookupParameter<IntValue> WorstPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["WorstPickupViolations"]; }
+    }
+
+    public BestAverageWorstPickupAndDeliveryVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violations of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("BestPickupViolations", "The best pickup violations value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AveragePickupViolations", "The average pickup violations value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("WorstPickupViolations", "The worst pickup violations value of all solutions."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstPickupAndDeliveryVRPToursCalculator(this, cloner);
+    }
+
+    private BestAverageWorstPickupAndDeliveryVRPToursCalculator(BestAverageWorstPickupAndDeliveryVRPToursCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    private BestAverageWorstPickupAndDeliveryVRPToursCalculator(bool deserializing) : base(deserializing) { }
+
+    private void UpdatePickupViolations() {
+      ItemArray<IntValue> pickupViolations = PickupViolationsParameter.ActualValue;
+      if (pickupViolations.Length > 0) {
+        int min = int.MaxValue, max = int.MinValue, sum = 0;
+        for (int i = 0; i < pickupViolations.Length; i++) {
+          if (pickupViolations[i].Value < min) min = pickupViolations[i].Value;
+          if (pickupViolations[i].Value > max) max = pickupViolations[i].Value;
+          sum += pickupViolations[i].Value;
+        }
+
+        IntValue best = BestPickupViolationsParameter.ActualValue;
+        if (best == null) BestPickupViolationsParameter.ActualValue = new IntValue(min);
+        else best.Value = min;
+        DoubleValue average = AveragePickupViolationsParameter.ActualValue;
+        if (average == null) AveragePickupViolationsParameter.ActualValue = new DoubleValue(sum / pickupViolations.Length);
+        else average.Value = sum / pickupViolations.Length;
+        IntValue worst = WorstPickupViolationsParameter.ActualValue;
+        if (worst == null) WorstPickupViolationsParameter.ActualValue = new IntValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdatePickupViolations();
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestPickupAndDeliveryVRPToursMemorizer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestPickupAndDeliveryVRPToursMemorizer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/PickupAndDelivery/BestPickupAndDeliveryVRPToursMemorizer.cs	(revision 15895)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestPickupAndDeliveryVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestPickupAndDeliveryVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    public ValueLookupParameter<IntValue> BestPickupViolationsParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["BestPickupViolations"]; }
+    }
+
+    public BestPickupAndDeliveryVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violations of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<IntValue>("BestPickupViolations", "The best pickup violations found so far."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestPickupAndDeliveryVRPToursMemorizer(this, cloner);
+    }
+
+    protected BestPickupAndDeliveryVRPToursMemorizer(BestPickupAndDeliveryVRPToursMemorizer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected BestPickupAndDeliveryVRPToursMemorizer(bool deserializing) : base(deserializing) { }
+
+    public override IOperation Apply() {
+      int i = PickupViolationsParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestPickupViolationsParameter.ActualValue == null)
+        BestPickupViolationsParameter.ActualValue = new IntValue(PickupViolationsParameter.ActualValue[i].Value);
+      else if (PickupViolationsParameter.ActualValue[i].Value <= BestPickupViolationsParameter.ActualValue.Value)
+        BestPickupViolationsParameter.ActualValue.Value = PickupViolationsParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursAnalyzer.cs	(revision 15895)
@@ -0,0 +1,208 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
+  /// </summary>
+  [Item("BestAverageWorstTimeWindowedVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstTimeWindowedVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, ITimeWindowedOperator {
+    #region Parameter properties
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstTardiness"]; }
+    }
+    public ValueLookupParameter<DataTable> TardinessValuesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["TardinessValues"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentBestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentBestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentAverageTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentAverageTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> CurrentWorstTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["CurrentWorstTravelTime"]; }
+    }
+    public ValueLookupParameter<DataTable> TravelTimesParameter {
+      get { return (ValueLookupParameter<DataTable>)Parameters["TravelTimes"]; }
+    }
+
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Properties
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+    private BestTimeWindowedVRPToursMemorizer BestMemorizer {
+      get { return (BestTimeWindowedVRPToursMemorizer)OperatorGraph.InitialOperator; }
+    }
+    private BestAverageWorstTimeWindowedVRPToursCalculator BestAverageWorstCalculator {
+      get { return (BestAverageWorstTimeWindowedVRPToursCalculator)BestMemorizer.Successor; }
+    }
+    #endregion
+
+    public BestAverageWorstTimeWindowedVRPToursAnalyzer()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestTardiness", "The current best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageTardiness", "The current average tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstTardiness", "The current worst tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("TardinessValues", "The data table to store the current best, current average, current worst, best and best known tardiness value."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel time of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentBestTravelTime", "The current best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentAverageTravelTime", "The current average travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstTravelTime", "The current worst travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DataTable>("TravelTimes", "The data table to store the current best, current average, current worst, best and best known travel time value."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The results collection where the analysis values should be stored."));
+      #endregion
+
+      #region Create operators
+      BestTimeWindowedVRPToursMemorizer bestMemorizer = new BestTimeWindowedVRPToursMemorizer();
+      BestAverageWorstTimeWindowedVRPToursCalculator calculator = new BestAverageWorstTimeWindowedVRPToursCalculator();
+      ResultsCollector resultsCollector = new ResultsCollector();
+
+      //tardiness
+      bestMemorizer.BestTardinessParameter.ActualName = BestTardinessParameter.Name;
+      bestMemorizer.TardinessParameter.ActualName = TardinessParameter.Name;
+      bestMemorizer.TardinessParameter.Depth = TardinessParameter.Depth;
+
+      calculator.TardinessParameter.ActualName = TardinessParameter.Name;
+      calculator.TardinessParameter.Depth = TardinessParameter.Depth;
+      calculator.BestTardinessParameter.ActualName = CurrentBestTardinessParameter.Name;
+      calculator.AverageTardinessParameter.ActualName = CurrentAverageTardinessParameter.Name;
+      calculator.WorstTardinessParameter.ActualName = CurrentWorstTardinessParameter.Name;
+
+      DataTableValuesCollector tardinessDataTablesCollector = new DataTableValuesCollector();
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestTardiness", null, BestTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestTardiness", null, CurrentBestTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageTardiness", null, CurrentAverageTardinessParameter.Name));
+      tardinessDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstTardiness", null, CurrentWorstTardinessParameter.Name));
+      tardinessDataTablesCollector.DataTableParameter.ActualName = TardinessValuesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(TardinessValuesParameter.Name));
+
+      //Travel Time
+      bestMemorizer.BestTravelTimeParameter.ActualName = BestTravelTimeParameter.Name;
+      bestMemorizer.TravelTimeParameter.ActualName = TravelTimeParameter.Name;
+      bestMemorizer.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+
+      calculator.TravelTimeParameter.ActualName = TravelTimeParameter.Name;
+      calculator.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+      calculator.BestTravelTimeParameter.ActualName = CurrentBestTravelTimeParameter.Name;
+      calculator.AverageTravelTimeParameter.ActualName = CurrentAverageTravelTimeParameter.Name;
+      calculator.WorstTravelTimeParameter.ActualName = CurrentWorstTravelTimeParameter.Name;
+
+      DataTableValuesCollector travelTimeDataTablesCollector = new DataTableValuesCollector();
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("BestTravelTime", null, BestTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentBestTravelTime", null, CurrentBestTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentAverageTravelTime", null, CurrentAverageTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("CurrentWorstTravelTime", null, CurrentWorstTravelTimeParameter.Name));
+      travelTimeDataTablesCollector.DataTableParameter.ActualName = TravelTimesParameter.Name;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(TravelTimesParameter.Name));
+      #endregion
+
+      #region Create operator graph
+      OperatorGraph.InitialOperator = bestMemorizer;
+      bestMemorizer.Successor = calculator;
+      calculator.Successor = tardinessDataTablesCollector;
+      tardinessDataTablesCollector.Successor = travelTimeDataTablesCollector;
+      travelTimeDataTablesCollector.Successor = resultsCollector;
+      resultsCollector.Successor = null;
+      #endregion
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private BestAverageWorstTimeWindowedVRPToursAnalyzer(bool deserializing) : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      TardinessParameter.DepthChanged += new EventHandler(TardinessParameter_DepthChanged);
+      TravelTimeParameter.DepthChanged += new EventHandler(TravelTimeParameter_DepthChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstTimeWindowedVRPToursAnalyzer(this, cloner);
+    }
+
+    private BestAverageWorstTimeWindowedVRPToursAnalyzer(BestAverageWorstTimeWindowedVRPToursAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      this.Initialize();
+    }
+
+    void TardinessParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TardinessParameter.Depth = TardinessParameter.Depth;
+      BestMemorizer.TardinessParameter.Depth = TardinessParameter.Depth;
+    }
+
+    void TravelTimeParameter_DepthChanged(object sender, EventArgs e) {
+      BestAverageWorstCalculator.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+      BestMemorizer.TravelTimeParameter.Depth = TravelTimeParameter.Depth;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestAverageWorstTimeWindowedVRPToursCalculator.cs	(revision 15895)
@@ -0,0 +1,134 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestAverageWorstTimeWindowedVRPToursCalculator", "An operator which calculates the current best, average and worst properties of VRP tours in the scope tree.")]
+  [StorableClass]
+  public sealed class BestAverageWorstTimeWindowedVRPToursCalculator : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstTardiness"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> AverageTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["AverageTravelTime"]; }
+    }
+    public ValueLookupParameter<DoubleValue> WorstTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["WorstTravelTime"]; }
+    }
+
+    public BestAverageWorstTimeWindowedVRPToursCalculator()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageTardiness", "The average tardiness value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstTardiness", "The worst tardiness value of all solutions."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time value."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("AverageTravelTime", "The average travel time value of all solutions."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("WorstTravelTime", "The worst travel time value of all solutions."));
+    }
+
+    [StorableConstructor]
+    private BestAverageWorstTimeWindowedVRPToursCalculator(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstTimeWindowedVRPToursCalculator(this, cloner);
+    }
+
+    private BestAverageWorstTimeWindowedVRPToursCalculator(BestAverageWorstTimeWindowedVRPToursCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void UpdateTardiness() {
+      ItemArray<DoubleValue> tardiness = TardinessParameter.ActualValue;
+      if (tardiness.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < tardiness.Length; i++) {
+          if (tardiness[i].Value < min) min = tardiness[i].Value;
+          if (tardiness[i].Value > max) max = tardiness[i].Value;
+          sum += tardiness[i].Value;
+        }
+
+        DoubleValue best = BestTardinessParameter.ActualValue;
+        if (best == null) BestTardinessParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageTardinessParameter.ActualValue;
+        if (average == null) AverageTardinessParameter.ActualValue = new DoubleValue(sum / tardiness.Length);
+        else average.Value = sum / tardiness.Length;
+        DoubleValue worst = WorstTardinessParameter.ActualValue;
+        if (worst == null) WorstTardinessParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    private void UpdateTravelTimes() {
+      ItemArray<DoubleValue> travelTimes = TravelTimeParameter.ActualValue;
+      if (travelTimes.Length > 0) {
+        double min = double.MaxValue, max = double.MinValue, sum = 0.0;
+        for (int i = 0; i < travelTimes.Length; i++) {
+          if (travelTimes[i].Value < min) min = travelTimes[i].Value;
+          if (travelTimes[i].Value > max) max = travelTimes[i].Value;
+          sum += travelTimes[i].Value;
+        }
+
+        DoubleValue best = BestTravelTimeParameter.ActualValue;
+        if (best == null) BestTravelTimeParameter.ActualValue = new DoubleValue(min);
+        else best.Value = min;
+        DoubleValue average = AverageTravelTimeParameter.ActualValue;
+        if (average == null) AverageTravelTimeParameter.ActualValue = new DoubleValue(sum / travelTimes.Length);
+        else average.Value = sum / travelTimes.Length;
+        DoubleValue worst = WorstTravelTimeParameter.ActualValue;
+        if (worst == null) WorstTravelTimeParameter.ActualValue = new DoubleValue(max);
+        else worst.Value = max;
+      }
+    }
+
+    public override IOperation Apply() {
+      UpdateTardiness();
+      UpdateTravelTimes();
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestAverageWorstTours/TimeWindowed/BestTimeWindowedVRPToursMemorizer.cs	(revision 15895)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("BestTimeWindowedVRPToursMemorizer", "An operator that updates the best VRP tour found so far in the scope three.")]
+  [StorableClass]
+  public class BestTimeWindowedVRPToursMemorizer : SingleSuccessorOperator {
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> BestTardinessParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTardiness"]; }
+    }
+    public ValueLookupParameter<DoubleValue> BestTravelTimeParameter {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["BestTravelTime"]; }
+    }
+
+    public BestTimeWindowedVRPToursMemorizer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness found so far."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTravelTime", "The best travel time found so far."));
+    }
+
+    public override IOperation Apply() {
+      int i = TardinessParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestTardinessParameter.ActualValue == null)
+        BestTardinessParameter.ActualValue = new DoubleValue(TardinessParameter.ActualValue[i].Value);
+      else if (TardinessParameter.ActualValue[i].Value <= BestTardinessParameter.ActualValue.Value)
+        BestTardinessParameter.ActualValue.Value = TardinessParameter.ActualValue[i].Value;
+
+      i = TravelTimeParameter.ActualValue.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      if (BestTravelTimeParameter.ActualValue == null)
+        BestTravelTimeParameter.ActualValue = new DoubleValue(TravelTimeParameter.ActualValue[i].Value);
+      else if (TravelTimeParameter.ActualValue[i].Value <= BestTravelTimeParameter.ActualValue.Value)
+        BestTravelTimeParameter.ActualValue.Value = TravelTimeParameter.ActualValue[i].Value;
+
+      return base.Apply();
+    }
+
+    [StorableConstructor]
+    protected BestTimeWindowedVRPToursMemorizer(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestTimeWindowedVRPToursMemorizer(this, cloner);
+    }
+
+    protected BestTimeWindowedVRPToursMemorizer(BestTimeWindowedVRPToursMemorizer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 15895)
@@ -0,0 +1,186 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestVRPSolutionAnalyzer", "An operator for analyzing the best solution of Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IGeneralVRPOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DistanceParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> VehiclesUtilizedParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public LookupParameter<VRPSolution> BestValidSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestValidSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public LookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<VRPSolution> BestKnownSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestKnownSolution"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private BestVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestVRPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this VRP instance."));
+      Parameters.Add(new LookupParameter<VRPSolution>("BestKnownSolution", "The best known solution of this VRP instance."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Distance", "The distances of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
+      Parameters.Add(new LookupParameter<VRPSolution>("BestValidSolution", "The best valid VRP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestVRPSolutionAnalyzer(this, cloner);
+    }
+
+    private BestVRPSolutionAnalyzer(BestVRPSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      #region Backwards Compatibility
+      if (!Parameters.ContainsKey("BestKnownQuality")) {
+        Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this VRP instance."));
+      }
+      if (!Parameters.ContainsKey("BestKnownSolution")) {
+        Parameters.Add(new LookupParameter<VRPSolution>("BestKnownSolution", "The best known solution of this VRP instance."));
+      }
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> distances = DistanceParameter.ActualValue;
+      ItemArray<DoubleValue> vehiclesUtilizations = VehiclesUtilizedParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      IVRPEncoding best = solutions[i].Clone() as IVRPEncoding;
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution == null) {
+        solution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[i].Value));
+        BestSolutionParameter.ActualValue = solution;
+        results.Add(new Result("Best VRP Solution", solution));
+
+        results.Add(new Result("Best VRP Solution Distance", new DoubleValue(distances[i].Value)));
+        results.Add(new Result("Best VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[i].Value)));
+      } else {
+        VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+        if (qualities[i].Value <= eval.Quality) {
+          solution.ProblemInstance = problemInstance;
+          solution.Solution = best.Clone() as IVRPEncoding;
+          solution.Quality.Value = qualities[i].Value;
+          (results["Best VRP Solution Distance"].Value as DoubleValue).Value = distances[i].Value;
+          (results["Best VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value;
+        }
+      }
+
+      var idx = qualities.Select((x, index) => new { index, x.Value }).Where(index => problemInstance.Feasible(solutions[index.index])).OrderBy(x => x.Value).FirstOrDefault();
+      if (idx != null) {
+        int j = idx.index;
+        IVRPEncoding bestFeasible = solutions[j].Clone() as IVRPEncoding;
+        VRPSolution validSolution = BestValidSolutionParameter.ActualValue;
+        if (validSolution == null) {
+          validSolution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[j].Value));
+          BestValidSolutionParameter.ActualValue = validSolution;
+          if (results.ContainsKey("Best valid VRP Solution"))
+            results["Best valid VRP Solution"].Value = validSolution;
+          else
+            results.Add(new Result("Best valid VRP Solution", validSolution));
+
+          results.Add(new Result("Best valid VRP Solution Distance", new DoubleValue(distances[j].Value)));
+          results.Add(new Result("Best valid VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[j].Value)));
+        } else {
+          if (qualities[j].Value <= validSolution.Quality.Value) {
+            if (ProblemInstanceParameter.ActualValue.Feasible(best)) {
+              validSolution.ProblemInstance = problemInstance;
+              validSolution.Solution = best.Clone() as IVRPEncoding;
+              validSolution.Quality.Value = qualities[j].Value;
+              (results["Best valid VRP Solution Distance"].Value as DoubleValue).Value = distances[j].Value;
+              (results["Best valid VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[j].Value;
+            }
+          }
+        }
+
+        DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+        if (bestKnownQuality == null || qualities[j].Value < bestKnownQuality.Value) {
+          BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[j].Value);
+          BestKnownSolutionParameter.ActualValue = (VRPSolution)validSolution.Clone();
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 15895)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestCapacitatedVRPSolutionAnalyzer", "An operator for analyzing the best solution of capacitated Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestCapacitatedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private BestCapacitatedVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestCapacitatedVRPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestCapacitatedVRPSolutionAnalyzer(this, cloner);
+    }
+
+    private BestCapacitatedVRPSolutionAnalyzer(BestCapacitatedVRPSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution != null) {
+        if (!results.ContainsKey("Best VRP Solution Overload")) {
+          results.Add(new Result("Best VRP Solution Overload", new DoubleValue(overloads[i].Value)));
+        } else {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
+            (results["Best VRP Solution Overload"].Value as DoubleValue).Value = overloads[i].Value;
+          }
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 15895)
@@ -0,0 +1,115 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestPickupAndDeliveryVRPSolutionAnalyzer", "An operator for analyzing the best solution of Pickup and Delivery Routing Problems.")]
+  [StorableClass]
+  public sealed class BestPickupAndDeliveryVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private BestPickupAndDeliveryVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestPickupAndDeliveryVRPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violation of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestPickupAndDeliveryVRPSolutionAnalyzer(this, cloner);
+    }
+
+    private BestPickupAndDeliveryVRPSolutionAnalyzer(BestPickupAndDeliveryVRPSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<IntValue> pickupViolations = PickupViolationsParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      IVRPEncoding best = solutions[i] as IVRPEncoding;
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution != null) {
+        if (!results.ContainsKey("Best VRP Solution PickupViolations")) {
+          results.Add(new Result("Best VRP Solution PickupViolations", new DoubleValue(pickupViolations[i].Value)));
+        } else {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
+            (results["Best VRP Solution PickupViolations"].Value as DoubleValue).Value = pickupViolations[i].Value;
+          }
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 15895)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for analyzing the best solution of Vehicle Routing Problems.
+  /// </summary>
+  [Item("BestTimeWindowedVRPSolutionAnalyzer", "An operator for analyzing the best solution of time windowed Vehicle Routing Problems.")]
+  [StorableClass]
+  public sealed class BestTimeWindowedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    public LookupParameter<VRPSolution> BestSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    private BestTimeWindowedVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public BestTimeWindowedVRPSolutionAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("TravelTime", "The travel times of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestTimeWindowedVRPSolutionAnalyzer(this, cloner);
+    }
+
+    private BestTimeWindowedVRPSolutionAnalyzer(BestTimeWindowedVRPSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
+      ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> tardinesses = TardinessParameter.ActualValue;
+      ItemArray<DoubleValue> travelTimes = TravelTimeParameter.ActualValue;
+
+      int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      VRPSolution solution = BestSolutionParameter.ActualValue;
+      if (solution != null) {
+        if (!results.ContainsKey("Best VRP Solution Tardiness")) {
+          results.Add(new Result("Best VRP Solution Tardiness", new DoubleValue(tardinesses[i].Value)));
+          results.Add(new Result("Best VRP Solution TravelTime", new DoubleValue(travelTimes[i].Value)));
+        } else {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
+            (results["Best VRP Solution Tardiness"].Value as DoubleValue).Value = tardinesses[i].Value;
+            (results["Best VRP Solution TravelTime"].Value as DoubleValue).Value = travelTimes[i].Value;
+          }
+        }
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 15895)
@@ -0,0 +1,157 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for adaptive constraint relaxation.
+  /// </summary>
+  [Item("CapacityRelaxationVRPAnalyzer", "An operator for adaptively relaxing the capacity constraints.")]
+  [StorableClass]
+  public class CapacityRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    public IValueParameter<DoubleValue> SigmaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Sigma"]; }
+    }
+    public IValueParameter<DoubleValue> PhiParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Phi"]; }
+    }
+    public IValueParameter<DoubleValue> MinPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
+    }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected CapacityRelaxationVRPAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public CapacityRelaxationVRPAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CapacityRelaxationVRPAnalyzer(this, cloner);
+    }
+
+    protected CapacityRelaxationVRPAnalyzer(CapacityRelaxationVRPAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      ICapacitatedProblemInstance cvrp = ProblemInstanceParameter.ActualValue as ICapacitatedProblemInstance;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
+
+      double sigma = SigmaParameter.Value.Value;
+      double phi = PhiParameter.Value.Value;
+      double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value -= overloads[j].Value * cvrp.OverloadPenalty.Value;
+      }
+
+      int validCount = 0;
+      for (int j = 0; j < qualities.Length; j++) {
+        if (overloads[j].Value == 0)
+          validCount++;
+      }
+
+      double factor = 1.0 - ((double)validCount / (double)qualities.Length);
+
+      double min = cvrp.OverloadPenalty.Value / (1 + sigma);
+      double max = cvrp.OverloadPenalty.Value * (1 + phi);
+
+      cvrp.CurrentOverloadPenalty = new DoubleValue(min + (max - min) * factor);
+      if (cvrp.CurrentOverloadPenalty.Value < minPenalty)
+        cvrp.CurrentOverloadPenalty.Value = minPenalty;
+      if (cvrp.CurrentOverloadPenalty.Value > maxPenalty)
+        cvrp.CurrentOverloadPenalty.Value = maxPenalty;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value += overloads[j].Value * cvrp.CurrentOverloadPenalty.Value;
+      }
+
+      if (!results.ContainsKey("Current Overload Penalty")) {
+        results.Add(new Result("Current Overload Penalty", new DoubleValue(cvrp.CurrentOverloadPenalty.Value)));
+      } else {
+        (results["Current Overload Penalty"].Value as DoubleValue).Value = cvrp.CurrentOverloadPenalty.Value;
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 15895)
@@ -0,0 +1,157 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for adaptive constraint relaxation.
+  /// </summary>
+  [Item("PickupViolationsRelaxationVRPAnalyzer", "An operator for adaptively relaxing the pickup constraints.")]
+  [StorableClass]
+  public class PickupViolationsRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    public IValueParameter<DoubleValue> SigmaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Sigma"]; }
+    }
+    public IValueParameter<DoubleValue> PhiParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Phi"]; }
+    }
+    public IValueParameter<DoubleValue> MinPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
+    }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected PickupViolationsRelaxationVRPAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public PickupViolationsRelaxationVRPAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violation of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PickupViolationsRelaxationVRPAnalyzer(this, cloner);
+    }
+
+    protected PickupViolationsRelaxationVRPAnalyzer(PickupViolationsRelaxationVRPAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      IPickupAndDeliveryProblemInstance pdp = ProblemInstanceParameter.ActualValue as IPickupAndDeliveryProblemInstance;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<IntValue> pickupViolations = PickupViolationsParameter.ActualValue;
+
+      double sigma = SigmaParameter.Value.Value;
+      double phi = PhiParameter.Value.Value;
+      double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value -= pickupViolations[j].Value * pdp.PickupViolationPenalty.Value;
+      }
+
+      int validCount = 0;
+      for (int j = 0; j < qualities.Length; j++) {
+        if (pickupViolations[j].Value == 0)
+          validCount++;
+      }
+
+      double factor = 1.0 - ((double)validCount / (double)qualities.Length);
+
+      double min = pdp.PickupViolationPenalty.Value / (1 + sigma);
+      double max = pdp.PickupViolationPenalty.Value * (1 + phi);
+
+      pdp.CurrentPickupViolationPenalty = new DoubleValue(min + (max - min) * factor);
+      if (pdp.CurrentPickupViolationPenalty.Value < minPenalty)
+        pdp.CurrentPickupViolationPenalty.Value = minPenalty;
+      if (pdp.CurrentPickupViolationPenalty.Value > maxPenalty)
+        pdp.CurrentPickupViolationPenalty.Value = maxPenalty;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value += pickupViolations[j].Value * pdp.CurrentPickupViolationPenalty.Value;
+      }
+
+      if (!results.ContainsKey("Current Pickup Violation Penalty")) {
+        results.Add(new Result("Current Pickup Violation Penalty", new DoubleValue(pdp.CurrentPickupViolationPenalty.Value)));
+      } else {
+        (results["Current Pickup Violation Penalty"].Value as DoubleValue).Value = pdp.CurrentPickupViolationPenalty.Value;
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 15895)
@@ -0,0 +1,157 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator for adaptive constraint relaxation.
+  /// </summary>
+  [Item("TimeWindowRelaxationVRPAnalyzer", "An operator for adaptively relaxing the time window constraints.")]
+  [StorableClass]
+  public class TimeWindowRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator, ISingleObjectiveOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ScopeTreeLookupParameter<DoubleValue> TardinessParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    public IValueParameter<DoubleValue> SigmaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Sigma"]; }
+    }
+    public IValueParameter<DoubleValue> PhiParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Phi"]; }
+    }
+    public IValueParameter<DoubleValue> MinPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
+    }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public bool EnabledByDefault {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected TimeWindowRelaxationVRPAnalyzer(bool deserializing) : base(deserializing) { }
+
+    public TimeWindowRelaxationVRPAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TimeWindowRelaxationVRPAnalyzer(this, cloner);
+    }
+
+    protected TimeWindowRelaxationVRPAnalyzer(TimeWindowRelaxationVRPAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      ITimeWindowedProblemInstance vrptw = ProblemInstanceParameter.ActualValue as ITimeWindowedProblemInstance;
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemArray<DoubleValue> tardiness = TardinessParameter.ActualValue;
+
+      double sigma = SigmaParameter.Value.Value;
+      double phi = PhiParameter.Value.Value;
+      double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value -= tardiness[j].Value * vrptw.TardinessPenalty.Value;
+      }
+
+      int validCount = 0;
+      for (int j = 0; j < qualities.Length; j++) {
+        if (tardiness[j].Value == 0)
+          validCount++;
+      }
+
+      double factor = 1.0 - ((double)validCount / (double)qualities.Length);
+
+      double min = vrptw.TardinessPenalty.Value / (1 + sigma);
+      double max = vrptw.TardinessPenalty.Value * (1 + phi);
+
+      vrptw.CurrentTardinessPenalty = new DoubleValue(min + (max - min) * factor);
+      if (vrptw.CurrentTardinessPenalty.Value < minPenalty)
+        vrptw.CurrentTardinessPenalty.Value = minPenalty;
+      if (vrptw.CurrentTardinessPenalty.Value > maxPenalty)
+        vrptw.CurrentTardinessPenalty.Value = maxPenalty;
+
+      for (int j = 0; j < qualities.Length; j++) {
+        qualities[j].Value += tardiness[j].Value * vrptw.CurrentTardinessPenalty.Value;
+      }
+
+      if (!results.ContainsKey("Current Tardiness Penalty")) {
+        results.Add(new Result("Current Tardiness Penalty", new DoubleValue(vrptw.CurrentTardinessPenalty.Value)));
+      } else {
+        (results["Current Tardiness Penalty"].Value as DoubleValue).Value = vrptw.CurrentTardinessPenalty.Value;
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/VRPSolution.cs	(revision 15895)
@@ -0,0 +1,169 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// Represents a VRP solution which can be visualized in the GUI.
+  /// </summary>
+  [Item("VRPSolution", "Represents a VRP solution which can be visualized in the GUI.")]
+  [StorableClass]
+  public sealed class VRPSolution : Item {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; }
+    }
+
+    [Storable]
+    private IVRPProblemInstance problemInstance;
+    public IVRPProblemInstance ProblemInstance {
+      get { return problemInstance; }
+      set {
+        if (problemInstance != value) {
+          if (problemInstance != null) DeregisterProblemInstanceEvents();
+          problemInstance = value;
+          if (problemInstance != null) RegisterProblemInstanceEvents();
+          OnProblemInstanceChanged();
+        }
+      }
+    }
+    [Storable]
+    private IVRPEncoding solution;
+    public IVRPEncoding Solution {
+      get { return solution; }
+      set {
+        if (solution != value) {
+          if (solution != null) DeregisterSolutionEvents();
+          solution = value;
+          if (solution != null) RegisterSolutionEvents();
+          OnSolutionChanged();
+        }
+      }
+    }
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          if (quality != null) DeregisterQualityEvents();
+          quality = value;
+          if (quality != null) RegisterQualityEvents();
+          OnQualityChanged();
+        }
+      }
+    }
+
+    public VRPSolution() : base() { }
+
+    public VRPSolution(IVRPProblemInstance problemInstance, IVRPEncoding solution, DoubleValue quality)
+      : base() {
+      this.problemInstance = problemInstance;
+      this.solution = solution;
+      this.quality = quality;
+
+      Initialize();
+    }
+    [StorableConstructor]
+    private VRPSolution(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (problemInstance != null) RegisterProblemInstanceEvents();
+      if (solution != null) RegisterSolutionEvents();
+      if (quality != null) RegisterQualityEvents();
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPSolution(this, cloner);
+    }
+
+    private VRPSolution(VRPSolution original, Cloner cloner)
+      : base(original, cloner) {
+      this.solution = (IVRPEncoding)cloner.Clone(original.solution);
+      this.quality = (DoubleValue)cloner.Clone(original.quality);
+
+      if (original.ProblemInstance != null && cloner.ClonedObjectRegistered(original.ProblemInstance))
+        this.ProblemInstance = (IVRPProblemInstance)cloner.Clone(original.ProblemInstance);
+      else
+        this.ProblemInstance = original.ProblemInstance;
+
+      this.Initialize();
+    }
+
+    #region Events
+    public event EventHandler ProblemInstanceChanged;
+    private void OnProblemInstanceChanged() {
+      var changed = ProblemInstanceChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler SolutionChanged;
+    private void OnSolutionChanged() {
+      var changed = SolutionChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var changed = QualityChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+
+    private void RegisterProblemInstanceEvents() {
+      ProblemInstance.ToStringChanged += new EventHandler(ProblemInstance_ToStringChanged);
+    }
+    private void DeregisterProblemInstanceEvents() {
+      ProblemInstance.ToStringChanged -= new EventHandler(ProblemInstance_ToStringChanged);
+    }
+    private void RegisterSolutionEvents() {
+      Solution.ToStringChanged += new EventHandler(Solution_ToStringChanged);
+    }
+    private void DeregisterSolutionEvents() {
+      Solution.ToStringChanged -= new EventHandler(Solution_ToStringChanged);
+    }
+    private void RegisterQualityEvents() {
+      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
+    }
+    private void DeregisterQualityEvents() {
+      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
+    }
+
+    private void ProblemInstance_ToStringChanged(object sender, EventArgs e) {
+      OnProblemInstanceChanged();
+    }
+    private void Solution_ToStringChanged(object sender, EventArgs e) {
+      OnSolutionChanged();
+    }
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs	(revision 15895)
@@ -0,0 +1,179 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaEncoding", "Represents an Alba encoding of VRP solutions. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaEncoding : General.PermutationEncoding {
+    #region IVRPEncoding Members
+    public override List<Tour> GetTours() {
+      Repair();
+      List<Tour> result = new List<Tour>();
+
+      int cities = ProblemInstance.Cities.Value;
+
+      Tour tour = new Tour();
+      for (int i = 0; i < this.array.Length; i++) {
+        if (this.array[i] >= cities) {
+          if (tour.Stops.Count > 0) {
+            result.Add(tour);
+
+            tour = new Tour();
+          }
+        } else {
+          tour.Stops.Add(this.array[i] + 1);
+        }
+      }
+
+      if (tour.Stops.Count > 0) {
+        result.Add(tour);
+      }
+
+      return result;
+    }
+
+    public override int GetVehicleAssignment(int tour) {
+      int vehicleAssignment = -1;
+      Tour currentTour = GetTours()[tour];
+
+      int lastStop = currentTour.Stops[
+        currentTour.Stops.Count - 1] - 1;
+
+      int lastStopIndex = this.IndexOf(lastStop);
+
+      if (lastStopIndex == this.Length - 1) {
+        int i = this.Length - 1;
+
+        while (vehicleAssignment == -1) {
+          if (this.array[i] >= ProblemInstance.Cities.Value) {
+            vehicleAssignment = this.array[i] - ProblemInstance.Cities.Value;
+          }
+
+          i--;
+        }
+      } else
+        vehicleAssignment = this[lastStopIndex + 1] - this.ProblemInstance.Cities.Value;
+
+      return vehicleAssignment;
+    }
+    #endregion
+
+    public void Repair() {
+      int cities = ProblemInstance.Cities.Value;
+
+      if (this[this.Length - 1] < cities) {
+        int index = this.Length - 2;
+        while (this[index] < cities) {
+          index--;
+        }
+
+        int vehicle = this[index];
+        for (int i = index; i < this.Length - 1; i++)
+          this[i] = this[i + 1];
+        this[Length - 1] = vehicle;
+      }
+    }
+
+    public AlbaEncoding(Permutation permutation, IVRPProblemInstance instance)
+      : base(permutation, instance) {
+    }
+
+    [StorableConstructor]
+    protected AlbaEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaEncoding(this, cloner);
+    }
+
+    protected AlbaEncoding(AlbaEncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static AlbaEncoding ConvertFrom(List<int> routeParam, IVRPProblemInstance instance) {
+      List<int> route = new List<int>(routeParam);
+
+      int cities = instance.Cities.Value;
+
+      for (int i = 0; i < route.Count; i++) {
+        if (route[i] <= 0) {
+          int vehicle = -route[i];
+          route[i] = cities + vehicle;
+        } else {
+          route[i] = route[i] - 1;
+        }
+      }
+
+      return new AlbaEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()),
+        instance);
+    }
+
+    public static AlbaEncoding ConvertFrom(IVRPEncoding encoding, IVRPProblemInstance instance) {
+      List<Tour> tours = encoding.GetTours();
+
+      int cities = 0;
+      foreach (Tour tour in tours) {
+        cities += tour.Stops.Count;
+      }
+
+      int emptyVehicles = instance.Vehicles.Value - tours.Count;
+
+      int[] array = new int[cities + tours.Count + emptyVehicles];
+      int delimiter = 0;
+      int arrayIndex = 0;
+
+      foreach (Tour tour in tours) {
+        foreach (int city in tour.Stops) {
+          array[arrayIndex] = city - 1;
+          arrayIndex++;
+        }
+
+        if (arrayIndex != array.Length) {
+          array[arrayIndex] = cities + encoding.GetVehicleAssignment(delimiter);
+
+          delimiter++;
+          arrayIndex++;
+        }
+      }
+
+      for (int i = 0; i < emptyVehicles; i++) {
+        array[arrayIndex] = cities + encoding.GetVehicleAssignment(delimiter);
+
+        delimiter++;
+        arrayIndex++;
+      }
+
+      AlbaEncoding solution = new AlbaEncoding(new Permutation(PermutationTypes.RelativeUndirected, new IntArray(array)), instance);
+
+      return solution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/AlbaCreator.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCreator", "A VRP creator.")]
+  [StorableClass]
+  public abstract class AlbaCreator : VRPCreator, IAlbaOperator, IVRPCreator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected AlbaCreator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCreator()
+      : base() {
+    }
+
+    protected AlbaCreator(AlbaCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      (VRPToursParameter.ActualValue as AlbaEncoding).Repair();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Creators/RandomCreator.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("RandomCreator", "Creates a randomly initialized VRP solution.")]
+  [StorableClass]
+  public sealed class RandomCreator : AlbaCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private RandomCreator(bool deserializing) : base(deserializing) { }
+
+    public RandomCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomCreator(this, cloner);
+    }
+
+    private RandomCreator(RandomCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private List<int> CreateSolution() {
+      int cities = ProblemInstance.Cities.Value;
+      int vehicles = ProblemInstance.Vehicles.Value;
+
+      int[] perm = new int[cities + vehicles];
+      int[] sortingArray = new int[perm.Length - 2];
+      for (int i = 0; i < cities; i++)
+        perm[i] = i + 1;
+      for (int i = cities; i < cities + vehicles; i++)
+        perm[i] = -(i - cities);
+      for (int i = 0; i < perm.Length - 2; i++) {
+        sortingArray[i] = RandomParameter.ActualValue.Next(perm.Length * 2);
+      }
+      // shuffle perm from 1...n-1 by sorting sortingArray (perm[0] and perm[n] must stay 0)
+      bool done;
+      do {
+        done = true;
+        for (int i = 0; i < perm.Length - 3; i++) {
+          if (sortingArray[i] > sortingArray[i + 1]) {
+            int h = sortingArray[i];
+            sortingArray[i] = sortingArray[i + 1];
+            sortingArray[i + 1] = h;
+            h = perm[i + 1];
+            perm[i + 1] = perm[i + 2];
+            perm[i + 2] = h;
+            done = false;
+          }
+        }
+      } while (!done);
+
+      return new List<int>(perm);
+    }
+
+    public override IOperation InstrumentedApply() {
+      //choose default encoding here
+      VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(CreateSolution(), ProblemInstance);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCrossover", "An operator which crosses two VRP representations.")]
+  [StorableClass]
+  public abstract class AlbaCrossover : VRPCrossover, IAlbaOperator, IVRPCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected AlbaCrossover(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public AlbaCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected AlbaCrossover(AlbaCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2);
+
+    public override IOperation InstrumentedApply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is AlbaEncoding)) {
+          parents[i] = AlbaEncoding.ConvertFrom(solution, ProblemInstance);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue =
+        Crossover(RandomParameter.ActualValue, parents[0] as AlbaEncoding, parents[1] as AlbaEncoding);
+      (ChildParameter.ActualValue as AlbaEncoding).Repair();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaPermutationCrossover : AlbaCrossover {
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public AlbaPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new EdgeRecombinationCrossover()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaPermutationCrossover(this, cloner);
+    }
+
+    private AlbaPermutationCrossover(AlbaPermutationCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override AlbaEncoding Crossover(IRandom random, AlbaEncoding parent1, AlbaEncoding parent2) {
+      //note - the inner crossover is called here and the result is converted to an alba representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+      if (parent1.Length != parent2.Length)
+        return parent1.Clone() as AlbaEncoding;
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new AlbaEncoding(permutation, ProblemInstance);
+      } else
+        return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/IAlbaOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/IAlbaOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/IAlbaOperator.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  public interface IAlbaOperator :
+    ISingleDepotOperator, IHeterogenousCapacitatedOperator, IMultiDepotOperator, ITimeWindowedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 15895)
@@ -0,0 +1,140 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+using HeuristicLab.Parameters;
+using HeuristicLab.Operators;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeLocalImprovementOperator", "Takes a solution and finds the local optimum with respect to the lambda interchange neighborhood by decending along the steepest gradient.")]
+  [StorableClass]
+  public class AlbaLambdaInterchangeLocalImprovementOperator : VRPOperator, IStochasticOperator, ILocalImprovementOperator, ISingleObjectiveOperator {
+
+    public IValueLookupParameter<IntValue> MaximumIterationsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
+
+    public ILookupParameter<IntValue> EvaluatedSolutionsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["EvaluatedSolutions"]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public IValueParameter<IntValue> LambdaParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
+    }
+
+    public IValueParameter<IntValue> SampleSizeParameter {
+      get { return (IValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeLocalImprovementOperator(bool deserializing) : base(deserializing) { }
+    protected AlbaLambdaInterchangeLocalImprovementOperator(AlbaLambdaInterchangeLocalImprovementOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public AlbaLambdaInterchangeLocalImprovementOperator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum amount of iterations that should be performed (note that this operator will abort earlier when a local optimum is reached.", new IntValue(10000)));
+      Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The amount of evaluated solutions (here a move is counted only as 4/n evaluated solutions with n being the length of the permutation)."));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection where to store results."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value of the assignment."));
+      Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "The number of moves to generate.", new IntValue(2000)));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeLocalImprovementOperator(this, cloner);
+    }
+
+    public static void Apply(AlbaEncoding solution, int maxIterations,
+      int lambda, int samples, IRandom random, IVRPProblemInstance problemInstance, ref double quality, out int evaluatedSolutions) {
+      evaluatedSolutions = 0;
+
+      for (int i = 0; i < maxIterations; i++) {
+        AlbaLambdaInterchangeMove bestMove = null;
+        foreach (AlbaLambdaInterchangeMove move in AlbaStochasticLambdaInterchangeMultiMoveGenerator.GenerateAllMoves(solution, problemInstance, lambda, samples, random)) {
+          AlbaEncoding newSolution = solution.Clone() as AlbaEncoding;
+          AlbaLambdaInterchangeMoveMaker.Apply(newSolution, move);
+          double moveQuality =
+            problemInstance.Evaluate(newSolution).Quality;
+
+          evaluatedSolutions++;
+          if (moveQuality < quality || quality == -1) {
+            quality = moveQuality;
+            bestMove = move;
+          }
+        }
+        if (bestMove != null)
+          AlbaLambdaInterchangeMoveMaker.Apply(solution, bestMove);
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      int maxIterations = MaximumIterationsParameter.ActualValue.Value;
+      AlbaEncoding solution = null;
+
+      if (VRPToursParameter.ActualValue is AlbaEncoding)
+        solution = VRPToursParameter.ActualValue as AlbaEncoding;
+      else
+        VRPToursParameter.ActualValue = solution = AlbaEncoding.ConvertFrom(VRPToursParameter.ActualValue, ProblemInstance);
+
+      int lambda = LambdaParameter.Value.Value;
+      int samples = SampleSizeParameter.Value.Value;
+      IRandom random = RandomParameter.ActualValue;
+
+      double quality = QualityParameter.ActualValue.Value;
+      int evaluatedSolutions;
+
+      Apply(solution, maxIterations, lambda, samples, random, ProblemInstance, ref quality, out evaluatedSolutions);
+
+      EvaluatedSolutionsParameter.ActualValue.Value += evaluatedSolutions;
+      QualityParameter.ActualValue.Value = quality;
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerInsertionManipulator", "An operator which manipulates a VRP representation by inserting a customer in another place.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerInsertionManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerInsertionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerInsertionManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerInsertionManipulator(this, cloner);
+    }
+
+    private AlbaCustomerInsertionManipulator(AlbaCustomerInsertionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      AlbaEncoding original = (AlbaEncoding)individual.Clone();
+      int cutIndex, insertIndex, number;
+
+      int customer = random.Next(ProblemInstance.Cities.Value);
+      cutIndex = FindCustomerLocation(customer, individual);
+
+      insertIndex = random.Next(original.Length);
+      number = original[cutIndex];
+
+      int i = 0;  // index in new permutation
+      int j = 0;  // index in old permutation
+      while (i < original.Length) {
+        if (j == cutIndex) {
+          j++;
+        }
+        if (i == insertIndex) {
+          individual[i] = number;
+          i++;
+        }
+        if ((i < original.Length) && (j < original.Length)) {
+          individual[i] = original[j];
+          i++;
+          j++;
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 15895)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerInversionManipulator", "An operator which manipulates a VRP representation by inverting the order the customers are visited.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerInversionManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerInversionManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerInversionManipulator(this, cloner);
+    }
+
+    private AlbaCustomerInversionManipulator(AlbaCustomerInversionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      int breakPoint1, breakPoint2;
+
+      int customer1 = random.Next(ProblemInstance.Cities.Value);
+      breakPoint1 = FindCustomerLocation(customer1, individual);
+
+      int customer2 = random.Next(ProblemInstance.Cities.Value);
+      breakPoint2 = FindCustomerLocation(customer1, individual);
+
+      List<int> visitingOrder = new List<int>();
+      for (int i = breakPoint1; i <= breakPoint2; i++) {
+        if (individual[i] != 0)
+          visitingOrder.Add(individual[i]);
+      }
+      visitingOrder.Reverse();
+      for (int i = breakPoint1; i <= breakPoint2; i++) {
+        if (individual[i] != 0) {
+          individual[i] = visitingOrder[0];
+          visitingOrder.RemoveAt(0);
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 15895)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaCustomerSwapManipulator", "An operator which manipulates a VRP representation by swapping two customers.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaCustomerSwapManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaCustomerSwapManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaCustomerSwapManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerSwapManipulator(this, cloner);
+    }
+
+    private AlbaCustomerSwapManipulator(AlbaCustomerSwapManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      int index1, index2, temp;
+
+      int customer1 = random.Next(ProblemInstance.Cities.Value);
+      index1 = FindCustomerLocation(customer1, individual);
+
+      int customer2 = random.Next(ProblemInstance.Cities.Value);
+      index2 = FindCustomerLocation(customer2, individual);
+
+      temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 15895)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionManipulator", "An operator which applies the SLS operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaIntraRouteInversionManipulator : AlbaManipulator {
+    [StorableConstructor]
+    private AlbaIntraRouteInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionManipulator(this, cloner);
+    }
+
+    private AlbaIntraRouteInversionManipulator(AlbaIntraRouteInversionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(AlbaEncoding individual, int index1, int index2) {
+      if (index1 != -1 && index2 != -1) {
+        int breakPoint1 = index1 + 1;
+        int breakPoint2 = index2;
+        for (int i = 0; i <= (breakPoint2 - breakPoint1) / 2; i++) {  // invert permutation between breakpoints
+          int temp = individual[breakPoint1 + i];
+          individual[breakPoint1 + i] = individual[breakPoint2 - i];
+          individual[breakPoint2 - i] = temp;
+        }
+      }
+    }
+
+    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
+      int index1 = -1;
+      int index2 = -1;
+
+      List<Tour> validTours = new List<Tour>();
+      foreach (Tour tour in individual.GetTours()) {
+        if (tour.Stops.Count >= 4)
+          validTours.Add(tour);
+      }
+
+      if (validTours.Count > 0) {
+        Tour chosenTour = validTours[rand.Next(validTours.Count)];
+        int currentTourStart = -1;
+        for (int i = 0; i < individual.Length; i++) {
+          if (individual[i] + 1 == chosenTour.Stops[0]) {
+            currentTourStart = i;
+            break;
+          }
+        }
+
+        int currentTourEnd = currentTourStart;
+        while (currentTourEnd < individual.Length &&
+          individual[currentTourEnd] < ProblemInstance.Cities.Value) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        int a = rand.Next(tourLength - 3);
+        index1 = currentTourStart + a;
+        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
+      }
+
+      Apply(individual, index1, index2);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 15895)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeManipulator", "An operator which applies the lambda interchange operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaLambdaInterchangeManipulator : AlbaManipulator {
+    public IValueParameter<IntValue> LambdaParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaLambdaInterchangeManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeManipulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeManipulator(this, cloner);
+    }
+
+    private AlbaLambdaInterchangeManipulator(AlbaLambdaInterchangeManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(AlbaEncoding individual, int tour1Index, int position1, int length1,
+      int tour2Index, int position2, int length2) {
+      List<Tour> tours = individual.GetTours();
+
+      Tour tour1 = tours[tour1Index];
+      int tour1Start = -1;
+      for (int i = 0; i < individual.Length; i++) {
+        if (individual[i] == tour1.Stops[0] - 1) {
+          tour1Start = i;
+          break;
+        }
+      }
+
+      Tour tour2 = tours[tour2Index];
+      int tour2Start = -1;
+      for (int i = 0; i < individual.Length; i++) {
+        if (individual[i] == tour2.Stops[0] - 1) {
+          tour2Start = i;
+          break;
+        }
+      }
+
+      AlbaEncoding original = individual.Clone() as AlbaEncoding;
+      int index = 0;
+
+      int start1 = tour1Start + position1;
+      int end1 = start1 + length1;
+
+      int start2 = tour2Start + position2;
+      int end2 = start2 + length2;
+
+      for (int i = 0; i < original.Length; i++) {
+        if (index == start1) {
+          if (end2 - start2 == 0)
+            index = end1;
+          else
+            index = start2;
+        } else if (index == start2) {
+          if (end1 - start1 == 0)
+            index = end2;
+          else
+            index = start1;
+        } else if (index == end1) {
+          index = end2;
+        } else if (index == end2) {
+          index = end1;
+        }
+
+        individual[i] = original[index];
+
+        index++;
+      }
+    }
+
+    protected override void Manipulate(IRandom rand, AlbaEncoding individual) {
+      List<Tour> tours = individual.GetTours();
+      if (tours.Count > 1) {
+        int lambda = LambdaParameter.Value.Value;
+
+        int route1Index = rand.Next(tours.Count);
+        Tour route1 = tours[route1Index];
+
+
+        int route2Index = rand.Next(tours.Count - 1);
+        if (route2Index >= route1Index)
+          route2Index += 1;
+        Tour route2 = tours[route2Index];
+
+        int length1 = rand.Next(Math.Min(lambda + 1, route1.Stops.Count + 1));
+        int index1 = rand.Next(route1.Stops.Count - length1 + 1);
+
+        int l2Min = 0;
+        if (length1 == 0)
+          l2Min = 1;
+        int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Stops.Count + 1));
+        int index2 = rand.Next(route2.Stops.Count - length2 + 1);
+
+        Apply(individual, route1Index, index1, length1,
+          route2Index, index2, length2);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 15895)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaManipulator", "An operator which manipulates a VRP representation.")]
+  [StorableClass]
+  public abstract class AlbaManipulator : VRPManipulator, IAlbaOperator, IVRPManipulator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected AlbaManipulator(bool deserializing) : base(deserializing) { }
+
+    public AlbaManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected AlbaManipulator(AlbaManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void Manipulate(IRandom random, AlbaEncoding individual);
+
+    protected int FindCustomerLocation(int customer, AlbaEncoding individual) {
+      int pos = -1;
+      for (int i = 0; i < individual.Length; i++) {
+        if (individual[i] == customer) {
+          pos = i;
+          break;
+        }
+      }
+
+      return pos;
+    }
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is AlbaEncoding)) {
+        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as AlbaEncoding);
+      (VRPToursParameter.ActualValue as AlbaEncoding).Repair();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 15895)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaPermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaPermutationManipualtor : AlbaManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaPermutationManipualtor(bool deserializing) : base(deserializing) { }
+
+    public AlbaPermutationManipualtor()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaPermutationManipualtor(this, cloner);
+    }
+
+    private AlbaPermutationManipualtor(AlbaPermutationManipualtor original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, AlbaEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaMoveEvaluator", "Evaluates an Alba VRP move.")]
+  [StorableClass]
+  public abstract class AlbaMoveEvaluator : VRPMoveEvaluator, IAlbaOperator {
+    [StorableConstructor]
+    protected AlbaMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaMoveEvaluator()
+      : base() {
+    }
+
+    protected AlbaMoveEvaluator(AlbaMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaMoveGenerator", "Generates Alba VRP moves.")]
+  [StorableClass]
+  public abstract class AlbaMoveGenerator : VRPMoveGenerator, IAlbaOperator {
+    [StorableConstructor]
+    protected AlbaMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaMoveGenerator()
+      : base() {
+    }
+
+    protected AlbaMoveGenerator(AlbaMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is AlbaEncoding)) {
+        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaMoveMaker", "Makes an Alba VRP move.")]
+  [StorableClass]
+  public abstract class AlbaMoveMaker : VRPMoveMaker, IAlbaOperator {
+    [StorableConstructor]
+    protected AlbaMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaMoveMaker()
+      : base() {
+    }
+
+    protected AlbaMoveMaker(AlbaMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaExhaustiveIntraRouteInversionGenerator", "Generates all possible intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaExhaustiveIntraRouteInversionGenerator : AlbaIntraRouteInversionMoveGenerator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    [StorableConstructor]
+    private AlbaExhaustiveIntraRouteInversionGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaExhaustiveIntraRouteInversionGenerator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaExhaustiveIntraRouteInversionGenerator(this, cloner);
+    }
+
+    private AlbaExhaustiveIntraRouteInversionGenerator(AlbaExhaustiveIntraRouteInversionGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) {
+      List<AlbaIntraRouteInversionMove> moves = new List<AlbaIntraRouteInversionMove>();
+
+      int currentTourStart = 0;
+      int currentTourEnd = 0;
+      while (currentTourEnd != individual.Length) {
+        currentTourEnd = currentTourStart;
+        while (individual[currentTourEnd] < problemInstance.Cities.Value &&
+          currentTourEnd < individual.Length) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        if (tourLength >= 4) {
+          for (int i = 0; i <= tourLength - 4; i++) {
+            for (int j = i + 2; j <= tourLength - 2; j++) {
+              AlbaIntraRouteInversionMove move = new AlbaIntraRouteInversionMove(
+                currentTourStart + i,
+                currentTourStart + j,
+                individual);
+
+              moves.Add(move);
+            }
+          }
+        }
+
+        currentTourStart = currentTourEnd;
+      }
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaIntraRouteInversionMoveEvaluator", "Evaluates a intra route inversion move for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaIntraRouteInversionMoveEvaluator : AlbaMoveEvaluator, IAlbaIntraRouteInversionMoveOperator {
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return IntraRouteInversionMoveParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaIntraRouteInversionMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMoveEvaluator(this, cloner);
+    }
+
+    private AlbaIntraRouteInversionMoveEvaluator(AlbaIntraRouteInversionMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      AlbaEncoding newSolution = IntraRouteInversionMoveParameter.ActualValue.Permutation.Clone() as AlbaEncoding;
+      AlbaIntraRouteInversionMoveMaker.Apply(newSolution, IntraRouteInversionMoveParameter.ActualValue);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 15895)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionMove", "Item that describes an intra route inversion move on a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaIntraRouteInversionMove : TwoIndexMove, IVRPMove {
+    public IVRPEncoding Individual { get { return Permutation as AlbaEncoding; } }
+
+    [StorableConstructor]
+    protected AlbaIntraRouteInversionMove(bool deserializing) : base(deserializing) { }
+
+    protected AlbaIntraRouteInversionMove(AlbaIntraRouteInversionMove original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public AlbaIntraRouteInversionMove()
+      : base() {
+    }
+
+    public AlbaIntraRouteInversionMove(int index1, int index2)
+      : base(index1, index2, null) {
+    }
+
+    public AlbaIntraRouteInversionMove(int index1, int index2, AlbaEncoding permutation)
+      : base(index1, index2, null) {
+      this.Permutation = permutation.Clone() as AlbaEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMove(this, cloner);
+    }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new AlbaIntraRouteInversionMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new AlbaIntraRouteInversionMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return null;
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return null;
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      return null;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionMoveGenerator", "Generates intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public abstract class AlbaIntraRouteInversionMoveGenerator : AlbaMoveGenerator, IExhaustiveMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return IntraRouteInversionMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected AlbaIntraRouteInversionMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected AlbaIntraRouteInversionMoveGenerator(AlbaIntraRouteInversionMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
+      AlbaIntraRouteInversionMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(IntraRouteInversionMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 15895)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaIntraRouteInversionMoveMaker", "Peforms the SLS move on a given VRP encoding and updates the quality.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaIntraRouteInversionMoveMaker : AlbaMoveMaker, IAlbaIntraRouteInversionMoveOperator, IMoveMaker {
+    public ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter {
+      get { return (ILookupParameter<AlbaIntraRouteInversionMove>)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return IntraRouteInversionMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected AlbaIntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaIntraRouteInversionMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to make."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMoveMaker(this, cloner);
+    }
+
+    protected AlbaIntraRouteInversionMoveMaker(AlbaIntraRouteInversionMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(AlbaEncoding solution, AlbaIntraRouteInversionMove move) {
+      AlbaIntraRouteInversionManipulator.Apply(solution, move.Index1, move.Index2);
+    }
+
+    protected override void PerformMove() {
+      AlbaIntraRouteInversionMove move = IntraRouteInversionMoveParameter.ActualValue;
+
+      Apply(move.Individual as AlbaEncoding, move);
+      VRPToursParameter.ActualValue = move.Individual as AlbaEncoding;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticIntraRouteInversionMultiMoveGenerator", "Generates multiple random intra route inversion moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticIntraRouteInversionMultiMoveGenerator : AlbaIntraRouteInversionMoveGenerator, IStochasticOperator,
+    IMultiMoveGenerator, IAlbaIntraRouteInversionMoveOperator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaStochasticIntraRouteInversionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticIntraRouteInversionMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticIntraRouteInversionMultiMoveGenerator(this, cloner);
+    }
+
+    private AlbaStochasticIntraRouteInversionMultiMoveGenerator(AlbaStochasticIntraRouteInversionMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) {
+      int sampleSize = SampleSizeParameter.ActualValue.Value;
+
+      AlbaIntraRouteInversionMove[] moves = new AlbaIntraRouteInversionMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        moves[i] = AlbaStochasticIntraRouteInversionSingleMoveGenerator.Apply(
+          individual, problemInstance.Cities.Value, RandomParameter.ActualValue);
+      }
+
+      return moves;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticIntraRouteInversionSingleMoveGenerator", "Generates one random intra route inversion move from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticIntraRouteInversionSingleMoveGenerator : AlbaIntraRouteInversionMoveGenerator,
+    IStochasticOperator, ISingleMoveGenerator, IAlbaIntraRouteInversionMoveOperator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["AlbaIntraRouteInversionMove"]; }
+    }
+
+    #endregion
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaStochasticIntraRouteInversionSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticIntraRouteInversionSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticIntraRouteInversionSingleMoveGenerator(this, cloner);
+    }
+
+    private AlbaStochasticIntraRouteInversionSingleMoveGenerator(AlbaStochasticIntraRouteInversionSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static AlbaIntraRouteInversionMove Apply(AlbaEncoding individual, int cities, IRandom rand) {
+      int index1 = -1;
+      int index2 = -1;
+
+      List<Tour> validTours = new List<Tour>();
+      foreach (Tour tour in individual.GetTours()) {
+        if (tour.Stops.Count >= 4)
+          validTours.Add(tour);
+      }
+
+      if (validTours.Count > 0) {
+        Tour chosenTour = validTours[rand.Next(validTours.Count)];
+        int currentTourStart = -1;
+        for (int i = 0; i < individual.Length; i++) {
+          if (individual[i] + 1 == chosenTour.Stops[0]) {
+            currentTourStart = i;
+            break;
+          }
+        }
+
+        int currentTourEnd = currentTourStart;
+        while (currentTourEnd < individual.Length &&
+          individual[currentTourEnd] < cities) {
+          currentTourEnd++;
+        }
+
+        int tourLength = currentTourEnd - currentTourStart;
+        int a = rand.Next(tourLength - 3);
+        index1 = currentTourStart + a;
+        index2 = currentTourStart + rand.Next(a + 2, tourLength - 1);
+      }
+
+      return new AlbaIntraRouteInversionMove(index1, index2, individual);
+    }
+
+    protected override AlbaIntraRouteInversionMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance) {
+      List<AlbaIntraRouteInversionMove> moves = new List<AlbaIntraRouteInversionMove>();
+
+      AlbaIntraRouteInversionMove move = Apply(individual, problemInstance.Cities.Value, RandomParameter.ActualValue);
+      if (move != null)
+        moves.Add(move);
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/IAlbaIntraRouteInversionMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/IAlbaIntraRouteInversionMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/IntraRouteInversion/IAlbaIntraRouteInversionMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  public interface IAlbaIntraRouteInversionMoveOperator : IVRPMoveOperator {
+    ILookupParameter<AlbaIntraRouteInversionMove> IntraRouteInversionMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaExhaustiveLambdaInterchangeMoveGenerator", "Generates all possible lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaExhaustiveLambdaInterchangeMoveGenerator : AlbaLambdaInterchangeMoveGenerator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    [StorableConstructor]
+    private AlbaExhaustiveLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaExhaustiveLambdaInterchangeMoveGenerator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaExhaustiveLambdaInterchangeMoveGenerator(this, cloner);
+    }
+
+    private AlbaExhaustiveLambdaInterchangeMoveGenerator(AlbaExhaustiveLambdaInterchangeMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) {
+      List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>();
+
+      List<Tour> tours = individual.GetTours();
+
+      for (int tour1Index = 0; tour1Index < tours.Count; tour1Index++) {
+        Tour tour1 = tours[tour1Index];
+        for (int tour2Index = tour1Index + 1; tour2Index < tours.Count; tour2Index++) {
+          Tour tour2 = tours[tour2Index];
+
+          for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Stops.Count); length1++) {
+            for (int length2 = 0; length2 <= Math.Min(lambda, tour2.Stops.Count); length2++) {
+              if (length1 != 0 || length2 != 0) {
+                for (int index1 = 0; index1 < tour1.Stops.Count - length1 + 1; index1++) {
+                  for (int index2 = 0; index2 < tour2.Stops.Count - length2 + 1; index2++) {
+                    moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1,
+                      tour2Index, index2, length2, individual));
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 15895)
@@ -0,0 +1,124 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeMove", "Item that describes a lambda move on a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaLambdaInterchangeMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int Tour1 { get; protected set; }
+
+    [Storable]
+    public int Position1 { get; protected set; }
+
+    [Storable]
+    public int Length1 { get; protected set; }
+
+    [Storable]
+    public int Tour2 { get; protected set; }
+
+    [Storable]
+    public int Position2 { get; protected set; }
+
+    [Storable]
+    public int Length2 { get; protected set; }
+
+    public AlbaLambdaInterchangeMove()
+      : base() {
+      Tour1 = -1;
+      Position1 = -1;
+      Length1 = -1;
+
+      Tour2 = -1;
+      Position2 = -1;
+      Length2 = -1;
+
+      Individual = null;
+    }
+
+    public AlbaLambdaInterchangeMove(int tour1, int position1, int length1,
+      int tour2, int position2, int length2, AlbaEncoding permutation) {
+      Tour1 = tour1;
+      Position1 = position1;
+      Length1 = length1;
+
+      Tour2 = tour2;
+      Position2 = position2;
+      Length2 = length2;
+
+      this.Individual = permutation.Clone() as AlbaEncoding;
+    }
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeMove(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeMove(this, cloner);
+    }
+
+    protected AlbaLambdaInterchangeMove(AlbaLambdaInterchangeMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour1 = original.Tour1;
+      this.Position1 = original.Position1;
+      this.Length1 = original.Length1;
+
+      this.Tour2 = original.Tour2;
+      this.Position2 = original.Position2;
+      this.Length2 = original.Length2;
+
+      this.Individual = cloner.Clone(Individual) as AlbaEncoding;
+    }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new AlbaLambdaInterchangeMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new AlbaLambdaInterchangeMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return null;
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return null;
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      return null;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaLambdaInterchangeMoveEvaluator", "Evaluates a lamnbda interchange move for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaLambdaInterchangeMoveEvaluator : AlbaMoveEvaluator, IAlbaLambdaInterchangeMoveOperator {
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return LambdaInterchangeMoveParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaLambdaInterchangeMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeMoveEvaluator(this, cloner);
+    }
+
+    private AlbaLambdaInterchangeMoveEvaluator(AlbaLambdaInterchangeMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      AlbaEncoding newSolution = LambdaInterchangeMoveParameter.ActualValue.Individual.Clone() as AlbaEncoding;
+      AlbaLambdaInterchangeMoveMaker.Apply(newSolution, LambdaInterchangeMoveParameter.ActualValue);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeMoveGenerator", "Generates lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public abstract class AlbaLambdaInterchangeMoveGenerator : AlbaMoveGenerator, IExhaustiveMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    #region IAlbaLambdaInterchangeMoveOperator Members
+
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return LambdaInterchangeMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public IValueParameter<IntValue> LambdaParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+      Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+    }
+
+    protected AlbaLambdaInterchangeMoveGenerator(AlbaLambdaInterchangeMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      AlbaEncoding individual = VRPToursParameter.ActualValue as AlbaEncoding;
+      AlbaLambdaInterchangeMove[] moves = GenerateMoves(individual, ProblemInstanceParameter.ActualValue, LambdaParameter.Value.Value);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(LambdaInterchangeMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaLambdaInterchangeMoveMaker", "Peforms a lambda interchange moves on a given VRP encoding and updates the quality. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaLambdaInterchangeMoveMaker : AlbaMoveMaker, IAlbaLambdaInterchangeMoveOperator, IMoveMaker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter {
+      get { return (ILookupParameter<AlbaLambdaInterchangeMove>)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return LambdaInterchangeMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaLambdaInterchangeMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The move to make."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeMoveMaker(this, cloner);
+    }
+
+    protected AlbaLambdaInterchangeMoveMaker(AlbaLambdaInterchangeMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(AlbaEncoding solution, AlbaLambdaInterchangeMove move) {
+      AlbaLambdaInterchangeManipulator.Apply(
+        solution,
+        move.Tour1, move.Position1, move.Length1,
+        move.Tour2, move.Position2, move.Length2);
+    }
+
+    protected override void PerformMove() {
+      AlbaLambdaInterchangeMove move = LambdaInterchangeMoveParameter.ActualValue;
+
+      Apply(move.Individual as AlbaEncoding, move);
+      VRPToursParameter.ActualValue = move.Individual;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticLambdaInterchangeMultiMoveGenerator", "Generates multiple random lambda interchange moves from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticLambdaInterchangeMultiMoveGenerator : AlbaLambdaInterchangeMoveGenerator, IStochasticOperator,
+    IMultiMoveGenerator, IAlbaLambdaInterchangeMoveOperator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaStochasticLambdaInterchangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticLambdaInterchangeMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticLambdaInterchangeMultiMoveGenerator(this, cloner);
+    }
+
+    private AlbaStochasticLambdaInterchangeMultiMoveGenerator(AlbaStochasticLambdaInterchangeMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static AlbaLambdaInterchangeMove[] GenerateAllMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda, int sampleSize, IRandom rand) {
+      AlbaLambdaInterchangeMove[] moves = new AlbaLambdaInterchangeMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        moves[i] = AlbaStochasticLambdaInterchangeSingleMoveGenerator.Apply(
+          individual, problemInstance.Cities.Value, lambda, rand);
+      }
+
+      return moves;
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) {
+      return GenerateAllMoves(individual, problemInstance, lambda, SampleSizeParameter.ActualValue.Value, RandomParameter.ActualValue);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticLambdaInterchangeSingleMoveGenerator", "Generates one random lambda interchange move from a given VRP encoding.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticLambdaInterchangeSingleMoveGenerator : AlbaLambdaInterchangeMoveGenerator,
+    IStochasticOperator, ISingleMoveGenerator, IAlbaLambdaInterchangeMoveOperator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["AlbaLambdaInterchangeMove"]; }
+    }
+
+    #endregion
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaStochasticLambdaInterchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticLambdaInterchangeSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticLambdaInterchangeSingleMoveGenerator(this, cloner);
+    }
+
+    private AlbaStochasticLambdaInterchangeSingleMoveGenerator(AlbaStochasticLambdaInterchangeSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static AlbaLambdaInterchangeMove Apply(AlbaEncoding individual, int cities, int lambda, IRandom rand) {
+      List<Tour> tours = individual.GetTours();
+
+      if (tours.Count > 1) {
+        int route1Index = rand.Next(tours.Count);
+        Tour route1 = tours[route1Index];
+
+        int route2Index = rand.Next(tours.Count - 1);
+        if (route2Index >= route1Index)
+          route2Index += 1;
+
+        Tour route2 = tours[route2Index];
+
+        int length1 = rand.Next(Math.Min(lambda + 1, route1.Stops.Count + 1));
+        int index1 = rand.Next(route1.Stops.Count - length1 + 1);
+
+        int l2Min = 0;
+        if (length1 == 0)
+          l2Min = 1;
+        int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Stops.Count + 1));
+        int index2 = rand.Next(route2.Stops.Count - length2 + 1);
+
+        return new AlbaLambdaInterchangeMove(route1Index, index1, length1, route2Index, index2, length2, individual);
+      } else {
+        return new AlbaLambdaInterchangeMove(0, 0, 0, 0, 0, 0, individual);
+      }
+    }
+
+    protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, IVRPProblemInstance problemInstance, int lambda) {
+      List<AlbaLambdaInterchangeMove> moves = new List<AlbaLambdaInterchangeMove>();
+
+      AlbaLambdaInterchangeMove move = Apply(individual, problemInstance.Cities.Value, lambda, RandomParameter.ActualValue);
+      if (move != null)
+        moves.Add(move);
+
+      return moves.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/IAlbaLambdaInterchangeMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/IAlbaLambdaInterchangeMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/LambdaInterchange/IAlbaLambdaInterchangeMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  public interface IAlbaLambdaInterchangeMoveOperator : IVRPMoveOperator {
+    ILookupParameter<AlbaLambdaInterchangeMove> LambdaInterchangeMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaStochasticTranslocationSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaStochasticTranslocationSingleMoveGenerator", "An operator which generates a single translocation move for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaStochasticTranslocationSingleMoveGenerator : AlbaMoveGenerator, IAlbaTranslocationMoveOperator {
+    [Storable]
+    private TranslocationMoveGenerator generator = new StochasticTranslocationSingleMoveGenerator();
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get {
+        return generator.TranslocationMoveParameter;
+      }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get {
+        return generator.PermutationParameter;
+      }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaStochasticTranslocationSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaStochasticTranslocationSingleMoveGenerator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticTranslocationSingleMoveGenerator(this, cloner);
+    }
+
+    private AlbaStochasticTranslocationSingleMoveGenerator(AlbaStochasticTranslocationSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      generator.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(generator);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      foreach (IScope scope in this.ExecutionContext.Scope.SubScopes) {
+        IVariable moveVariable = scope.Variables[
+          TranslocationMoveParameter.ActualName];
+
+        if (moveVariable.Value is TranslocationMove &&
+          !(moveVariable.Value is AlbaTranslocationMove)) {
+          TranslocationMove move = moveVariable.Value as TranslocationMove;
+          moveVariable.Value =
+            new AlbaTranslocationMove(
+              move.Index1, move.Index2, move.Index3, solution as AlbaEncoding);
+        }
+      }
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMove.cs	(revision 15895)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMove", "Item that describes a translocation move on a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public class AlbaTranslocationMove : TranslocationMove, IVRPMove {
+    public IVRPEncoding Individual { get { return Permutation as AlbaEncoding; } }
+
+    public AlbaTranslocationMove(int index1, int index2, int index3) :
+      base(index1, index2, index3) {
+    }
+
+    public AlbaTranslocationMove(int index1, int index2, int index3, AlbaEncoding individual) :
+      base(index1, index2, index3, individual.Clone() as AlbaEncoding) {
+    }
+
+    [StorableConstructor]
+    protected AlbaTranslocationMove(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMove(this, cloner);
+    }
+
+    protected AlbaTranslocationMove(AlbaTranslocationMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+      this.Index3 = original.Index3;
+
+      this.Permutation = cloner.Clone(Permutation) as AlbaEncoding;
+    }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new AlbaTranslocationMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new AlbaTranslocationMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return new AlbaTranslocationMoveTabuMaker();
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return new AlbaTranslocationMoveHardTabuCriterion();
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      return new AlbaTranslocationMoveSoftTabuCriterion();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("AlbaTranslocationMoveEvaluator", "Evaluates a translocation or insertion move (3-opt) for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveEvaluator : AlbaMoveEvaluator, IAlbaTranslocationMoveOperator {
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return (ILookupParameter<TranslocationMove>)Parameters["TranslocationMove"]; }
+      set { Parameters["TranslocationMove"].ActualValue = value.ActualValue; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveEvaluator(this, cloner);
+    }
+
+    private AlbaTranslocationMoveEvaluator(AlbaTranslocationMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      TranslocationMove move = TranslocationMoveParameter.ActualValue;
+      //perform move
+      AlbaEncoding newSolution = move.Permutation.Clone() as AlbaEncoding;
+      TranslocationManipulator.Apply(newSolution, move.Index1, move.Index2, move.Index3);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveGenerator", "An operator which generates translocation moves for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveGenerator : AlbaMoveGenerator, IAlbaTranslocationMoveOperator, IMultiMoveGenerator {
+    public IValueLookupParameter<TranslocationMoveGenerator> TranslocationMoveGeneratorParameter {
+      get { return (IValueLookupParameter<TranslocationMoveGenerator>)Parameters["TranslocationMoveGenerator"]; }
+    }
+
+    private IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return TranslocationMoveGeneratorParameter.Value; }
+      set {
+        TranslocationMoveGeneratorParameter.Value = value as TranslocationMoveGenerator;
+        if (TranslocationMoveGeneratorParameter.Value is IMultiMoveGenerator) {
+          ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
+        }
+      }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get {
+        if (TranslocationMoveGeneratorParameter.Value != null)
+          return TranslocationMoveGeneratorParameter.Value.TranslocationMoveParameter;
+        else
+          return null;
+      }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get {
+        if (TranslocationMoveGeneratorParameter.Value != null)
+          return TranslocationMoveGeneratorParameter.Value.PermutationParameter;
+        else
+          return null;
+      }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveGenerator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<TranslocationMoveGenerator>("TranslocationMoveGenerator", "The move generator.",
+        new StochasticTranslocationMultiMoveGenerator()));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+
+      ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveGenerator(this, cloner);
+    }
+
+    private AlbaTranslocationMoveGenerator(AlbaTranslocationMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveHardTabuCriterion", "An operator which checks if translocation moves are tabu using a hard criterion for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveHardTabuCriterion : VRPMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker, IAlbaOperator {
+    [Storable]
+    private TranslocationMoveHardTabuCriterion tabuChecker;
+    private IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return tabuChecker; }
+      set { tabuChecker = value as TranslocationMoveHardTabuCriterion; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return tabuChecker.TranslocationMoveParameter; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return tabuChecker.PermutationParameter; }
+    }
+
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return tabuChecker.MoveTabuParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return tabuChecker.MoveQualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return tabuChecker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveHardTabuCriterion()
+      : base() {
+      tabuChecker = new TranslocationMoveHardTabuCriterion();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveHardTabuCriterion(this, cloner);
+    }
+
+    private AlbaTranslocationMoveHardTabuCriterion(AlbaTranslocationMoveHardTabuCriterion original, Cloner cloner)
+      : base(original, cloner) {
+      tabuChecker = cloner.Clone(original.tabuChecker);
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveMaker", "An operator which makes translocation moves for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveMaker : AlbaMoveMaker, IAlbaTranslocationMoveOperator {
+    [Storable]
+    private TranslocationMoveMaker moveMaker;
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return moveMaker.TranslocationMoveParameter; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return moveMaker.PermutationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveMaker()
+      : base() {
+      moveMaker = new TranslocationMoveMaker();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveMaker(this, cloner);
+    }
+
+    private AlbaTranslocationMoveMaker(AlbaTranslocationMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+      moveMaker = cloner.Clone(original.moveMaker);
+    }
+
+    protected override void PerformMove() {
+      IVariable moveVariable = this.ExecutionContext.Scope.Variables[
+        TranslocationMoveParameter.ActualName];
+      TranslocationMove move = moveVariable.Value as TranslocationMove;
+      VRPToursParameter.ActualValue = move.Permutation as AlbaEncoding;
+
+      moveMaker.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(moveMaker);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveSoftTabuCriterion", "An operator which checks if translocation moves are tabu using a soft criterion for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveSoftTabuCriterion : VRPMoveOperator, IAlbaTranslocationMoveOperator, ITabuChecker, IAlbaOperator {
+    [Storable]
+    private TranslocationMoveSoftTabuCriterion tabuChecker;
+    private IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return tabuChecker; }
+      set { tabuChecker = value as TranslocationMoveSoftTabuCriterion; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return tabuChecker.TranslocationMoveParameter; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return tabuChecker.PermutationParameter; }
+    }
+
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return tabuChecker.MoveTabuParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return tabuChecker.MoveQualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return tabuChecker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveSoftTabuCriterion()
+      : base() {
+      tabuChecker = new TranslocationMoveSoftTabuCriterion();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveSoftTabuCriterion(this, cloner);
+    }
+
+    private AlbaTranslocationMoveSoftTabuCriterion(AlbaTranslocationMoveSoftTabuCriterion original, Cloner cloner)
+      : base(original, cloner) {
+      tabuChecker = cloner.Clone(original.tabuChecker);
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  [Item("AlbaTranslocationMoveTabuMaker", "An operator which makes translocation moves tabu for a VRP representation.  It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
+  [StorableClass]
+  public sealed class AlbaTranslocationMoveTabuMaker : VRPMoveOperator, IAlbaTranslocationMoveOperator, ITabuMaker, IAlbaOperator {
+    [Storable]
+    private TranslocationMoveTabuMaker moveTabuMaker;
+    private IPermutationMoveOperator PermutationMoveOperatorParameter {
+      get { return moveTabuMaker; }
+      set { moveTabuMaker = value as TranslocationMoveTabuMaker; }
+    }
+
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return moveTabuMaker.PermutationParameter; }
+    }
+
+    public ILookupParameter<TranslocationMove> TranslocationMoveParameter {
+      get { return moveTabuMaker.TranslocationMoveParameter; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TranslocationMoveParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return moveTabuMaker.MoveQualityParameter; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return moveTabuMaker.QualityParameter; }
+    }
+
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return moveTabuMaker.MaximizationParameter; }
+    }
+
+    [StorableConstructor]
+    private AlbaTranslocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
+
+    public AlbaTranslocationMoveTabuMaker()
+      : base() {
+      moveTabuMaker = new TranslocationMoveTabuMaker();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveTabuMaker(this, cloner);
+    }
+
+    private AlbaTranslocationMoveTabuMaker(AlbaTranslocationMoveTabuMaker original, Cloner cloner)
+      : base(original, cloner) {
+      moveTabuMaker = cloner.Clone(original.moveTabuMaker);
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+
+      PermutationMoveOperatorParameter.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateChildOperation(PermutationMoveOperatorParameter);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/IAlbaTranslocationMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/IAlbaTranslocationMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/Moves/ThreeOpt/IAlbaTranslocationMoveOperator.cs	(revision 15895)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
+  public interface IAlbaTranslocationMoveOperator : IVRPMoveOperator {
+    ILookupParameter<TranslocationMove> TranslocationMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Crossovers/GVRCrossover.cs	(revision 15895)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRCrossover", "The GVR crossover operation. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRCrossover : VRPCrossover, IStochasticOperator, IGVROperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    private GVRCrossover(bool deserializing) : base(deserializing) { }
+
+    public GVRCrossover() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVRCrossover(this, cloner);
+    }
+
+    private GVRCrossover(GVRCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private GVREncoding Crossover(IRandom random, GVREncoding parent1, GVREncoding parent2) {
+      GVREncoding child = parent1.Clone() as GVREncoding;
+
+      Tour tour = parent2.Tours[random.Next(parent2.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Stops.Count);
+      int length = random.Next(1, tour.Stops.Count - breakPoint1 + 1);
+      List<int> subroute = tour.Stops.GetRange(breakPoint1, length);
+
+      //remove duplicates
+      List<Tour> toBeRemoved = new List<Tour>();
+
+      foreach (Tour route in child.Tours) {
+        foreach (int city in subroute) {
+          route.Stops.Remove(city);
+        }
+
+        if (route.Stops.Count == 0)
+          toBeRemoved.Add(route);
+      }
+      foreach (Tour route in toBeRemoved) {
+        child.Tours.Remove(route);
+      }
+
+      //choose nearest customer
+      double minDistance = -1;
+      int customer = -1;
+      for (int i = 1; i <= ProblemInstance.Cities.Value; i++) {
+        if (!subroute.Contains(i)) {
+          double distance = ProblemInstance.GetDistance(subroute[0], i, child);
+
+          if (customer == -1 || distance < minDistance) {
+            customer = i;
+            minDistance = distance;
+          }
+        }
+      }
+
+      //insert
+      if (customer != -1) {
+        Tour newTour;
+        int newPosition;
+        child.FindCustomer(customer, out newTour, out newPosition);
+        newTour.Stops.InsertRange(newPosition + 1, subroute);
+      } else {
+        //special case -> only one tour, whole tour has been chosen as subroute
+        child = parent1.Clone() as GVREncoding;
+      }
+
+      return child;
+    }
+
+    public override IOperation InstrumentedApply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+        if (!(solution is GVREncoding)) {
+          parents[i] = GVREncoding.ConvertFrom(solution, ProblemInstance);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue = Crossover(RandomParameter.ActualValue, parents[0] as GVREncoding, parents[1] as GVREncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/GVREncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/GVREncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/GVREncoding.cs	(revision 15895)
@@ -0,0 +1,131 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVREncoding", "Represents a potvin encoding of VRP solutions. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public class GVREncoding : TourEncoding {
+    public override List<Tour> GetTours() {
+      List<Tour> tours = new List<Tour>();
+
+      foreach (Tour tour in base.Tours) {
+        Tour newTour = new Tour();
+        double currentDemand = 0;
+
+        DoubleValue capacity = new DoubleValue(double.MaxValue);
+        if (ProblemInstance is IHomogenousCapacitatedProblemInstance) {
+          capacity.Value = (ProblemInstance as IHomogenousCapacitatedProblemInstance).Capacity.Value;
+        }
+
+
+        foreach (int city in tour.Stops) {
+          currentDemand += ProblemInstance.GetDemand(city);
+
+          if (currentDemand > capacity.Value) {
+            if (newTour.Stops.Count > 0)
+              tours.Add(newTour);
+
+            newTour = new Tour();
+            newTour.Stops.Add(city);
+            currentDemand = ProblemInstance.GetDemand(city);
+          } else {
+            newTour.Stops.Add(city);
+          }
+        }
+
+        if (newTour.Stops.Count > 0)
+          tours.Add(newTour);
+      }
+
+      //repair if there are too many vehicles used
+      while (tours.Count > ProblemInstance.Vehicles.Value) {
+        Tour tour = tours[tours.Count - 1];
+        tours[tours.Count - 2].Stops.AddRange(tour.Stops);
+
+        tours.Remove(tour);
+      }
+
+      return tours;
+    }
+
+    public GVREncoding(IVRPProblemInstance problemInstance)
+      : base(problemInstance) {
+    }
+
+    [StorableConstructor]
+    protected GVREncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVREncoding(this, cloner);
+    }
+
+    protected GVREncoding(GVREncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static GVREncoding ConvertFrom(IVRPEncoding encoding, IVRPProblemInstance problemInstance) {
+      GVREncoding solution = new GVREncoding(problemInstance);
+
+      TourEncoding.ConvertFrom(encoding, solution, problemInstance);
+
+      return solution;
+    }
+
+    public static GVREncoding ConvertFrom(List<int> route, IVRPProblemInstance problemInstance) {
+      GVREncoding solution = new GVREncoding(problemInstance);
+
+      TourEncoding.ConvertFrom(route, solution);
+
+      return solution;
+    }
+
+    internal void FindCustomer(int customer, out Tour tour, out int index) {
+      tour = null;
+      index = -1;
+
+      int currentTour = 0;
+      while (tour == null && currentTour < Tours.Count) {
+        int currentCity = 0;
+        while (tour == null && currentCity < Tours[currentTour].Stops.Count) {
+          if (Tours[currentTour].Stops[currentCity] == customer) {
+            tour = Tours[currentTour];
+            index = currentCity;
+          }
+
+          currentCity++;
+        }
+
+        currentTour++;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/IGVROperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/IGVROperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/IGVROperator.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  public interface IGVROperator :
+    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRDisplacementManipulator.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRDisplacementManipulator", "An operator which manipulates a GVR representation by applying a displacement operation. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRDisplacementManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRDisplacementManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRDisplacementManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVRDisplacementManipulator(this, cloner);
+    }
+
+    private GVRDisplacementManipulator(GVRDisplacementManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      Tour tour = individual.Tours[random.Next(individual.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Stops.Count);
+      int length = random.Next(1, tour.Stops.Count - breakPoint1 + 1);
+
+      List<int> displaced = tour.Stops.GetRange(breakPoint1, length);
+      tour.Stops.RemoveRange(breakPoint1, length);
+      //with a probability of 1/(2*V) create a new tour, else insert at another position
+      if (individual.GetTours().Count > 0 &&
+        individual.GetTours().Count < ProblemInstance.Vehicles.Value &&
+        random.Next(individual.GetTours().Count * 2) == 0) {
+        Tour newTour = new Tour();
+        newTour.Stops.InsertRange(0, displaced);
+
+        individual.Tours.Add(newTour);
+      } else {
+        Tour newTour = individual.Tours[random.Next(individual.Tours.Count)];
+        int newPosition = newTour.Stops.Count;
+
+        newTour.Stops.InsertRange(newPosition, displaced);
+      }
+
+      if (tour.Stops.Count == 0)
+        individual.Tours.Remove(tour);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInsertionManipulator.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRInsertionManipulator", "An operator which manipulates a GVR representation by inserting a customer at another location. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRInsertionManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRInsertionManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRInsertionManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVRInsertionManipulator(this, cloner);
+    }
+
+    private GVRInsertionManipulator(GVRInsertionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      int customer = random.Next(1, individual.Cities + 1);
+      Tour tour;
+      int position;
+      individual.FindCustomer(customer, out tour, out position);
+
+      tour.Stops.RemoveAt(position);
+
+      //with a probability of 1/(2*V) create a new tour, else insert at another position
+      if (individual.GetTours().Count > 0 &&
+        individual.GetTours().Count < ProblemInstance.Vehicles.Value &&
+        random.Next(individual.GetTours().Count * 2) == 0) {
+        Tour newTour = new Tour();
+        newTour.Stops.Add(customer);
+
+        individual.Tours.Add(newTour);
+      } else {
+        Tour newTour = individual.Tours[random.Next(individual.Tours.Count)];
+        int newPosition = random.Next(newTour.Stops.Count + 1);
+
+        newTour.Stops.Insert(newPosition, customer);
+      }
+
+      if (tour.Stops.Count == 0)
+        individual.Tours.Remove(tour);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInversionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInversionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRInversionManipulator.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRInversionManipulator", "An operator which manipulates a GVR representation by inverting a subroute. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRInversionManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRInversionManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRInversionManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVRInversionManipulator(this, cloner);
+    }
+
+    private GVRInversionManipulator(GVRInversionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      Tour tour = individual.Tours[random.Next(individual.Tours.Count)];
+      int breakPoint1 = random.Next(tour.Stops.Count);
+      int length = random.Next(1, tour.Stops.Count - breakPoint1 + 1);
+
+      tour.Stops.Reverse(breakPoint1, length);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRManipulator.cs	(revision 15895)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRManipulator", "A VRP manipulation operation.")]
+  [StorableClass]
+  public abstract class GVRManipulator : VRPManipulator, IStochasticOperator, IGVROperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected GVRManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRManipulator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected GVRManipulator(GVRManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void Manipulate(IRandom random, GVREncoding individual);
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is GVREncoding)) {
+        VRPToursParameter.ActualValue = GVREncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as GVREncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRSwapManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRSwapManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/GVR/Manipulators/GVRSwapManipulator.cs	(revision 15895)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.GVR {
+  [Item("GVRSwapManipulator", "An operator which manipulates a GVR representation by swapping two customers. It is implemented as described in Pereira, F.B. et al (2002). GVR: a New Genetic Representation for the Vehicle Routing Problem. AICS 2002, LNAI 2464, pp. 95-102.")]
+  [StorableClass]
+  public sealed class GVRSwapManipulator : GVRManipulator {
+    [StorableConstructor]
+    private GVRSwapManipulator(bool deserializing) : base(deserializing) { }
+
+    public GVRSwapManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GVRSwapManipulator(this, cloner);
+    }
+
+    private GVRSwapManipulator(GVRSwapManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, GVREncoding individual) {
+      int customer1 = random.Next(1, individual.Cities + 1);
+      int customer2 = random.Next(1, individual.Cities + 1);
+
+      Tour tour1;
+      int pos1;
+      individual.FindCustomer(customer1, out tour1, out pos1);
+
+      Tour tour2;
+      int pos2;
+      individual.FindCustomer(customer2, out tour2, out pos2);
+
+      int temp = tour1.Stops[pos1];
+      tour1.Stops[pos1] = tour2.Stops[pos2];
+      tour2.Stops[pos2] = temp;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 15895)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionCreator", "Randomly selects and applies one of its creator every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionCreator : StochasticMultiBranch<IVRPCreator>, IVRPCreator, IGeneralVRPOperator, IMultiVRPOperator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPSolutionCreator(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The new VRP tours."));
+
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionCreator(this, cloner);
+    }
+
+    protected MultiVRPSolutionCreator(MultiVRPSolutionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCreator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeCreators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCreator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeCreators();
+    }
+
+    public void SetOperators(IEnumerable<IOperator> operators) {
+      foreach (IOperator op in operators) {
+        if (op is IVRPCreator && !(op is MultiVRPSolutionCreator)) {
+          Operators.Add(op.Clone() as IVRPCreator, true);
+        }
+      }
+    }
+
+    private void ParameterizeCreators() {
+      foreach (IVRPCreator creator in Operators.OfType<IVRPCreator>()) {
+        creator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+        creator.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+      }
+      foreach (IStochasticOperator creator in Operators.OfType<IStochasticOperator>()) {
+        creator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one VRP creator to choose from.");
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/VRPCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/VRPCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Creators/VRPCreator.cs	(revision 15895)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPCreator", "Creates a VRP solution.")]
+  [StorableClass]
+  public abstract class VRPCreator : VRPOperator, IVRPCreator {
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPCreator(bool deserializing) : base(deserializing) { }
+
+    public VRPCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be created."));
+    }
+
+    protected VRPCreator(VRPCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/BiasedMultiVRPSolutionCrossover.cs	(revision 15895)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("BiasedMultiVRPSolutionCrossover", "Randomly selects and applies one of its crossovers every time it is called based on the success progress.")]
+  [StorableClass]
+  public class BiasedMultiVRPSolutionCrossover : MultiVRPSolutionCrossover {
+    public ValueLookupParameter<DoubleArray> ActualProbabilitiesParameter {
+      get { return (ValueLookupParameter<DoubleArray>)Parameters["ActualProbabilities"]; }
+    }
+
+    public ValueLookupParameter<StringValue> SuccessProgressAnalyisis {
+      get { return (ValueLookupParameter<StringValue>)Parameters["SuccessProgressAnalysis"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> Factor {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["Factor"]; }
+    }
+
+    public ValueParameter<DoubleValue> LowerBoundParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["LowerBound"]; }
+    }
+
+    public ValueParameter<IntValue> DepthParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+
+    [StorableConstructor]
+    protected BiasedMultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected BiasedMultiVRPSolutionCrossover(BiasedMultiVRPSolutionCrossover original, Cloner cloner) : base(original, cloner) { }
+    public BiasedMultiVRPSolutionCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("ActualProbabilities", "The array of relative probabilities for each operator."));
+      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered",
+        new StringValue("ExecutedCrossoverOperator")));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Factor", "The factor with which the probabilities should be updated", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BiasedMultiVRPSolutionCrossover(this, cloner);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      ActualProbabilitiesParameter.Value = null;
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperator successor = null;
+
+      if (ActualProbabilitiesParameter.ActualValue == null) {
+        ActualProbabilitiesParameter.Value = ProbabilitiesParameter.ActualValue.Clone() as DoubleArray;
+      } else {
+        String key = "SuccessfulOffspringAnalyzer Results";
+
+        ResultCollection results = null;
+        IScope scope = ExecutionContext.Parent.Scope;
+        int depth = 1;
+        while (scope != null && depth < DepthParameter.Value.Value) {
+          scope = scope.Parent;
+          depth++;
+        }
+        if (scope != null)
+          results = scope.Variables["Results"].Value as ResultCollection;
+
+        if (results != null && results.ContainsKey(key)) {
+          ResultCollection successProgressAnalysisResult = results[key].Value as ResultCollection;
+          key = SuccessProgressAnalyisis.Value.Value;
+
+          if (successProgressAnalysisResult.ContainsKey(key)) {
+            DataTable successProgressAnalysis = successProgressAnalysisResult[key].Value as DataTable;
+
+            for (int i = 0; i < Operators.Count; i++) {
+              IOperator current = Operators[i];
+
+              if (successProgressAnalysis.Rows.ContainsKey(current.Name)) {
+                DataRow row = successProgressAnalysis.Rows[current.Name];
+
+                double sum = 0.0;
+                ObservableList<double> usages = row.Values;
+
+                sum += (double)usages.Last();
+
+                ActualProbabilitiesParameter.ActualValue[i] += (sum / ActualProbabilitiesParameter.ActualValue[i]) * Factor.Value.Value;
+              }
+            }
+          }
+        }
+
+        //normalize
+        double max = ActualProbabilitiesParameter.ActualValue.Max();
+        for (int i = 0; i < ActualProbabilitiesParameter.ActualValue.Length; i++) {
+          ActualProbabilitiesParameter.ActualValue[i] /= max;
+          ActualProbabilitiesParameter.ActualValue[i] =
+            Math.Max(LowerBoundParameter.Value.Value,
+            ActualProbabilitiesParameter.ActualValue[i]);
+        }
+      }
+
+      //////////////// code has to be duplicated since ActualProbabilitiesParameter.ActualValue are updated and used for operator selection
+      IRandom random = RandomParameter.ActualValue;
+      DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
+      if (probabilities.Length != Operators.Count) {
+        throw new InvalidOperationException(Name + ": The list of probabilities has to match the number of operators");
+      }
+      var checkedOperators = Operators.CheckedItems;
+      if (checkedOperators.Count() > 0) {
+        // select a random operator from the checked operators
+        successor = checkedOperators.SampleProportional(random, 1, checkedOperators.Select(x => probabilities[x.Index]), false, false).First().Value;
+      }
+
+      IOperation successorOp = null;
+      if (Successor != null)
+        successorOp = ExecutionContext.CreateOperation(Successor);
+      OperationCollection next = new OperationCollection(successorOp);
+      if (successor != null) {
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.Name);
+
+        if (CreateChildOperation)
+          next.Insert(0, ExecutionContext.CreateChildOperation(successor));
+        else next.Insert(0, ExecutionContext.CreateOperation(successor));
+      } else {
+        SelectedOperatorParameter.ActualValue = new StringValue("");
+      }
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 15895)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionCrossover : StochasticMultiBranch<IVRPCrossover>, IVRPCrossover, IGeneralVRPOperator, IMultiVRPOperator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> ChildParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
+    }
+
+
+    [StorableConstructor]
+    protected MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      ParentsParameter.ActualName = "VRPTours";
+      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
+      ChildParameter.ActualName = "VRPTours";
+
+      SelectedOperatorParameter.ActualName = "SelectedCrossoverOperator";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionCrossover(this, cloner);
+    }
+
+    protected MultiVRPSolutionCrossover(MultiVRPSolutionCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPCrossover>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeCrossovers();
+    }
+
+    public void SetOperators(IEnumerable<IOperator> operators) {
+      foreach (IOperator op in operators) {
+        if (op is IVRPCrossover && !(op is MultiVRPSolutionCrossover)) {
+          Operators.Add(op.Clone() as IVRPCrossover, true);
+        }
+      }
+    }
+
+    private void ParameterizeCrossovers() {
+      foreach (IVRPCrossover crossover in Operators.OfType<IVRPCrossover>()) {
+        crossover.ChildParameter.ActualName = ChildParameter.Name;
+        crossover.ParentsParameter.ActualName = ParentsParameter.Name;
+        crossover.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+      }
+      foreach (IStochasticOperator crossover in Operators.OfType<IStochasticOperator>()) {
+        crossover.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation crossover to choose from.");
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 15895)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General.Crossovers {
+  [Item("RandomParentCloneCrossover", "An operator which randomly chooses one parent and returns a clone.")]
+  [StorableClass]
+  public sealed class RandomParentCloneCrossover : VRPOperator, IStochasticOperator, IGeneralVRPOperator, IVRPCrossover {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> ChildParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
+    }
+
+    [StorableConstructor]
+    private RandomParentCloneCrossover(bool deserializing) : base(deserializing) { }
+
+    public RandomParentCloneCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      ParentsParameter.ActualName = "VRPTours";
+      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
+      ChildParameter.ActualName = "VRPTours";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomParentCloneCrossover(this, cloner);
+    }
+
+    private RandomParentCloneCrossover(RandomParentCloneCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (RandomParameter.ActualValue.Next() < 0.5)
+        ChildParameter.ActualValue = ParentsParameter.ActualValue[0].Clone() as IVRPEncoding;
+      else
+        ChildParameter.ActualValue = ParentsParameter.ActualValue[1].Clone() as IVRPEncoding;
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/VRPCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/VRPCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Crossovers/VRPCrossover.cs	(revision 15895)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPCrossover", "Crosses VRP solutions.")]
+  [StorableClass]
+  public abstract class VRPCrossover : VRPOperator, IVRPCrossover {
+    public ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["Parents"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> ChildParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["Child"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPCrossover(bool deserializing) : base(deserializing) { }
+
+    public VRPCrossover()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      ParentsParameter.ActualName = "VRPTours";
+      Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
+      ChildParameter.ActualName = "VRPTours";
+    }
+
+    protected VRPCrossover(VRPCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/BiasedMultiVRPSolutionManipulator.cs	(revision 15895)
@@ -0,0 +1,166 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("BiasedMultiVRPSolutionManipulator", "Randomly selects and applies one of its crossovers every time it is called based on the success progress.")]
+  [StorableClass]
+  public class BiasedMultiVRPSolutionManipulator : MultiVRPSolutionManipulator {
+    public ValueLookupParameter<DoubleArray> ActualProbabilitiesParameter {
+      get { return (ValueLookupParameter<DoubleArray>)Parameters["ActualProbabilities"]; }
+    }
+
+    public ValueLookupParameter<StringValue> SuccessProgressAnalyisis {
+      get { return (ValueLookupParameter<StringValue>)Parameters["SuccessProgressAnalysis"]; }
+    }
+
+    public ValueLookupParameter<DoubleValue> Factor {
+      get { return (ValueLookupParameter<DoubleValue>)Parameters["Factor"]; }
+    }
+
+    public ValueParameter<DoubleValue> LowerBoundParameter {
+      get { return (ValueParameter<DoubleValue>)Parameters["LowerBound"]; }
+    }
+
+    public ValueParameter<IntValue> DepthParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Depth"]; }
+    }
+
+    [StorableConstructor]
+    protected BiasedMultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected BiasedMultiVRPSolutionManipulator(BiasedMultiVRPSolutionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public BiasedMultiVRPSolutionManipulator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("ActualProbabilities", "The array of relative probabilities for each operator."));
+      Parameters.Add(new ValueLookupParameter<StringValue>("SuccessProgressAnalysis", "The success progress analyisis to be considered",
+        new StringValue("ExecutedMutationOperator")));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Factor", "The factor with which the probabilities should be updated", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("LowerBound", "The depth of the individuals in the scope tree.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<IntValue>("Depth", "The depth of the individuals in the scope tree.", new IntValue(1)));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BiasedMultiVRPSolutionManipulator(this, cloner);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      ActualProbabilitiesParameter.Value = null;
+    }
+
+    public override IOperation InstrumentedApply() {
+      IOperator successor = null;
+
+      if (ActualProbabilitiesParameter.ActualValue == null) {
+        ActualProbabilitiesParameter.Value = ProbabilitiesParameter.ActualValue.Clone() as DoubleArray;
+      } else {
+        String key = "SuccessfulOffspringAnalyzer Results";
+
+        ResultCollection results = null;
+        IScope scope = ExecutionContext.Parent.Scope;
+        int depth = 1;
+        while (scope != null && depth < DepthParameter.Value.Value) {
+          scope = scope.Parent;
+          depth++;
+        }
+        if (scope != null)
+          results = scope.Variables["Results"].Value as ResultCollection;
+
+        if (results != null && results.ContainsKey(key)) {
+          ResultCollection successProgressAnalysisResult = results[key].Value as ResultCollection;
+          key = SuccessProgressAnalyisis.Value.Value;
+
+          if (successProgressAnalysisResult.ContainsKey(key)) {
+            DataTable successProgressAnalysis = successProgressAnalysisResult[key].Value as DataTable;
+
+            for (int i = 0; i < Operators.Count; i++) {
+              IOperator current = Operators[i];
+
+              if (successProgressAnalysis.Rows.ContainsKey(current.Name)) {
+                DataRow row = successProgressAnalysis.Rows[current.Name];
+
+                double sum = 0.0;
+                ObservableList<double> usages = row.Values;
+
+                sum += usages.Last();
+
+                ActualProbabilitiesParameter.ActualValue[i] += (sum / ActualProbabilitiesParameter.ActualValue[i]) * Factor.Value.Value;
+              }
+            }
+          }
+        }
+
+        //normalize
+        double max = ActualProbabilitiesParameter.ActualValue.Max();
+        for (int i = 0; i < ActualProbabilitiesParameter.ActualValue.Length; i++) {
+          ActualProbabilitiesParameter.ActualValue[i] /= max;
+          ActualProbabilitiesParameter.ActualValue[i] =
+            Math.Max(LowerBoundParameter.Value.Value,
+            ActualProbabilitiesParameter.ActualValue[i]);
+        }
+      }
+
+      //////////////// code has to be duplicated since ActualProbabilitiesParameter.ActualValue are updated and used for operator selection
+      IRandom random = RandomParameter.ActualValue;
+      DoubleArray probabilities = ActualProbabilitiesParameter.ActualValue;
+      if (probabilities.Length != Operators.Count) {
+        throw new InvalidOperationException(Name + ": The list of probabilities has to match the number of operators");
+      }
+      var checkedOperators = Operators.CheckedItems;
+      if (checkedOperators.Count() > 0) {
+        // select a random operator from the checked operators
+        successor =
+          checkedOperators.SampleProportional(random, 1, checkedOperators.Select(x => probabilities[x.Index]), false, false).First().Value;
+      }
+
+      IOperation successorOp = null;
+      if (Successor != null)
+        successorOp = ExecutionContext.CreateOperation(Successor);
+      OperationCollection next = new OperationCollection(successorOp);
+      if (successor != null) {
+        SelectedOperatorParameter.ActualValue = new StringValue(successor.Name);
+
+        if (CreateChildOperation)
+          next.Insert(0, ExecutionContext.CreateChildOperation(successor));
+        else next.Insert(0, ExecutionContext.CreateOperation(successor));
+      } else {
+        SelectedOperatorParameter.ActualValue = new StringValue("");
+      }
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 15895)
@@ -0,0 +1,106 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPSolutionManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
+  [StorableClass]
+  public class MultiVRPSolutionManipulator : StochasticMultiBranch<IVRPManipulator>, IVRPManipulator, IGeneralVRPOperator, IMultiVRPOperator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    public MultiVRPSolutionManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+
+      SelectedOperatorParameter.ActualName = "SelectedManipulationOperator";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionManipulator(this, cloner);
+    }
+
+    protected MultiVRPSolutionManipulator(MultiVRPSolutionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeManipulators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeManipulators();
+    }
+
+    public void SetOperators(IEnumerable<IOperator> operators) {
+      foreach (IOperator op in operators) {
+        if (op is IVRPManipulator && !(op is MultiVRPSolutionManipulator)) {
+          Operators.Add(op.Clone() as IVRPManipulator, !(op is IVRPLocalSearchManipulator));
+        }
+      }
+    }
+
+    private void ParameterizeManipulators() {
+      foreach (IVRPManipulator manipulator in Operators.OfType<IVRPManipulator>()) {
+        manipulator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+        manipulator.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+      }
+      foreach (IStochasticOperator manipulator in Operators.OfType<IStochasticOperator>()) {
+        manipulator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one permutation manipulator to choose from.");
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/VRPManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/VRPManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Manipulators/VRPManipulator.cs	(revision 15895)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPManipulator", "Manipulates a VRP solution.")]
+  [StorableClass]
+  public abstract class VRPManipulator : VRPOperator, IVRPManipulator {
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPManipulator(bool deserializing) : base(deserializing) { }
+
+    public VRPManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours to be manipulated."));
+    }
+
+    protected VRPManipulator(VRPManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  public interface IMultiVRPMoveGenerator : IMultiVRPMoveOperator, ISingleMoveGenerator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IMultiVRPMoveOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  public interface IMultiVRPMoveOperator : IVRPMoveOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IVRPMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IVRPMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/Interfaces/IVRPMove.cs	(revision 15895)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  public interface IVRPMove : IItem {
+    VRPMoveEvaluator GetMoveEvaluator();
+    VRPMoveMaker GetMoveMaker();
+    ITabuMaker GetTabuMaker();
+    ITabuChecker GetTabuChecker();
+    ITabuChecker GetSoftTabuChecker();
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("MultiVRPMoveEvaluator", "Evaluates a move for the VRP representation.")]
+  [StorableClass]
+  public sealed class MultiVRPMoveEvaluator : VRPMoveEvaluator, IMultiVRPMoveOperator, IGeneralVRPOperator {
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["VRPMove"]; }
+    }
+
+    [StorableConstructor]
+    private MultiVRPMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public MultiVRPMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The generated moves."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveEvaluator(this, cloner);
+    }
+
+    private MultiVRPMoveEvaluator(MultiVRPMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() { }
+
+    public override IOperation InstrumentedApply() {
+      IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove;
+
+      VRPMoveEvaluator moveEvaluator = move.GetMoveEvaluator();
+      moveEvaluator.VRPMoveParameter.ActualName = VRPMoveParameter.Name;
+
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
+      next.Insert(0, ExecutionContext.CreateOperation(moveEvaluator));
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,192 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPMoveGenerator", "Randomly selects and applies its move generators.")]
+  [StorableClass]
+  public class MultiVRPMoveGenerator : CheckedMultiOperator<IMultiVRPMoveGenerator>, IMultiVRPMoveOperator,
+    IStochasticOperator, IMoveGenerator, IGeneralVRPOperator, IMultiVRPOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public IValueLookupParameter<IntValue> SelectedOperatorsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SelectedOperators"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["VRPMove"]; }
+    }
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public IVRPProblemInstance ProblemInstance {
+      get { return ProblemInstanceParameter.ActualValue; }
+    }
+
+    public ValueLookupParameter<DoubleArray> ProbabilitiesParameter {
+      get { return (ValueLookupParameter<DoubleArray>)Parameters["Probabilities"]; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public DoubleArray Probabilities {
+      get { return ProbabilitiesParameter.Value; }
+      set { ProbabilitiesParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPMoveGenerator(bool deserializing) : base(deserializing) { }
+    public MultiVRPMoveGenerator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IntValue>("SelectedOperators", "The number of selected operators.", new IntValue(1)));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new ValueLookupParameter<DoubleArray>("Probabilities", "The array of relative probabilities for each operator.", new DoubleArray()));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours."));
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The generated moves."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveGenerator(this, cloner);
+    }
+
+    protected MultiVRPMoveGenerator(MultiVRPMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public void SetOperators(IEnumerable<IOperator> operators) {
+      foreach (IOperator op in operators) {
+        if (op is IMultiVRPMoveGenerator && !(op is MultiOperator<IMultiVRPMoveGenerator>)) {
+          Operators.Add(op.Clone() as IMultiVRPMoveGenerator, !(op is IAlbaOperator || op is PotvinVehicleAssignmentMultiMoveGenerator));
+        }
+      }
+    }
+
+    protected override void Operators_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMultiVRPMoveGenerator>> e) {
+      base.Operators_ItemsRemoved(sender, e);
+      if (Probabilities != null && Probabilities.Length > Operators.Count) {
+        List<double> probs = new List<double>(Probabilities.Cast<double>());
+        var sorted = e.Items.OrderByDescending(x => x.Index);
+        foreach (IndexedItem<IMultiVRPMoveGenerator> item in sorted)
+          if (probs.Count > item.Index) probs.RemoveAt(item.Index);
+        Probabilities = new DoubleArray(probs.ToArray());
+      }
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMultiVRPMoveGenerator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeMoveGenerators();
+    }
+
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IMultiVRPMoveGenerator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeMoveGenerators();
+
+      if (Probabilities != null && Probabilities.Length < Operators.Count) {
+        double avg = (Probabilities.Where(x => x > 0).Count() > 0) ? (Probabilities.Where(x => x > 0).Average()) : (1);
+        // add the average of all probabilities in the respective places (the new operators)
+        var added = e.Items.OrderBy(x => x.Index).ToList();
+        int insertCount = 0;
+        DoubleArray probs = new DoubleArray(Operators.Count);
+        for (int i = 0; i < Operators.Count; i++) {
+          if (insertCount < added.Count && i == added[insertCount].Index) {
+            probs[i] = avg;
+            insertCount++;
+          } else if (i - insertCount < Probabilities.Length) {
+            probs[i] = Probabilities[i - insertCount];
+          } else probs[i] = avg;
+        }
+        Probabilities = probs;
+      }
+    }
+
+    private void ParameterizeMoveGenerators() {
+      foreach (IMultiVRPMoveOperator moveGenerator in Operators.OfType<IMultiVRPMoveOperator>()) {
+        moveGenerator.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+        moveGenerator.VRPToursParameter.ActualName = VRPToursParameter.Name;
+        moveGenerator.VRPMoveParameter.ActualName = VRPMoveParameter.Name;
+      }
+      foreach (IStochasticOperator moveGenerator in Operators.OfType<IStochasticOperator>()) {
+        moveGenerator.RandomParameter.ActualName = RandomParameter.Name;
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (Operators.Count == 0) throw new InvalidOperationException(Name + ": Please add at least one VRP move generator choose from.");
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
+
+      for (int i = 0; i < SelectedOperatorsParameter.ActualValue.Value; i++) {
+        IRandom random = RandomParameter.ActualValue;
+        DoubleArray probabilities = ProbabilitiesParameter.ActualValue;
+        if (probabilities.Length != Operators.Count) {
+          throw new InvalidOperationException(Name + ": The list of probabilities has to match the number of operators");
+        }
+        IOperator successor = null;
+        var checkedOperators = Operators.CheckedItems;
+        if (checkedOperators.Count() > 0) {
+          // select a random operator from the checked operators
+          double sum = (from indexedItem in checkedOperators select probabilities[indexedItem.Index]).Sum();
+          if (sum == 0) throw new InvalidOperationException(Name + ": All selected operators have zero probability.");
+          double r = random.NextDouble() * sum;
+          sum = 0;
+          foreach (var indexedItem in checkedOperators) {
+            sum += probabilities[indexedItem.Index];
+            if (sum > r) {
+              successor = indexedItem.Value;
+              break;
+            }
+          }
+        }
+
+        if (successor != null) {
+          next.Insert(0, ExecutionContext.CreateChildOperation(successor));
+        }
+      }
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 15895)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPMoveMaker", "Peforms a lambda interchange moves on a given VRP encoding and updates the quality.")]
+  [StorableClass]
+  public class MultiVRPMoveMaker : VRPMoveMaker, IMultiVRPMoveOperator, IGeneralVRPOperator {
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["VRPMove"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public MultiVRPMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveMaker(this, cloner);
+    }
+
+    protected MultiVRPMoveMaker(MultiVRPMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void PerformMove() {
+      IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove;
+
+      VRPMoveMaker moveMaker = move.GetMoveMaker();
+      moveMaker.VRPMoveParameter.ActualName = VRPMoveParameter.Name;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(moveMaker);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuChecker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuChecker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuChecker.cs	(revision 15895)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPMoveTabuChecker", "Checks if a VRP move is tabu.")]
+  [StorableClass]
+  public class MultiVRPMoveTabuChecker : SingleSuccessorOperator, IMultiVRPMoveOperator, ITabuChecker, IGeneralVRPOperator {
+    public ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["VRPMove"]; }
+    }
+
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPMoveTabuChecker(bool deserializing) : base(deserializing) { }
+
+    public MultiVRPMoveTabuChecker()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The move."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveTabuChecker(this, cloner);
+    }
+
+    protected MultiVRPMoveTabuChecker(MultiVRPMoveTabuChecker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove;
+
+      ITabuChecker tabuChecker;
+      if (UseAspirationCriterion.Value)
+        tabuChecker = move.GetSoftTabuChecker();
+      else
+        tabuChecker = move.GetTabuChecker();
+
+      (tabuChecker as IVRPMoveOperator).VRPMoveParameter.ActualName = VRPMoveParameter.Name;
+
+      OperationCollection next = new OperationCollection(base.Apply());
+      next.Insert(0, ExecutionContext.CreateOperation(tabuChecker));
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("MultiVRPMoveTabuMaker", "A multi VRP move tabu maker.")]
+  [StorableClass]
+  public class MultiVRPMoveTabuMaker : SingleSuccessorOperator, IMultiVRPMoveOperator, ITabuMaker, IGeneralVRPOperator, ISingleObjectiveOperator {
+    public ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["VRPMove"]; }
+    }
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntValue> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["TabuTenure"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    [StorableConstructor]
+    protected MultiVRPMoveTabuMaker(bool deserializing) : base(deserializing) { }
+
+    public MultiVRPMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The move."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveTabuMaker(this, cloner);
+    }
+
+    protected MultiVRPMoveTabuMaker(MultiVRPMoveTabuMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      IVRPMove move = VRPMoveParameter.ActualValue as IVRPMove;
+
+      ITabuMaker moveTabuMaker = move.GetTabuMaker();
+      (moveTabuMaker as IVRPMoveOperator).VRPMoveParameter.ActualName = VRPMoveParameter.Name;
+
+      OperationCollection next = new OperationCollection(base.Apply());
+      next.Insert(0, ExecutionContext.CreateOperation(moveTabuMaker));
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveAttribute.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveAttribute.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveAttribute.cs	(revision 15895)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPMoveAttribute", "Base class for specifying a move attribute")]
+  [StorableClass]
+  public class VRPMoveAttribute : Item {
+    [Storable]
+    public double MoveQuality { get; protected set; }
+
+    [StorableConstructor]
+    protected VRPMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected VRPMoveAttribute(VRPMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
+    }
+    public VRPMoveAttribute() : this(0) { }
+    public VRPMoveAttribute(double moveQuality)
+      : base() {
+      MoveQuality = moveQuality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPMoveAttribute(this, cloner);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPMoveEvaluator", "Evaluates a VRP move.")]
+  [StorableClass]
+  public abstract class VRPMoveEvaluator : VRPMoveOperator, ISingleObjectiveMoveEvaluator {
+    public const string MovePrefix = "Move";
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> MovePenaltyParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MovePenalty"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public VRPMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MovePenalty", "The penalty applied to the move."));
+    }
+
+    protected VRPMoveEvaluator(VRPMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    //helper method to evaluate an updated individual
+    protected void UpdateEvaluation(IVRPEncoding updatedTours) {
+      IVRPEvaluator evaluator = ProblemInstance.MoveEvaluator;
+
+      try {
+        this.ExecutionContext.Scope.Variables.Add(new Variable(evaluator.VRPToursParameter.ActualName,
+          updatedTours));
+
+        IAtomicOperation op = this.ExecutionContext.CreateChildOperation(evaluator);
+        op.Operator.Execute((IExecutionContext)op, CancellationToken);
+      }
+      finally {
+        this.ExecutionContext.Scope.Variables.Remove(evaluator.VRPToursParameter.ActualName);
+      }
+    }
+
+    protected abstract void EvaluateMove();
+
+    public override IOperation InstrumentedApply() {
+      EvaluateMove();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPMoveGenerator", "Generates moves for a VRP solution.")]
+  [StorableClass]
+  public abstract class
+    VRPMoveGenerator : VRPMoveOperator, IMoveGenerator {
+    [StorableConstructor]
+    protected VRPMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public VRPMoveGenerator()
+      : base() {
+    }
+
+    protected VRPMoveGenerator(VRPMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 15895)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPMoveMaker", "Performs a VRP move.")]
+  [StorableClass]
+  public abstract class VRPMoveMaker : VRPMoveOperator, IMoveMaker, ISingleObjectiveOperator {
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> MovePenaltyParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MovePenalty"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public VRPMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MovePenalty", "The penalty applied to the move."));
+    }
+
+    protected VRPMoveMaker(VRPMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void PerformMove();
+
+    private void UpdateMoveEvaluation() {
+      IVRPEvaluator evaluator = ProblemInstance.SolutionEvaluator;
+      ICollection<IParameter> addedParameters = new List<IParameter>();
+
+      try {
+        foreach (IParameter parameter in evaluator.Parameters) {
+          if (parameter is ILookupParameter
+            && parameter != evaluator.VRPToursParameter
+            && parameter != evaluator.ProblemInstanceParameter) {
+            ILookupParameter evaluatorParameter = parameter as ILookupParameter;
+
+            string resultName = evaluatorParameter.ActualName;
+            if (!this.Parameters.ContainsKey(resultName)) {
+              ILookupParameter resultParameter = new LookupParameter<IItem>(resultName);
+              resultParameter.ExecutionContext = ExecutionContext;
+              this.Parameters.Add(resultParameter);
+              addedParameters.Add(resultParameter);
+            }
+
+            string moveResultName = VRPMoveEvaluator.MovePrefix + resultName;
+            if (!this.Parameters.ContainsKey(moveResultName)) {
+              ILookupParameter moveResultParameter = new LookupParameter<IItem>(moveResultName);
+              moveResultParameter.ExecutionContext = ExecutionContext;
+              this.Parameters.Add(moveResultParameter);
+              addedParameters.Add(moveResultParameter);
+            }
+
+            ILookupParameter result = Parameters[resultName] as ILookupParameter;
+            ILookupParameter moveResult = Parameters[moveResultName] as ILookupParameter;
+            result.ActualValue = moveResult.ActualValue;
+          }
+        }
+      } finally {
+        foreach (IParameter parameter in addedParameters) {
+          this.Parameters.Remove(parameter);
+        }
+      }
+    }
+
+    public override IOperation InstrumentedApply() {
+      PerformMove();
+      UpdateMoveEvaluation();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveOperator.cs	(revision 15895)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("VRPMoveOperator", "A VRP move operator.")]
+  [StorableClass]
+  public abstract class VRPMoveOperator : VRPOperator, IVRPMoveOperator {
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public abstract ILookupParameter VRPMoveParameter { get; }
+
+    [StorableConstructor]
+    protected VRPMoveOperator(bool deserializing) : base(deserializing) { }
+
+    public VRPMoveOperator() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+    }
+
+    protected VRPMoveOperator(VRPMoveOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/PermutationEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/PermutationEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/PermutationEncoding.cs	(revision 15895)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("PermutationEncoding", "Represents a base class for permutation encodings of VRP solutions.")]
+  [StorableClass]
+  public abstract class PermutationEncoding : Permutation, IVRPEncoding {
+    #region IVRPEncoding Members
+    public abstract List<Tour> GetTours();
+
+    public virtual int GetTourIndex(Tour tour) {
+      int index = -1;
+
+      List<Tour> tours = GetTours();
+      for (int i = 0; i < tours.Count; i++) {
+        if (tours[i].IsEqual(tour)) {
+          index = i;
+          break;
+        }
+      }
+
+      return index;
+    }
+
+    public virtual int GetVehicleAssignment(int tour) {
+      return tour;
+    }
+    #endregion
+
+    [Storable]
+    protected IVRPProblemInstance ProblemInstance { get; set; }
+
+    protected PermutationEncoding(PermutationEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.readOnly = original.readOnly;
+
+      if (original.ProblemInstance != null && cloner.ClonedObjectRegistered(original.ProblemInstance))
+        this.ProblemInstance = (IVRPProblemInstance)cloner.Clone(original.ProblemInstance);
+      else
+        this.ProblemInstance = original.ProblemInstance;
+    }
+
+    public PermutationEncoding(Permutation permutation, IVRPProblemInstance problemInstance)
+      : base(PermutationTypes.RelativeUndirected) {
+      this.array = new int[permutation.Length];
+      for (int i = 0; i < array.Length; i++)
+        this.array[i] = permutation[i];
+
+      this.ProblemInstance = problemInstance;
+    }
+
+    [StorableConstructor]
+    protected PermutationEncoding(bool serializing)
+      : base() {
+    }
+
+    public int IndexOf(int city) {
+      return Array.IndexOf(this.array, city);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/ShakingOperators/VehicleRoutingShakingOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/ShakingOperators/VehicleRoutingShakingOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/ShakingOperators/VehicleRoutingShakingOperator.cs	(revision 15895)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.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.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("VRPShakingOperator", "A shaking operator for VNS that applies available mutation operators.")]
+  [StorableClass]
+  public class VehicleRoutingShakingOperator : ShakingOperator<IVRPManipulator>, IVRPMultiNeighborhoodShakingOperator, IGeneralVRPOperator, IStochasticOperator {
+    #region Parameters
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public IVRPProblemInstance ProblemInstance {
+      get { return ProblemInstanceParameter.ActualValue; }
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    protected VehicleRoutingShakingOperator(bool deserializing) : base(deserializing) { }
+    protected VehicleRoutingShakingOperator(VehicleRoutingShakingOperator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VehicleRoutingShakingOperator(this, cloner);
+    }
+    public VehicleRoutingShakingOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The vrp tour encoding to shake."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator that will be used for stochastic shaking operators."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+     
+      foreach (IVRPManipulator shaker in ApplicationManager.Manager.GetInstances<IVRPManipulator>().OrderBy(x => x.Name))
+        if (!(shaker is MultiVRPSolutionManipulator)) Operators.Add(shaker, !(shaker is IVRPLocalSearchManipulator));
+    }
+
+    #region Wiring of some parameters
+    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsAdded(sender, e);
+      ParameterizeOperators(e.Items);
+    }
+
+    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IVRPManipulator>> e) {
+      base.Operators_ItemsReplaced(sender, e);
+      ParameterizeOperators(e.Items);
+    }
+
+    private void ParameterizeOperators(IEnumerable<IndexedItem<IVRPManipulator>> items) {
+      if (items.Any()) {
+        foreach (IStochasticOperator op in items.Select(x => x.Value).OfType<IStochasticOperator>())
+          op.RandomParameter.ActualName = RandomParameter.Name;
+        foreach (IVRPManipulator op in items.Select(x => x.Value).OfType<IVRPManipulator>()) {
+          op.VRPToursParameter.ActualName = VRPToursParameter.Name;
+          if (op.ProblemInstanceParameter != null) op.ProblemInstanceParameter.ActualName = ProblemInstanceParameter.Name;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/TourEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/TourEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/TourEncoding.cs	(revision 15895)
@@ -0,0 +1,143 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
+  [Item("TourEncoding", "Represents a base class for tour encodings of VRP solutions.")]
+  [StorableClass]
+  public abstract class TourEncoding : Item, IVRPEncoding {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+    }
+
+    #region IVRPEncoding Members
+    public virtual void Repair() {
+      List<Tour> toBeRemoved = new List<Tour>();
+      foreach (Tour tour in Tours) {
+        if (tour.Stops.Count == 0)
+          toBeRemoved.Add(tour);
+      }
+
+      foreach (Tour tour in toBeRemoved)
+        Tours.Remove(tour);
+
+      while (Tours.Count > ProblemInstance.Vehicles.Value) {
+        Tour tour = Tours[Tours.Count - 1];
+        Tours[Tours.Count - 2].Stops.AddRange(tour.Stops);
+
+        Tours.Remove(tour);
+      }
+    }
+
+    public virtual List<Tour> GetTours() {
+      List<Tour> result = new List<Tour>();
+      foreach (Tour tour in Tours)
+        result.Add(tour.Clone() as Tour);
+
+      return result;
+    }
+
+    public int GetTourIndex(Tour tour) {
+      int index = -1;
+
+      for (int i = 0; i < Tours.Count; i++) {
+        if (Tours[i].IsEqual(tour)) {
+          index = i;
+          break;
+        }
+      }
+
+      return index;
+    }
+
+    public virtual int GetVehicleAssignment(int tour) {
+      return tour;
+    }
+
+    public int Cities {
+      get {
+        int cities = 0;
+
+        foreach (Tour tour in Tours) {
+          cities += tour.Stops.Count;
+        }
+
+        return cities;
+      }
+    }
+    #endregion
+
+    [Storable]
+    public ItemList<Tour> Tours { get; set; }
+
+    [Storable]
+    protected IVRPProblemInstance ProblemInstance { get; set; }
+
+    public TourEncoding(IVRPProblemInstance problemInstance) {
+      Tours = new ItemList<Tour>();
+
+      ProblemInstance = problemInstance;
+    }
+
+    [StorableConstructor]
+    protected TourEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    protected TourEncoding(TourEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tours = (ItemList<Tour>)cloner.Clone(original.Tours);
+      if (original.ProblemInstance != null && cloner.ClonedObjectRegistered(original.ProblemInstance))
+        this.ProblemInstance = (IVRPProblemInstance)cloner.Clone(original.ProblemInstance);
+      else
+        this.ProblemInstance = original.ProblemInstance;
+    }
+
+    public static void ConvertFrom(IVRPEncoding encoding, TourEncoding solution, IVRPProblemInstance problemInstance) {
+      solution.Tours = new ItemList<Tour>(encoding.GetTours());
+      solution.Repair();
+    }
+
+    public static void ConvertFrom(List<int> route, TourEncoding solution) {
+      solution.Tours = new ItemList<Tour>();
+
+      Tour tour = new Tour();
+      for (int i = 0; i < route.Count; i++) {
+        if (route[i] <= 0) {
+          if (tour.Stops.Count > 0) {
+            solution.Tours.Add(tour);
+            tour = new Tour();
+          }
+        } else {
+          tour.Stops.Add(route[i]);
+        }
+      }
+
+      solution.Repair();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 15895)
@@ -0,0 +1,148 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("IterativeInsertionCreator", "Creates a randomly initialized VRP solution.")]
+  [StorableClass]
+  public sealed class IterativeInsertionCreator : PotvinCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    public IValueParameter<BoolValue> AdhereTimeWindowsParameter {
+      get { return (IValueParameter<BoolValue>)Parameters["AdhereTimeWindows"]; }
+    }
+
+    [StorableConstructor]
+    private IterativeInsertionCreator(bool deserializing) : base(deserializing) { }
+
+    public IterativeInsertionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new ValueParameter<BoolValue>("AdhereTimeWindows", "Specifies if the time windows should be considered during construction.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IterativeInsertionCreator(this, cloner);
+    }
+
+    private IterativeInsertionCreator(IterativeInsertionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private static double CalculateAngleToDepot(IVRPProblemInstance instance, int city) {
+      double dx = instance.GetCoordinates(0)[0];
+      double dy = instance.GetCoordinates(0)[1];
+
+      double cx = instance.GetCoordinates(city)[0];
+      double cy = instance.GetCoordinates(city)[1];
+
+      double alpha = Math.Atan((cx - dx) / (dy - cy)) * (180.0 / Math.PI);
+      if (cx > dx && cy > dy)
+        alpha = (90.0 + alpha) + 90.0;
+      else if (cx < dx && cy > dy)
+        alpha = alpha + 180.0;
+      else if (cx < dx && cy < dy)
+        alpha = (90.0 + alpha) + 270.0;
+
+      return alpha;
+    }
+
+    public static PotvinEncoding CreateSolution(IVRPProblemInstance instance, IRandom random, bool adhereTimeWindows) {
+      PotvinEncoding result = new PotvinEncoding(instance);
+
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+
+      List<int> customers = new List<int>();
+      for (int i = 1; i <= instance.Cities.Value; i++)
+        if (pdp == null || pdp.GetDemand(i) >= 0)
+          customers.Add(i);
+
+      customers.Sort((city1, city2) => {
+        double angle1 = CalculateAngleToDepot(instance, city1);
+        double angle2 = CalculateAngleToDepot(instance, city2);
+
+        return angle1.CompareTo(angle2);
+      });
+
+      Tour currentTour = new Tour();
+      result.Tours.Add(currentTour);
+
+      int j = random.Next(customers.Count);
+      for (int i = 0; i < customers.Count; i++) {
+        int index = (i + j) % customers.Count;
+
+        int stopIdx = 0;
+        if (currentTour.Stops.Count > 0)
+          stopIdx = result.FindBestInsertionPlace(currentTour, customers[index]);
+        currentTour.Stops.Insert(stopIdx, customers[index]);
+
+        if (pdp != null) {
+          stopIdx = result.FindBestInsertionPlace(currentTour, pdp.GetPickupDeliveryLocation(customers[index]));
+          currentTour.Stops.Insert(stopIdx, pdp.GetPickupDeliveryLocation(customers[index]));
+        }
+
+        CVRPEvaluation evaluation = instance.EvaluateTour(currentTour, result) as CVRPEvaluation;
+        if (result.Tours.Count < instance.Vehicles.Value &&
+          ((adhereTimeWindows && !instance.Feasible(evaluation)) || ((!adhereTimeWindows) && evaluation.Overload > double.Epsilon))) {
+          currentTour.Stops.Remove(customers[index]);
+          if (pdp != null)
+            currentTour.Stops.Remove(pdp.GetPickupDeliveryLocation(customers[index]));
+
+          if (currentTour.Stops.Count == 0)
+            result.Tours.Remove(currentTour);
+          currentTour = new Tour();
+          result.Tours.Add(currentTour);
+
+          currentTour.Stops.Add(customers[index]);
+          if (pdp != null) {
+            currentTour.Stops.Add(pdp.GetPickupDeliveryLocation(customers[index]));
+          }
+        }
+      }
+
+      if (currentTour.Stops.Count == 0)
+        result.Tours.Remove(currentTour);
+
+      return result;
+    }
+
+    public override IOperation InstrumentedApply() {
+      VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue, AdhereTimeWindowsParameter.Value.Value);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PotvinCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PotvinCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PotvinCreator.cs	(revision 15895)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCreator", "A VRP creator.")]
+  [StorableClass]
+  public abstract class PotvinCreator : VRPCreator, IPotvinOperator, IVRPCreator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCreator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCreator()
+      : base() {
+    }
+
+    protected PotvinCreator(PotvinCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 15895)
@@ -0,0 +1,380 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PushForwardInsertionCreator", "The push forward insertion heuristic. It is implemented as described in Sam, and Thangiah, R. (1999). A Hybrid Genetic Algorithms, Simulated Annealing and Tabu Search Heuristic for Vehicle Routing Problems with Time Windows. Practical Handbook of Genetic Algorithms, Volume III, pp 347–381.")]
+  [StorableClass]
+  public sealed class PushForwardInsertionCreator : PotvinCreator, IStochasticOperator {
+    #region IStochasticOperator Members
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    #endregion
+
+    public IValueParameter<DoubleValue> Alpha {
+      get { return (IValueParameter<DoubleValue>)Parameters["Alpha"]; }
+    }
+    public IValueParameter<DoubleValue> AlphaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["AlphaVariance"]; }
+    }
+    public IValueParameter<DoubleValue> Beta {
+      get { return (IValueParameter<DoubleValue>)Parameters["Beta"]; }
+    }
+    public IValueParameter<DoubleValue> BetaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["BetaVariance"]; }
+    }
+    public IValueParameter<DoubleValue> Gamma {
+      get { return (IValueParameter<DoubleValue>)Parameters["Gamma"]; }
+    }
+    public IValueParameter<DoubleValue> GammaVariance {
+      get { return (IValueParameter<DoubleValue>)Parameters["GammaVariance"]; }
+    }
+
+    [StorableConstructor]
+    private PushForwardInsertionCreator(bool deserializing) : base(deserializing) { }
+
+    public PushForwardInsertionCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
+      Parameters.Add(new ValueParameter<DoubleValue>("Alpha", "The alpha value.", new DoubleValue(0.7)));
+      Parameters.Add(new ValueParameter<DoubleValue>("AlphaVariance", "The alpha variance.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Beta", "The beta value.", new DoubleValue(0.1)));
+      Parameters.Add(new ValueParameter<DoubleValue>("BetaVariance", "The beta variance.", new DoubleValue(0.07)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Gamma", "The gamma value.", new DoubleValue(0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("GammaVariance", "The gamma variance.", new DoubleValue(0.14)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushForwardInsertionCreator(this, cloner);
+    }
+
+    private PushForwardInsertionCreator(PushForwardInsertionCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    // use the Box-Mueller transform in the polar form to generate a N(0,1) random variable out of two uniformly distributed random variables
+    private static double Gauss(IRandom random) {
+      double u = 0.0, v = 0.0, s = 0.0;
+      do {
+        u = (random.NextDouble() * 2) - 1;
+        v = (random.NextDouble() * 2) - 1;
+        s = Math.Sqrt(u * u + v * v);
+      } while (s < Double.Epsilon || s > 1);
+      return u * Math.Sqrt((-2.0 * Math.Log(s)) / s);
+    }
+
+    private static double N(double mu, double sigma, IRandom random) {
+      return mu + (sigma * Gauss(random)); // transform the random variable sampled from N(0,1) to N(mu,sigma)
+    }
+
+    private static double GetDistance(int start, int end, IVRPProblemInstance problemInstance) {
+      double distance = 0.0;
+
+      double startX = problemInstance.Coordinates[start, 0];
+      double startY = problemInstance.Coordinates[start, 1];
+
+      double endX = problemInstance.Coordinates[end, 0];
+      double endY = problemInstance.Coordinates[end, 1];
+
+      distance =
+          Math.Sqrt(
+            Math.Pow(startX - endX, 2) +
+            Math.Pow(startY - endY, 2));
+
+      return distance;
+    }
+
+    private static int GetNearestDepot(IVRPProblemInstance problemInstance, List<int> depots, int customer,
+      double alpha, double beta, double gamma, out double minCost) {
+      int nearest = -1;
+      minCost = double.MaxValue;
+
+      int depotCount = 1;
+      IMultiDepotProblemInstance mdp = problemInstance as IMultiDepotProblemInstance;
+      if (mdp != null) {
+        depotCount = mdp.Depots.Value;
+      }
+
+      foreach (int depot in depots) {
+        double x0 = problemInstance.Coordinates[depot, 0];
+        double y0 = problemInstance.Coordinates[depot, 1];
+
+        double distance = GetDistance(customer + depotCount - 1, depot, problemInstance);
+
+        double dueTime = 0;
+        if (problemInstance is ITimeWindowedProblemInstance)
+          dueTime = (problemInstance as ITimeWindowedProblemInstance).DueTime[customer + depotCount - 1];
+        if (dueTime == double.MaxValue)
+          dueTime = 0;
+
+        double x = problemInstance.Coordinates[customer + depotCount - 1, 0];
+        double y = problemInstance.Coordinates[customer + depotCount - 1, 1];
+
+        double cost = alpha * distance + // distance 0 <-> City[i]
+                      -beta * dueTime + // latest arrival time
+                      -gamma * ((Math.Atan2(y - y0, x - x0) + Math.PI) / (2.0 * Math.PI) * distance); // polar angle
+
+        if (cost < minCost) {
+          minCost = cost;
+          nearest = depot;
+        }
+      }
+
+      return nearest;
+    }
+
+    private static List<int> SortCustomers(IVRPProblemInstance problemInstance, List<int> customers, List<int> depots,
+      Dictionary<int, int> depotAssignment,
+      double alpha, double beta, double gamma) {
+      List<int> sortedCustomers = new List<int>();
+      depotAssignment.Clear();
+
+      List<double> costList = new List<double>();
+
+      for (int i = 0; i < customers.Count; i++) {
+        double cost;
+        int depot = GetNearestDepot(problemInstance, depots, customers[i],
+          alpha, beta, gamma,
+          out cost);
+        depotAssignment[customers[i]] = depot;
+
+        int index = 0;
+        while (index < costList.Count && costList[index] < cost) index++;
+        costList.Insert(index, cost);
+        sortedCustomers.Insert(index, customers[i]);
+      }
+
+      return sortedCustomers;
+    }
+
+    private static bool RemoveUnusedDepots(List<int> depots, Dictionary<int, List<int>> vehicles) {
+      List<int> toBeRemoved = new List<int>();
+
+      foreach (int depot in depots) {
+        if (vehicles[depot].Count == 0)
+          toBeRemoved.Add(depot);
+      }
+
+      foreach (int depot in toBeRemoved) {
+        depots.Remove(depot);
+        vehicles.Remove(depot);
+      }
+
+      return toBeRemoved.Count > 0;
+    }
+
+    public static PotvinEncoding CreateSolution(IVRPProblemInstance problemInstance, IRandom random,
+      double alphaValue = 0.7, double betaValue = 0.1, double gammaValue = 0.2,
+      double alphaVariance = 0.5, double betaVariance = 0.07, double gammaVariance = 0.14) {
+      PotvinEncoding result = new PotvinEncoding(problemInstance);
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      IMultiDepotProblemInstance mdp = problemInstance as IMultiDepotProblemInstance;
+
+      double alpha, beta, gamma;
+      alpha = N(alphaValue, Math.Sqrt(alphaVariance), random);
+      beta = N(betaValue, Math.Sqrt(betaVariance), random);
+      gamma = N(gammaValue, Math.Sqrt(gammaVariance), random);
+
+      List<int> unroutedCustomers = new List<int>();
+      for (int i = 1; i <= problemInstance.Cities.Value; i++) {
+        if (pdp == null || (problemInstance.GetDemand(i) >= 0))
+          unroutedCustomers.Add(i);
+      }
+
+      List<int> depots = new List<int>();
+      if (mdp != null) {
+        for (int i = 0; i < mdp.Depots.Value; i++) {
+          depots.Add(i);
+        }
+      } else {
+        depots.Add(0);
+      }
+
+      Dictionary<int, List<int>> vehicles = new Dictionary<int, List<int>>();
+      foreach (int depot in depots) {
+        vehicles[depot] = new List<int>();
+
+        int vehicleCount = problemInstance.Vehicles.Value;
+        if (mdp != null) {
+          for (int vehicle = 0; vehicle < mdp.VehicleDepotAssignment.Length; vehicle++) {
+            if (mdp.VehicleDepotAssignment[vehicle] == depot) {
+              vehicles[depot].Add(vehicle);
+            }
+          }
+        } else {
+          for (int vehicle = 0; vehicle < vehicleCount; vehicle++) {
+            vehicles[depot].Add(vehicle);
+          }
+        }
+      }
+
+      RemoveUnusedDepots(depots, vehicles);
+      Dictionary<int, int> depotAssignment = new Dictionary<int, int>();
+
+      unroutedCustomers = SortCustomers(
+        problemInstance, unroutedCustomers, depots, depotAssignment,
+        alpha, beta, gamma);
+
+      /////////
+      Tour tour = new Tour();
+      result.Tours.Add(tour);
+      int currentCustomer = unroutedCustomers[0];
+      unroutedCustomers.RemoveAt(0);
+
+      int currentDepot = depotAssignment[currentCustomer];
+      int currentVehicle = vehicles[currentDepot][0];
+      vehicles[currentDepot].RemoveAt(0);
+      if (RemoveUnusedDepots(depots, vehicles)) {
+        unroutedCustomers = SortCustomers(
+        problemInstance, unroutedCustomers, depots, depotAssignment,
+        alpha, beta, gamma);
+      }
+
+      result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle;
+
+      tour.Stops.Add(currentCustomer);
+      if (pdp != null) {
+        tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer));
+      }
+      ////////
+
+      while (unroutedCustomers.Count > 0) {
+        double minimumCost = double.MaxValue;
+        int customer = -1;
+        int indexOfMinimumCost = -1;
+        int indexOfMinimumCost2 = -1;
+
+        foreach (int unrouted in unroutedCustomers) {
+          VRPEvaluation eval = problemInstance.EvaluateTour(tour, result);
+          double originalCosts = eval.Quality;
+
+          for (int i = 0; i <= tour.Stops.Count; i++) {
+            tour.Stops.Insert(i, unrouted);
+            eval = problemInstance.EvaluateTour(tour, result);
+            double tourCost = eval.Quality - originalCosts;
+
+            if (pdp != null) {
+              for (int j = i + 1; j <= tour.Stops.Count; j++) {
+                bool feasible;
+                double cost = tourCost +
+                  problemInstance.GetInsertionCosts(eval, result, pdp.GetPickupDeliveryLocation(unrouted), 0, j, out feasible);
+                if (cost < minimumCost && feasible) {
+                  customer = unrouted;
+                  minimumCost = cost;
+                  indexOfMinimumCost = i;
+                  indexOfMinimumCost2 = j;
+                }
+              }
+            } else {
+              double cost = tourCost;
+              bool feasible = problemInstance.Feasible(eval);
+              if (cost < minimumCost && feasible) {
+                customer = unrouted;
+                minimumCost = cost;
+                indexOfMinimumCost = i;
+              }
+            }
+
+            tour.Stops.RemoveAt(i);
+          }
+        }
+
+        if (indexOfMinimumCost == -1 && vehicles.Count == 0) {
+          indexOfMinimumCost = tour.Stops.Count;
+          indexOfMinimumCost2 = tour.Stops.Count + 1;
+          customer = unroutedCustomers[0];
+        }
+
+        // insert customer if found
+        if (indexOfMinimumCost != -1) {
+          tour.Stops.Insert(indexOfMinimumCost, customer);
+          if (pdp != null) {
+            tour.Stops.Insert(indexOfMinimumCost2, pdp.GetPickupDeliveryLocation(customer));
+          }
+
+          unroutedCustomers.Remove(customer);
+        } else { // no feasible customer found
+          tour = new Tour();
+          result.Tours.Add(tour);
+          currentCustomer = unroutedCustomers[0];
+          unroutedCustomers.RemoveAt(0);
+
+          currentDepot = depotAssignment[currentCustomer];
+          currentVehicle = vehicles[currentDepot][0];
+          vehicles[currentDepot].RemoveAt(0);
+          if (RemoveUnusedDepots(depots, vehicles)) {
+            unroutedCustomers = SortCustomers(
+            problemInstance, unroutedCustomers, depots, depotAssignment,
+            alpha, beta, gamma);
+          }
+
+          result.VehicleAssignment[result.Tours.Count - 1] = currentVehicle;
+
+          tour.Stops.Add(currentCustomer);
+          if (pdp != null) {
+            tour.Stops.Add(pdp.GetPickupDeliveryLocation(currentCustomer));
+          }
+        }
+      }
+
+      if (mdp != null) {
+        List<int> availableVehicles = new List<int>();
+        for (int i = 0; i < mdp.Vehicles.Value; i++)
+          availableVehicles.Add(i);
+
+        for (int i = 0; i < result.VehicleAssignment.Length; i++) {
+          if (result.VehicleAssignment[i] != -1)
+            availableVehicles.Remove(result.VehicleAssignment[i]);
+        }
+
+        for (int i = 0; i < result.VehicleAssignment.Length; i++) {
+          if (result.VehicleAssignment[i] == -1) {
+            result.VehicleAssignment[i] = availableVehicles[0];
+            availableVehicles.RemoveAt(0);
+          }
+        }
+      }
+
+      return result;
+    }
+
+    public override IOperation InstrumentedApply() {
+      VRPToursParameter.ActualValue = CreateSolution(ProblemInstance, RandomParameter.ActualValue,
+        Alpha.Value.Value, Beta.Value.Value, Gamma.Value.Value,
+        AlphaVariance.Value.Value, BetaVariance.Value.Value, GammaVariance.Value.Value);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinCrossover.cs	(revision 15895)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCrossover", "A VRP crossover operation.")]
+  [StorableClass]
+  public abstract class PotvinCrossover : VRPCrossover, IStochasticOperator, IPotvinOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueParameter<BoolValue> AllowInfeasibleSolutions {
+      get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCrossover(bool deserializing) : base(deserializing) { }
+
+    public PotvinCrossover() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false)));
+    }
+
+    protected PotvinCrossover(PotvinCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2);
+
+    protected static bool FindInsertionPlace(PotvinEncoding individual, int city, bool allowInfeasible,
+        out int route, out int place) {
+      return individual.FindInsertionPlace(
+        city, -1, allowInfeasible,
+        out route, out place);
+    }
+
+    protected static Tour FindRoute(PotvinEncoding solution, int city) {
+      Tour found = null;
+
+      foreach (Tour tour in solution.Tours) {
+        if (tour.Stops.Contains(city)) {
+          found = tour;
+          break;
+        }
+      }
+
+      return found;
+    }
+
+    protected static bool RouteUnrouted(PotvinEncoding solution, bool allowInfeasible) {
+      bool success = true;
+      int index = 0;
+      while (index < solution.Unrouted.Count && success) {
+        int unrouted = solution.Unrouted[index];
+
+        int route, place;
+        if (FindInsertionPlace(solution, unrouted, allowInfeasible,
+          out route, out place)) {
+          solution.Tours[route].Stops.Insert(place, unrouted);
+        } else {
+          success = false;
+        }
+
+        index++;
+      }
+
+      for (int i = 0; i < index; i++)
+        solution.Unrouted.RemoveAt(0);
+
+      return success;
+    }
+
+    protected static bool Repair(IRandom random, PotvinEncoding solution, Tour newTour, IVRPProblemInstance instance, bool allowInfeasible) {
+      bool success = true;
+
+      //remove duplicates from new tour      
+      for (int i = 0; i < newTour.Stops.Count; i++) {
+        for (int j = 0; j < newTour.Stops.Count; j++) {
+          if (newTour.Stops[i] == newTour.Stops[j] && i != j) {
+            if (random.NextDouble() < 0.5)
+              newTour.Stops[i] = 0;
+            else
+              newTour.Stops[j] = 0;
+          }
+        }
+      }
+      while (newTour.Stops.Contains(0))
+        newTour.Stops.Remove(0);
+
+      //remove duplicates from old tours
+      for (int i = 0; i < newTour.Stops.Count; i++) {
+        foreach (Tour tour in solution.Tours) {
+          if (tour != newTour && tour.Stops.Contains(newTour.Stops[i])) {
+            tour.Stops.Remove(newTour.Stops[i]);
+          }
+        }
+      }
+
+      //remove empty tours
+      List<Tour> toBeDeleted = new List<Tour>();
+      foreach (Tour tour in solution.Tours) {
+        if (tour.Stops.Count == 0)
+          toBeDeleted.Add(tour);
+      }
+      foreach (Tour tour in toBeDeleted) {
+        solution.Tours.Remove(tour);
+      }
+
+      if (newTour.Stops.Count > 0 && !allowInfeasible && !instance.TourFeasible(newTour, solution))
+        return false;
+
+      //route unrouted vehicles
+      success = RouteUnrouted(solution, allowInfeasible);
+
+      return success;
+    }
+
+    public override IOperation InstrumentedApply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is PotvinEncoding)) {
+          parents[i] = PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue = Crossover(RandomParameter.ActualValue, parents[0] as PotvinEncoding, parents[1] as PotvinEncoding);
+      (ChildParameter.ActualValue as PotvinEncoding).Repair();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinInsertionBasedCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinInsertionBasedCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinInsertionBasedCrossover.cs	(revision 15895)
@@ -0,0 +1,285 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using HeuristicLab.Data;
+using System;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinInsertionBasedCrossover", "The IBX crossover for VRP representations. It is implemented as described in Berger, J and Solois, M and Begin, R (1998). A hybrid genetic algorithm for the vehicle routing problem with time windows. LNCS 1418. Springer, London 114-127.")]
+  [StorableClass]
+  public sealed class PotvinInsertionBasedCrossover : PotvinCrossover {
+    public IValueParameter<IntValue> Length {
+      get { return (IValueParameter<IntValue>)Parameters["Length"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinInsertionBasedCrossover(bool deserializing) : base(deserializing) { }
+    private PotvinInsertionBasedCrossover(PotvinInsertionBasedCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinInsertionBasedCrossover(this, cloner);
+    }
+    public PotvinInsertionBasedCrossover()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Length", "The maximum length of the replaced route.", new IntValue(1)));
+    }
+
+    private static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual) {
+      int tourIndex = -1;
+
+      double sum = 0.0;
+      double[] probabilities = new double[individual.Tours.Count];
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        probabilities[i] = 1.0 / ((double)individual.Tours[i].Stops.Count / (double)individual.Cities);
+        sum += probabilities[i];
+      }
+
+      double rand = random.NextDouble() * sum;
+      double cumulatedProbabilities = 0.0;
+      int index = 0;
+      while (tourIndex == -1 && index < probabilities.Length) {
+        if (cumulatedProbabilities <= rand && rand <= cumulatedProbabilities + probabilities[index])
+          tourIndex = index;
+
+        cumulatedProbabilities += probabilities[index];
+        index++;
+      }
+
+      return tourIndex;
+    }
+
+    private double CalculateCentroidDistance(Tour t1, Tour t2, IVRPProblemInstance instance) {
+      double xSum = 0;
+      double ySum = 0;
+      double c1X, c1Y, c2X, c2Y;
+
+      for (int i = 0; i < t1.Stops.Count; i++) {
+        xSum += instance.GetCoordinates(t1.Stops[i])[0];
+        ySum += instance.GetCoordinates(t1.Stops[i])[1];
+      }
+      c1X = xSum / t1.Stops.Count;
+      c1Y = ySum / t1.Stops.Count;
+
+      for (int i = 0; i < t2.Stops.Count; i++) {
+        xSum += instance.GetCoordinates(t2.Stops[i])[0];
+        ySum += instance.GetCoordinates(t2.Stops[i])[1];
+      }
+      c2X = xSum / t1.Stops.Count;
+      c2Y = ySum / t1.Stops.Count;
+
+      return Math.Sqrt(
+           (c1X - c2X) * (c1X - c2X) +
+           (c1Y - c2Y) * (c1Y - c2Y));
+    }
+
+    private double CalculateMeanCentroidDistance(Tour t1, IList<Tour> tours, IVRPProblemInstance instance) {
+      double sum = 0;
+
+      for (int i = 0; i < tours.Count; i++) {
+        sum += CalculateCentroidDistance(t1, tours[i], instance);
+      }
+
+      return sum / tours.Count;
+    }
+
+    private int SelectCityBiasedByNeighborDistance(IRandom random, Tour tour, IVRPEncoding solution) {
+      int cityIndex = -1;
+
+      double sum = 0.0;
+      double[] probabilities = new double[tour.Stops.Count];
+      for (int i = 0; i < tour.Stops.Count; i++) {
+        int next;
+        if (i + 1 >= tour.Stops.Count)
+          next = 0;
+        else
+          next = tour.Stops[i + 1];
+        double distance = ProblemInstance.GetDistance(
+          tour.Stops[i], next, solution);
+
+        int prev;
+        if (i - 1 < 0)
+          prev = 0;
+        else
+          prev = tour.Stops[i - 1];
+        distance += ProblemInstance.GetDistance(
+          tour.Stops[i], prev, solution);
+
+        probabilities[i] = distance;
+        sum += probabilities[i];
+      }
+
+      double rand = random.NextDouble() * sum;
+      double cumulatedProbabilities = 0.0;
+      int index = 0;
+      while (cityIndex == -1 && index < probabilities.Length) {
+        if (cumulatedProbabilities <= rand && rand <= cumulatedProbabilities + probabilities[index])
+          cityIndex = index;
+
+        cumulatedProbabilities += probabilities[index];
+        index++;
+      }
+
+      return cityIndex;
+    }
+
+    private bool FindRouteInsertionPlace(
+      PotvinEncoding individual,
+      Tour tour,
+      int city, bool allowInfeasible, out int place) {
+      place = -1;
+
+      if (tour.Stops.Contains(city))
+        return false;
+
+      if (tour.Stops.Count == 0) {
+        place = 0;
+        return true;
+      }
+
+      double minDetour = 0;
+      VRPEvaluation eval = ProblemInstance.EvaluateTour(tour, individual);
+      bool originalFeasible = ProblemInstance.Feasible(eval);
+
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        bool feasible;
+        double detour = ProblemInstance.GetInsertionCosts(eval, individual, city, 0, i, out feasible);
+        if (feasible || allowInfeasible) {
+          if (place < 0 || detour < minDetour) {
+            place = i;
+            minDetour = detour;
+          }
+        }
+      }
+
+      return place >= 0;
+    }
+
+    private ICollection<int> GetUnrouted(PotvinEncoding solution, int cities) {
+      HashSet<int> undiscovered = new HashSet<int>();
+      for (int i = 1; i <= cities; i++) {
+        undiscovered.Add(i);
+      }
+
+      foreach (Tour tour in solution.Tours) {
+        foreach (int city in tour.Stops)
+          undiscovered.Remove(city);
+      }
+
+      return undiscovered;
+    }
+
+    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
+      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
+      child.Tours.Clear();
+
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+
+      List<Tour> R1 = new List<Tour>();
+      PotvinEncoding p1Clone = parent1.Clone() as PotvinEncoding;
+
+      int length = Math.Min(Length.Value.Value, parent1.Tours.Count) + 1;
+      int k = 1;
+      if(length > 1)
+        k = random.Next(1, length);
+      for (int i = 0; i < k; i++) {
+        int index = SelectRandomTourBiasedByLength(random, p1Clone);
+        R1.Add(p1Clone.Tours[index]);
+        p1Clone.Tours.RemoveAt(index);
+      }
+
+      foreach (Tour r1 in R1) {
+        List<int> R2 = new List<int>();
+
+        double r = CalculateMeanCentroidDistance(r1, parent2.Tours, ProblemInstance);
+        foreach (Tour tour in parent2.Tours) {
+          if (CalculateCentroidDistance(r1, tour, ProblemInstance) <= r) {
+            R2.AddRange(tour.Stops);
+          }
+        }
+
+        Tour childTour = new Tour();
+        child.Tours.Add(childTour);
+        childTour.Stops.AddRange(r1.Stops);
+
+        //DESTROY - remove cities from r1
+        int removed = 1;
+        if(r1.Stops.Count > 1)
+          removed = random.Next(1, r1.Stops.Count + 1);
+        for (int i = 0; i < removed; i++) {
+          childTour.Stops.RemoveAt(SelectCityBiasedByNeighborDistance(random, childTour, child));
+        }
+
+        //REPAIR - add cities from R2
+        int maxCount = 1;
+        if(R2.Count > 1)
+          maxCount = random.Next(1, Math.Min(5, R2.Count));
+        int count = 0;
+
+        while (count < maxCount && R2.Count != 0) {
+          int index = random.Next(R2.Count);
+          int city = R2[index];
+          R2.RemoveAt(index);
+
+          int place = -1;
+          bool found = FindRouteInsertionPlace(child, childTour, city, allowInfeasible, out place); 
+          if (found) {
+            childTour.Stops.Insert(place, city);
+
+            if (!Repair(random, child, childTour, ProblemInstance, allowInfeasible)) {
+              childTour.Stops.RemoveAt(place);
+            } else {
+              count++;
+            }
+          }
+        }
+
+        Repair(random, child, childTour, ProblemInstance, allowInfeasible);
+      }
+
+      for (int i = 0; i < p1Clone.Tours.Count; i++) {
+        Tour childTour = p1Clone.Tours[i].Clone() as Tour;
+        child.Tours.Add(childTour);
+        Repair(random, child, childTour, ProblemInstance, allowInfeasible);
+      }
+
+      //route unrouted customers
+      child.Unrouted.AddRange(GetUnrouted(child, ProblemInstance.Cities.Value));
+      bool success = RouteUnrouted(child, allowInfeasible);
+
+      if (success || allowInfeasible)
+        return child;
+      else {
+        if (random.NextDouble() < 0.5)
+          return parent1.Clone() as PotvinEncoding;
+        else
+          return parent2.Clone() as PotvinEncoding;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs	(revision 15895)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinRouteBasedCrossover", "The RBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinRouteBasedCrossover : PotvinCrossover {
+    [StorableConstructor]
+    private PotvinRouteBasedCrossover(bool deserializing) : base(deserializing) { }
+
+    public PotvinRouteBasedCrossover()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinRouteBasedCrossover(this, cloner);
+    }
+
+    private PotvinRouteBasedCrossover(PotvinRouteBasedCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible) {
+      PotvinEncoding child = parent2.Clone() as PotvinEncoding;
+
+      if (parent1.Tours.Count > 0 && child.Tours.Count > 0) {
+        int tourParent1 = random.Next(parent1.Tours.Count);
+        Tour replacing = parent1.Tours[tourParent1].Clone() as Tour;
+
+        int tourParent2 = random.Next(child.Tours.Count);
+        Tour replaced = child.Tours[tourParent2];
+
+        child.Tours.Remove(replaced);
+        child.Tours.Insert(tourParent2, replacing);
+
+        Permutation vehicleAssignment = child.VehicleAssignment;
+
+        int vehicle = vehicleAssignment[tourParent2];
+        int vehicle2 = parent1.VehicleAssignment[tourParent1];
+        vehicleAssignment[tourParent2] = vehicle2;
+
+        for (int i = 0; i < vehicleAssignment.Length; i++) {
+          if (vehicleAssignment[i] == vehicle2 && i != tourParent2) {
+            vehicleAssignment[i] = vehicle;
+            break;
+          }
+        }
+
+        foreach (int city in replaced.Stops)
+          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+            child.Unrouted.Add(city);
+
+        if (Repair(random, child, replacing, problemInstance, allowInfeasible) || allowInfeasible)
+          return child;
+        else {
+          if (random.NextDouble() < 0.5)
+            return parent1.Clone() as PotvinEncoding;
+          else
+            return parent2.Clone() as PotvinEncoding;
+        }
+      } else {
+        return child;
+      }
+    }
+
+    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
+      return Apply(random, parent1, parent2, ProblemInstance, AllowInfeasibleSolutions.Value.Value);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinSequenceBasedCrossover.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinSequenceBasedCrossover", "The SBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinSequenceBasedCrossover : PotvinCrossover {
+    [StorableConstructor]
+    private PotvinSequenceBasedCrossover(bool deserializing) : base(deserializing) { }
+
+    public PotvinSequenceBasedCrossover()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinSequenceBasedCrossover(this, cloner);
+    }
+
+    private PotvinSequenceBasedCrossover(PotvinSequenceBasedCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinEncoding Apply(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2, IVRPProblemInstance problemInstance, bool allowInfeasible) {
+      PotvinEncoding child = parent1.Clone() as PotvinEncoding;
+      Tour newTour = new Tour();
+
+      int cities = problemInstance.Cities.Value;
+
+      if (cities > 0) {
+        int breakPoint1 = random.Next(1, cities + 1);
+        Tour tour1 = FindRoute(child, breakPoint1);
+        breakPoint1 = tour1.Stops.IndexOf(breakPoint1);
+
+        for (int i = 0; i < breakPoint1; i++)
+          newTour.Stops.Add(tour1.Stops[i]);
+
+        int breakPoint2 = random.Next(1, cities + 1);
+        Tour tour2 = FindRoute(parent2, breakPoint2);
+        breakPoint2 = tour2.Stops.IndexOf(breakPoint2);
+
+        for (int i = breakPoint2; i < tour2.Stops.Count; i++)
+          newTour.Stops.Add(tour2.Stops[i]);
+
+        int tour1Index = child.Tours.IndexOf(tour1);
+        child.Tours.Remove(tour1);
+        child.Tours.Insert(tour1Index, newTour);
+
+        foreach (int city in tour1.Stops)
+          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+            child.Unrouted.Add(city);
+
+        foreach (int city in tour2.Stops)
+          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
+            child.Unrouted.Add(city);
+
+        if (Repair(random, child, newTour, problemInstance, allowInfeasible) || allowInfeasible) {
+          return child;
+        } else {
+          if (random.NextDouble() < 0.5)
+            return parent1.Clone() as PotvinEncoding;
+          else
+            return parent2.Clone() as PotvinEncoding;
+        }
+      } else {
+        return child;
+      }
+    }
+
+    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
+      return Apply(random, parent1, parent2, ProblemInstance, AllowInfeasibleSolutions.Value.Value);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/IPotvinOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinOperator :
+    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator,
+    IMultiDepotOperator, IHeterogenousCapacitatedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinLocalSearchManipulator.cs	(revision 15895)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinLocalSearchManipulator", "The LSM operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinLocalSearchManipulator : PotvinManipulator, IVRPLocalSearchManipulator {
+    public IValueParameter<IntValue> Iterations {
+      get { return (IValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinLocalSearchManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinLocalSearchManipulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Iterations", "The number of max iterations.", new IntValue(100)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinLocalSearchManipulator(this, cloner);
+    }
+
+    private PotvinLocalSearchManipulator(PotvinLocalSearchManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private static bool FindBetterInsertionPlace(
+      PotvinEncoding individual, IVRPProblemInstance instance, int tour, int city, int length,
+      out int insertionTour, out int insertionPlace) {
+      bool insertionFound = false;
+      insertionTour = -1;
+      insertionPlace = 1;
+
+      List<int> toBeDeleted = individual.Tours[tour].Stops.GetRange(city, length);
+      double distance = individual.GetTourLength(individual.Tours[tour]);
+      individual.Tours[tour].Stops.RemoveRange(city, length);
+      double removalBenefit = distance - individual.GetTourLength(individual.Tours[tour]);
+
+      int currentTour = 0;
+      while (currentTour < individual.Tours.Count && !insertionFound) {
+        int currentCity = 0;
+        while (currentCity <= individual.Tours[currentTour].Stops.Count && !insertionFound) {
+          distance = individual.GetTourLength(individual.Tours[currentTour]);
+          individual.Tours[currentTour].Stops.InsertRange(currentCity, toBeDeleted);
+          if (instance.TourFeasible(individual.Tours[currentTour], individual)) {
+            double lengthIncrease =
+              individual.GetTourLength(individual.Tours[currentTour]) - distance;
+            if (removalBenefit > lengthIncrease) {
+              insertionTour = currentTour;
+              insertionPlace = currentCity;
+
+              insertionFound = true;
+            }
+          }
+          individual.Tours[currentTour].Stops.RemoveRange(currentCity, length);
+
+          currentCity++;
+        }
+        currentTour++;
+      }
+
+      individual.Tours[tour].Stops.InsertRange(city, toBeDeleted);
+
+      return insertionFound;
+    }
+
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, int maxIterations) {
+      //only apply to feasible individuals
+      if (instance.Feasible(individual)) {
+        bool insertionFound;
+        int iterations = 0;
+
+        do {
+          insertionFound = false;
+          int length = 3;
+          while (length > 0 && !insertionFound) {
+            int tour = 0;
+            while (tour < individual.Tours.Count && !insertionFound) {
+              int city = 0;
+              while (city <= individual.Tours[tour].Stops.Count - length && !insertionFound) {
+                int insertionTour, insertionPlace;
+                if (FindBetterInsertionPlace(individual, instance, tour, city, length,
+                 out insertionTour, out insertionPlace)) {
+                  insertionFound = true;
+
+                  List<int> toBeInserted = individual.Tours[tour].Stops.GetRange(city, length);
+
+                  individual.Tours[tour].Stops.RemoveRange(city, length);
+                  individual.Tours[insertionTour].Stops.InsertRange(
+                    insertionPlace,
+                    toBeInserted);
+                }
+                city++;
+              }
+              tour++;
+            }
+            length--;
+          }
+          iterations++;
+        } while (insertionFound &&
+          iterations < maxIterations);
+
+        IList<Tour> toBeRemoved = new List<Tour>();
+        foreach (Tour tour in individual.Tours) {
+          if (tour.Stops.Count == 0)
+            toBeRemoved.Add(tour);
+        }
+
+        foreach (Tour tour in toBeRemoved) {
+          individual.Tours.Remove(tour);
+        }
+      }
+    }
+ 
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      ApplyManipulation(random, individual, ProblemInstance, Iterations.Value.Value);     
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinManipulator.cs	(revision 15895)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinManipulator", "A VRP manipulation operation.")]
+  [StorableClass]
+  public abstract class PotvinManipulator : VRPManipulator, IStochasticOperator, IPotvinOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueParameter<BoolValue> AllowInfeasibleSolutions {
+      get { return (IValueParameter<BoolValue>)Parameters["AllowInfeasibleSolutions"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinManipulator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new ValueParameter<BoolValue>("AllowInfeasibleSolutions", "Indicates if infeasible solutions should be allowed.", new BoolValue(false)));
+    }
+
+    protected PotvinManipulator(PotvinManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void Manipulate(IRandom random, PotvinEncoding individual);
+
+    protected static int SelectRandomTourBiasedByLength(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance) {
+      int tourIndex = -1;
+
+      double sum = 0.0;
+      double[] probabilities = new double[individual.Tours.Count];
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        probabilities[i] = 1.0 / ((double)individual.Tours[i].Stops.Count / (double)instance.Cities.Value);
+        sum += probabilities[i];
+      }
+
+      for (int i = 0; i < probabilities.Length; i++)
+        probabilities[i] = probabilities[i] / sum;
+
+      double rand = random.NextDouble();
+      double cumulatedProbabilities = 0.0;
+      int index = 0;
+      while (tourIndex == -1 && index < probabilities.Length) {
+        if (cumulatedProbabilities <= rand && rand <= cumulatedProbabilities + probabilities[index])
+          tourIndex = index;
+
+        cumulatedProbabilities += probabilities[index];
+        index++;
+      }
+
+      return tourIndex;
+    }
+
+    protected static bool FindInsertionPlace(PotvinEncoding individual, int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) {
+      return individual.FindInsertionPlace(
+        city, routeToAvoid, allowInfeasible, out route, out place);
+    }
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PotvinEncoding)) {
+        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as PotvinEncoding);
+      (VRPToursParameter.ActualValue as PotvinEncoding).Repair();
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinOneLevelExchangeManipulator.cs	(revision 15895)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinOneLevelExchangeMainpulator", "The 1M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinOneLevelExchangeMainpulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinOneLevelExchangeMainpulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinOneLevelExchangeMainpulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinOneLevelExchangeMainpulator(this, cloner);
+    }
+
+    private PotvinOneLevelExchangeMainpulator(PotvinOneLevelExchangeMainpulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance);
+      if (selectedIndex >= 0) {
+        Tour route1 =
+          individual.Tours[selectedIndex];
+
+        int count = route1.Stops.Count;
+        int i = 0;
+        while (i < count) {
+          int insertedRoute, insertedPlace;
+
+          int city = route1.Stops[i];
+          route1.Stops.Remove(city);
+
+          if (FindInsertionPlace(individual, city, selectedIndex, allowInfeasible, out insertedRoute, out insertedPlace)) {
+            individual.Tours[insertedRoute].Stops.Insert(insertedPlace, city);
+          } else {
+            route1.Stops.Insert(i, city);
+            i++;
+          }
+
+          count = route1.Stops.Count;
+        }
+      }
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      ApplyManipulation(random, individual, ProblemInstance, allowInfeasible);      
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseOneLevelExchangeManipulator.cs	(revision 15895)
@@ -0,0 +1,161 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPairwiseOneLevelExchangeMainpulator", "The 1M operator which manipulates a PDP representation. It has been adapted to pickup and delivery from Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172. It was adapted to the PDP formulation.")]
+  [StorableClass]
+  public sealed class PotvinPairwiseOneLevelExchangeMainpulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinPairwiseOneLevelExchangeMainpulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPairwiseOneLevelExchangeMainpulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPairwiseOneLevelExchangeMainpulator(this, cloner);
+    }
+
+    private PotvinPairwiseOneLevelExchangeMainpulator(PotvinPairwiseOneLevelExchangeMainpulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static bool PairwiseMove(PotvinEncoding individual, IVRPProblemInstance instance, int city, bool allowInfeasible) {
+      bool success;
+
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+
+      if (pdp != null) {
+        Tour route1 = individual.Tours.Find(t => t.Stops.Contains(city));
+        int i = route1.Stops.IndexOf(city);
+
+        int dest = pdp.GetPickupDeliveryLocation(city);
+        Tour destRoute = individual.Tours.Find(t => t.Stops.Contains(dest));
+        int j = destRoute.Stops.IndexOf(dest);
+
+        route1.Stops.Remove(city);
+        destRoute.Stops.Remove(dest);
+
+        int routeToAvoid = -1;
+        if (route1 == destRoute)
+          routeToAvoid = individual.Tours.IndexOf(route1);
+
+        int source, target;
+        if (instance.GetDemand(city) >= 0) {
+          source = city;
+          target = dest;
+        } else {
+          source = dest;
+          target = city;
+        }
+
+        double bestQuality = double.MaxValue;
+        int bestTour = -1;
+        int bestPositionSource = -1;
+        int bestPositionTarget = -1;
+
+        for (int tourIdx = 0; tourIdx < individual.Tours.Count; tourIdx++) {
+          if (tourIdx != routeToAvoid) {
+            Tour tour = individual.Tours[tourIdx];
+            VRPEvaluation eval = instance.EvaluateTour(tour, individual);
+            individual.InsertPair(tour, source, target, instance);
+            VRPEvaluation evalNew = instance.EvaluateTour(tour, individual);
+
+            double delta = evalNew.Quality - eval.Quality;
+
+            if (delta < bestQuality &&
+               (instance.Feasible(evalNew) || allowInfeasible)) {
+              bestQuality = delta;
+              bestTour = tourIdx;
+              bestPositionSource = tour.Stops.IndexOf(source);
+              bestPositionTarget = tour.Stops.IndexOf(target);
+            }
+
+            tour.Stops.Remove(source);
+            tour.Stops.Remove(target);
+          }
+        }
+
+        if (bestTour >= 0) {
+          if (bestPositionTarget < bestPositionSource) {
+            individual.Tours[bestTour].Stops.Insert(bestPositionTarget, target);
+            individual.Tours[bestTour].Stops.Insert(bestPositionSource, source);
+          } else {
+            individual.Tours[bestTour].Stops.Insert(bestPositionSource, source);
+            individual.Tours[bestTour].Stops.Insert(bestPositionTarget, target);
+          }
+
+          success = true;
+        } else {
+          if (j < i) {
+            destRoute.Stops.Insert(j, dest);
+            route1.Stops.Insert(i, city);
+          } else {
+            route1.Stops.Insert(i, city);
+            destRoute.Stops.Insert(j, dest);
+          }
+
+          success = false;
+        }
+      } else {
+        success = false;
+      }
+
+      return success;
+    }
+
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IPickupAndDeliveryProblemInstance pdp, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, pdp);
+      if (selectedIndex >= 0) {
+        Tour route1 =
+          individual.Tours[selectedIndex];
+
+        int count = route1.Stops.Count;
+
+        if (count > 0) {
+          int i = random.Next(0, count);
+          int city = route1.Stops[i];
+
+          if (!PairwiseMove(individual, pdp, city, allowInfeasible))
+            i++;
+
+          count = route1.Stops.Count;
+        }
+      }
+    }
+
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+
+      IPickupAndDeliveryProblemInstance pdp = ProblemInstance as IPickupAndDeliveryProblemInstance;
+
+      if (pdp != null) {
+        ApplyManipulation(random, individual, pdp, allowInfeasible);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinPairwiseTwoLevelExchangeManipulator.cs	(revision 15895)
@@ -0,0 +1,196 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPairwiseTwoLevelExchangeManipulator", "The 2M operator which manipulates a VRP representation.   It has been adapted to pickup and delivery from Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.  It was adapted to the PDP formulation.")]
+  [StorableClass]
+  public sealed class PotvinPairwiseTwoLevelExchangeManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinPairwiseTwoLevelExchangeManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPairwiseTwoLevelExchangeManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPairwiseTwoLevelExchangeManipulator(this, cloner);
+    }
+
+    private PotvinPairwiseTwoLevelExchangeManipulator(PotvinPairwiseTwoLevelExchangeManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private static PotvinEncoding ReplacePair(PotvinEncoding individual, IVRPProblemInstance instance, int replaced, int replacing, bool allowInfeasible) {
+      individual = individual.Clone() as PotvinEncoding;
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+
+      int replacedDest = pdp.GetPickupDeliveryLocation(replaced);
+      int replacedSource, replacedTarget;
+      if (pdp.GetDemand(replaced) >= 0) {
+        replacedSource = replaced;
+        replacedTarget = replacedDest;
+      } else {
+        replacedSource = replacedDest;
+        replacedTarget = replaced;
+      }
+      Tour replacedSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacedSource));
+      Tour replacedTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacedTarget));
+
+      int replacingDest = pdp.GetPickupDeliveryLocation(replacing);
+      int replacingSource, replacingTarget;
+      if (pdp.GetDemand(replacing) >= 0) {
+        replacingSource = replacing;
+        replacingTarget = replacingDest;
+      } else {
+        replacingSource = replacingDest;
+        replacingTarget = replacing;
+      }
+      Tour replacingSourceTour = individual.Tours.Find(t => t.Stops.Contains(replacingSource));
+      Tour replacingTargetTour = individual.Tours.Find(t => t.Stops.Contains(replacingTarget));
+
+      replacingSourceTour.Stops.Remove(replacingSource);
+      replacingTargetTour.Stops.Remove(replacingTarget);
+
+      replacedSourceTour.Stops[replacedSourceTour.Stops.IndexOf(replacedSource)] = replacingSource;
+      if (!allowInfeasible && !instance.TourFeasible(replacedSourceTour, individual))
+        return null;
+
+      replacedTargetTour.Stops[replacedTargetTour.Stops.IndexOf(replacedTarget)] = replacingTarget;
+      if (!allowInfeasible && !instance.TourFeasible(replacedTargetTour, individual))
+        return null;
+
+      double bestQuality = double.MaxValue;
+      int bestTour = -1;
+      int bestPositionSource = -1;
+      int bestPositionTarget = -1;
+
+      int routeToAvoid = individual.Tours.IndexOf(replacingSourceTour);
+
+      for (int tourIdx = 0; tourIdx < individual.Tours.Count; tourIdx++) {
+        if (tourIdx != routeToAvoid) {
+          Tour tour = individual.Tours[tourIdx];
+          VRPEvaluation eval = instance.EvaluateTour(tour, individual);
+          individual.InsertPair(tour, replacedSource, replacedTarget, instance);
+          VRPEvaluation evalNew = instance.EvaluateTour(tour, individual);
+
+          double delta = evalNew.Quality - eval.Quality;
+
+          if (delta < bestQuality &&
+              (instance.Feasible(evalNew) || allowInfeasible)) {
+            bestQuality = delta;
+            bestTour = tourIdx;
+            bestPositionSource = tour.Stops.IndexOf(replacedSource);
+            bestPositionTarget = tour.Stops.IndexOf(replacedTarget);
+          }
+
+          tour.Stops.Remove(replacedSource);
+          tour.Stops.Remove(replacedTarget);
+        }
+      }
+
+      if (bestTour != -1) {
+        if (bestPositionTarget < bestPositionSource) {
+          individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget);
+          individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource);
+        } else {
+          individual.Tours[bestTour].Stops.Insert(bestPositionSource, replacedSource);
+          individual.Tours[bestTour].Stops.Insert(bestPositionTarget, replacedTarget);
+        }
+
+        return individual;
+      } else {
+        return null;
+      }
+    }
+
+    public static PotvinEncoding ApplyManipulation(IRandom random, PotvinEncoding individual, IPickupAndDeliveryProblemInstance pdp, bool allowInfeasible) {
+      PotvinEncoding result = null;
+      
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, pdp);
+      if (selectedIndex >= 0) {
+        bool performed = false;
+        Tour route1 = individual.Tours[selectedIndex];
+
+        if (route1.Stops.Count > 0) {
+          //randomize customer selection
+          Permutation perm = new Permutation(PermutationTypes.Absolute, route1.Stops.Count, random);
+          int customer1Position = 0;
+
+          while (customer1Position < route1.Stops.Count) {
+            performed = false;
+
+            int customer1 = route1.Stops[perm[customer1Position]];
+            int customer2 = -1;
+
+            for (int i = 0; i < individual.Tours.Count; i++) {
+              if (i != selectedIndex) {
+                Tour tour = individual.Tours[i];
+                for (int customer2Position = 0; customer2Position < tour.Stops.Count; customer2Position++) {
+                  customer2 = tour.Stops[customer2Position];
+
+                  if (pdp.GetPickupDeliveryLocation(customer1) != customer2) {
+                    result = ReplacePair(individual, pdp, customer2, customer1, allowInfeasible);
+                    if (result != null) {
+                      individual = result;
+
+                      route1 = individual.Tours[selectedIndex];
+                      performed = true;
+                      break;
+                    }
+                  }
+                }
+              }
+
+              if (performed) {
+                break;
+              }
+            }
+
+            if (!performed)
+              customer1Position++;
+            else
+              break;
+          }
+        }
+      }
+
+      return result;
+    }
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+      IPickupAndDeliveryProblemInstance pdp = ProblemInstance as IPickupAndDeliveryProblemInstance;
+
+      if (pdp != null) {
+        PotvinEncoding result = ApplyManipulation(random, individual, pdp, allowInfeasible);
+        if (result != null) {
+          VRPToursParameter.ActualValue = result;
+        }        
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinTwoLevelExchangeManipulator.cs	(revision 15895)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoLevelExchangeManipulator", "The 2M operator which manipulates a VRP representation.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public sealed class PotvinTwoLevelExchangeManipulator : PotvinManipulator {
+    [StorableConstructor]
+    private PotvinTwoLevelExchangeManipulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoLevelExchangeManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoLevelExchangeManipulator(this, cloner);
+    }
+
+    private PotvinTwoLevelExchangeManipulator(PotvinTwoLevelExchangeManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void ApplyManipulation(IRandom random, PotvinEncoding individual, IVRPProblemInstance instance, bool allowInfeasible) {
+      int selectedIndex = SelectRandomTourBiasedByLength(random, individual, instance);
+      if (selectedIndex >= 0) {
+        Tour route1 = individual.Tours[selectedIndex];
+
+        bool performed = false;
+        int customer1Position = 0;
+        while (customer1Position < route1.Stops.Count) {
+          performed = false;
+
+          foreach (Tour tour in individual.Tours) {
+            if (tour != route1) {
+              for (int customer2Position = 0; customer2Position < tour.Stops.Count; customer2Position++) {
+                int customer1 = route1.Stops[customer1Position];
+                int customer2 = tour.Stops[customer2Position];
+
+                //customer1 can be feasibly inserted at the location of customer2
+                tour.Stops[customer2Position] = customer1;
+                route1.Stops.RemoveAt(customer1Position);
+
+                if (instance.TourFeasible(tour, individual)) {
+                  int routeIdx, place;
+                  if (FindInsertionPlace(individual,
+                    customer2, selectedIndex, allowInfeasible, out routeIdx, out place)) {
+                    individual.Tours[routeIdx].Stops.Insert(place, customer2);
+
+                    //two-level exchange has been performed
+                    performed = true;
+                    break;
+                  } else {
+                    tour.Stops[customer2Position] = customer2;
+                    route1.Stops.Insert(customer1Position, customer1);
+                  }
+                } else {
+                  tour.Stops[customer2Position] = customer2;
+                  route1.Stops.Insert(customer1Position, customer1);
+                }
+              }
+            }
+
+            if (performed)
+              break;
+          }
+
+          if (!performed)
+            customer1Position++;
+        }
+      }
+    }
+      
+
+    protected override void Manipulate(IRandom random, PotvinEncoding individual) {
+      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
+
+      ApplyManipulation(random, individual, ProblemInstance, allowInfeasible);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Manipulators/PotvinVehicleAssignmentManipulator.cs	(revision 15895)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMainpulator", "A manipulator that changes the vehicle assignment")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMainpulator : VRPManipulator, ITimeWindowedOperator,
+    IMultiDepotOperator, IHeterogenousCapacitatedOperator {
+    public IValueParameter<IPermutationManipulator> VehicleAssignmentManipuator {
+      get { return (IValueParameter<IPermutationManipulator>)Parameters["VehicleAssignmentManipuator"]; }
+    }
+
+    public ILookupParameter<Permutation> VehicleAssignmentParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["VehicleAssignment"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMainpulator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMainpulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IPermutationManipulator>("VehicleAssignmentManipuator",
+      "The operator used to menipulate the vehicle assignments.", new Swap2Manipulator()));
+      Parameters.Add(new LookupParameter<Permutation>("VehicleAssignment"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMainpulator(this, cloner);
+    }
+
+    private PotvinVehicleAssignmentMainpulator(PotvinVehicleAssignmentMainpulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PotvinEncoding)) {
+        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      OperationCollection next = new OperationCollection(base.InstrumentedApply());
+
+      VehicleAssignmentParameter.ActualValue = (VRPToursParameter.ActualValue as PotvinEncoding).VehicleAssignment;
+      VehicleAssignmentManipuator.Value.PermutationParameter.ActualName = VehicleAssignmentParameter.ActualName;
+      next.Insert(0, ExecutionContext.CreateOperation(VehicleAssignmentManipuator.Value));
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/IPotvinCustomerRelocationMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/IPotvinCustomerRelocationMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/IPotvinCustomerRelocationMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinCustomerRelocationMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationExhaustiveMoveGenerator", "Generates customer relocation moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinCustomerRelocationExhaustiveMoveGenerator : PotvinCustomerRelocationMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinCustomerRelocationExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinCustomerRelocationExhaustiveMoveGenerator(PotvinCustomerRelocationExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinCustomerRelocationMove> result = new List<PotvinCustomerRelocationMove>();
+
+      int max = individual.Tours.Count;
+      if (individual.Tours.Count >= problemInstance.Vehicles.Value)
+        max = max - 1;
+
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        for (int j = 0; j < individual.Tours[i].Stops.Count; j++) {
+          for (int k = 0; k <= max; k++) {
+            if (k != i) {
+              PotvinCustomerRelocationMove move = new PotvinCustomerRelocationMove(
+                individual.Tours[i].Stops[j], i, k, individual);
+
+              result.Add(move);
+            }
+          }
+        }
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMove.cs	(revision 15895)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMove", "Item that describes a relocation move on a VRP representation.")]
+  [StorableClass]
+  public class PotvinCustomerRelocationMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int City { get; protected set; }
+
+    [Storable]
+    public int OldTour { get; protected set; }
+
+    [Storable]
+    public int Tour { get; protected set; }
+
+    public PotvinCustomerRelocationMove()
+      : base() {
+      City = -1;
+      Tour = -1;
+
+      Individual = null;
+    }
+
+    public PotvinCustomerRelocationMove(int city, int oldTour, int tour, PotvinEncoding individual) {
+      City = city;
+      OldTour = oldTour;
+      Tour = tour;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMove(this, cloner);
+    }
+
+    protected PotvinCustomerRelocationMove(PotvinCustomerRelocationMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.City = original.City;
+      this.OldTour = original.OldTour;
+      this.Tour = original.Tour;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMove(bool deserializing) : base(deserializing) { }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new PotvinCustomerRelocationMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new PotvinCustomerRelocationMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return new PotvinCustomerRelocationMoveTabuMaker();
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return new PotvinCustomerRelocationMoveTabuCriterion();
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      PotvinCustomerRelocationMoveTabuCriterion tabuChecker = new PotvinCustomerRelocationMoveTabuCriterion();
+      tabuChecker.UseAspirationCriterion.Value = true;
+
+      return tabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveAttribute.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveAttribute.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveAttribute.cs	(revision 15895)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMoveAttribute", "Customer relocation move attribute")]
+  [StorableClass]
+  public class PotvinCustomerRelocationMoveAttribute : VRPMoveAttribute {
+    [Storable]
+    public int Tour { get; private set; }
+    [Storable]
+    public int City { get; private set; }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PotvinCustomerRelocationMoveAttribute(PotvinCustomerRelocationMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour = original.Tour;
+      this.City = original.City;
+    }
+    public PotvinCustomerRelocationMoveAttribute(double moveQuality, int tour, int city)
+      : base(moveQuality) {
+      Tour = tour;
+      City = city;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMoveAttribute(this, cloner);
+    }
+
+    public override int GetHashCode() {
+      return Tour.GetHashCode() + City.GetHashCode();
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PotvinCustomerRelocationMoveAttribute) {
+        PotvinCustomerRelocationMoveAttribute other = obj as PotvinCustomerRelocationMoveAttribute;
+
+        return Tour == other.Tour && City == other.City;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMoveEvaluator", "Evaluates a customer relocation move for a VRP representation. ")]
+  [StorableClass]
+  public sealed class PotvinCustomerRelocationMoveEvaluator : PotvinMoveEvaluator, IPotvinCustomerRelocationMoveOperator {
+    public ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter {
+      get { return (ILookupParameter<PotvinCustomerRelocationMove>)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return CustomerRelocationMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    public IValueParameter<DoubleValue> LambdaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Lambda"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinCustomerRelocationMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The move that should be evaluated."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+      Parameters.Add(new ValueParameter<DoubleValue>("Lambda", "The lambda parameter.", new DoubleValue(0.015)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMoveEvaluator(this, cloner);
+    }
+
+    private PotvinCustomerRelocationMoveEvaluator(PotvinCustomerRelocationMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = CustomerRelocationMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinCustomerRelocationMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+
+      //Apply memory, only if move is worse
+      if (MoveQualityParameter.ActualValue.Value >= QualityParameter.ActualValue.Value) {
+        VariableCollection memory = MemoriesParameter.ActualValue;
+        string key = AdditionFrequencyMemoryKeyParameter.Value.Value;
+
+        if (memory != null && memory.ContainsKey(key)) {
+          ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
+               memory[key].Value as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
+          PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City);
+          if (additionFrequency.ContainsKey(attr)) {
+            int frequency = additionFrequency[attr].Value;
+            double quality = MoveQualityParameter.ActualValue.Value;
+
+            MoveQualityParameter.ActualValue.Value +=
+              LambdaParameter.Value.Value * quality * frequency;
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMoveGenerator", "Generates customer relocation moves from a given VRP encoding.")]
+  [StorableClass]
+  public abstract class PotvinCustomerRelocationMoveGenerator : PotvinMoveGenerator, IPotvinCustomerRelocationMoveOperator {
+    public ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter {
+      get { return (ILookupParameter<PotvinCustomerRelocationMove>)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return CustomerRelocationMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinCustomerRelocationMoveGenerator(PotvinCustomerRelocationMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinCustomerRelocationMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(CustomerRelocationMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 15895)
@@ -0,0 +1,118 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMoveMaker", "Peforms the customer relocation move on a given VRP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinCustomerRelocationMoveMaker : PotvinMoveMaker, IPotvinCustomerRelocationMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter {
+      get { return (ILookupParameter<PotvinCustomerRelocationMove>)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return CustomerRelocationMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The moves that should be made."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMoveMaker(this, cloner);
+    }
+
+    protected PotvinCustomerRelocationMoveMaker(PotvinCustomerRelocationMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinCustomerRelocationMove move, IVRPProblemInstance problemInstance) {
+      if (move.Tour >= solution.Tours.Count)
+        solution.Tours.Add(new Tour());
+      Tour tour = solution.Tours[move.Tour];
+
+      Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City));
+      oldTour.Stops.Remove(move.City);
+      /*if (oldTour.Stops.Count == 0)
+        solution.Tours.Remove(oldTour);*/
+
+      int place = solution.FindBestInsertionPlace(tour, move.City);
+      tour.Stops.Insert(place, move.City);
+
+      solution.Repair();
+    }
+
+    protected override void PerformMove() {
+      PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
+      VRPToursParameter.ActualValue = newSolution;
+
+      //reset move quality
+      VRPEvaluation eval = ProblemInstance.Evaluate(newSolution);
+      MoveQualityParameter.ActualValue.Value = eval.Quality;
+
+      //update memory
+      VariableCollection memory = MemoriesParameter.ActualValue;
+      string key = AdditionFrequencyMemoryKeyParameter.Value.Value;
+
+      if (memory != null) {
+        if (!memory.ContainsKey(key)) {
+          memory.Add(new Variable(key,
+              new ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>()));
+        }
+        ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
+          memory[key].Value as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
+
+        PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City);
+        if (!additionFrequency.ContainsKey(attr))
+          additionFrequency[attr] = new IntValue(0);
+
+        additionFrequency[attr].Value++;
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationTabuCriterion", @"Checks if a certain customer relocation move is tabu.")]
+  [StorableClass]
+  public class PotvinCustomerRelocationMoveTabuCriterion : SingleSuccessorOperator, IPotvinCustomerRelocationMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter {
+      get { return (ILookupParameter<PotvinCustomerRelocationMove>)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return CustomerRelocationMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMoveTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinCustomerRelocationMoveTabuCriterion(PotvinCustomerRelocationMoveTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinCustomerRelocationMoveTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMoveTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;
+
+      foreach (var attribute in tabuList.OfType<PotvinCustomerRelocationMoveAttribute>()) {
+        if (!useAspiration || moveQuality >= attribute.MoveQuality) {
+          if (attribute.City == move.City && attribute.Tour == move.Tour) {
+            isTabu = true;
+            break;
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMoveTabuMaker", "Declares a given customer relocation move as tabu.")]
+  [StorableClass]
+  public class PotvinCustomerRelocationMoveTabuMaker : TabuMaker, IPotvinCustomerRelocationMoveOperator, IPotvinOperator {
+    public ILookupParameter<PotvinCustomerRelocationMove> CustomerRelocationMoveParameter {
+      get { return (ILookupParameter<PotvinCustomerRelocationMove>)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return CustomerRelocationMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinCustomerRelocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinCustomerRelocationMoveTabuMaker(PotvinCustomerRelocationMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinCustomerRelocationMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMoveTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;
+      double baseQuality = moveQuality;
+      //if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+      return new PotvinCustomerRelocationMoveAttribute(baseQuality, move.OldTour, move.City);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationMultiMoveGenerator", "Generates customer relocation moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinCustomerRelocationMultiMoveGenerator : PotvinCustomerRelocationMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinCustomerRelocationMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinCustomerRelocationMultiMoveGenerator(PotvinCustomerRelocationMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinCustomerRelocationMove> result = new List<PotvinCustomerRelocationMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        result.Add(PotvinCustomerRelocationSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue));
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinCustomerRelocationSingleMoveGenerator", "Generates a single customer relocation move from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinCustomerRelocationSingleMoveGenerator : PotvinCustomerRelocationMoveGenerator,
+    ISingleMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["PotvinCustomerRelocationMove"]; }
+    }
+
+    #endregion
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinCustomerRelocationSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinCustomerRelocationSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinCustomerRelocationSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinCustomerRelocationSingleMoveGenerator(PotvinCustomerRelocationSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinCustomerRelocationMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      int city = 1 + rand.Next(individual.Cities);
+      Tour oldTour = individual.Tours.Find(t => t.Stops.Contains(city));
+      int oldTourIndex = individual.Tours.IndexOf(oldTour);
+
+      int max = individual.Tours.Count;
+      if (individual.Tours.Count < problemInstance.Vehicles.Value)
+        max = max - 1;
+
+      int newTourIndex = rand.Next(max);
+      if (newTourIndex >= oldTourIndex)
+        newTourIndex++;
+
+      return new PotvinCustomerRelocationMove(city, oldTourIndex, newTourIndex, individual);
+    }
+
+    protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinCustomerRelocationMove> result = new List<PotvinCustomerRelocationMove>();
+
+      PotvinCustomerRelocationMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/IPotvinPDExchangeMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/IPotvinPDExchangeMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/IPotvinPDExchangeMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinPDExchangeMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeExhaustiveMoveGenerator", "Generates exchange moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDExchangeExhaustiveMoveGenerator : PotvinPDExchangeMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDExchangeExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinPDExchangeExhaustiveMoveGenerator(PotvinPDExchangeExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDExchangeMove> result = new List<PotvinPDExchangeMove>();
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+
+      int max = individual.Tours.Count;
+      if (individual.Tours.Count < problemInstance.Vehicles.Value)
+        max = max - 1;
+
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        for (int j = 0; j < individual.Tours[i].Stops.Count; j++) {
+          for (int k = 0; k <= max; k++) {
+            if (k != i) {
+              int city1 = individual.Tours[i].Stops[j];
+              if (pdp == null || pdp.GetDemand(city1) >= 0) {
+                for (int l = 0; l < individual.Tours[k].Stops.Count; l++) {
+                  int city2 = individual.Tours[k].Stops[l];
+                  if (pdp == null || pdp.GetDemand(city2) >= 0) {
+                    bool valid = pdp == null ||
+                      (pdp.GetPickupDeliveryLocation(city2) != pdp.GetPickupDeliveryLocation(city1) &&
+                       pdp.GetPickupDeliveryLocation(city2) != city1 &&
+                       pdp.GetPickupDeliveryLocation(city1) != city2);
+
+                    if (valid) {
+                      PotvinPDExchangeMove move = new PotvinPDExchangeMove(
+                        city1, i, k, city2, individual);
+
+                      result.Add(move);
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMove.cs	(revision 15895)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMove", "Item that describes a exchange move on a PDP representation.")]
+  [StorableClass]
+  public class PotvinPDExchangeMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int City { get; protected set; }
+
+    [Storable]
+    public int OldTour { get; protected set; }
+
+    [Storable]
+    public int Tour { get; protected set; }
+
+    [Storable]
+    public int Replaced { get; protected set; }
+
+    public PotvinPDExchangeMove()
+      : base() {
+      City = -1;
+      Tour = -1;
+
+      Individual = null;
+    }
+
+    public PotvinPDExchangeMove(int city, int oldTour, int tour, int replaced, PotvinEncoding individual) {
+      City = city;
+      OldTour = oldTour;
+      Tour = tour;
+      Replaced = replaced;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinPDExchangeMove(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeMove(this, cloner);
+    }
+
+    protected PotvinPDExchangeMove(PotvinPDExchangeMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.City = original.City;
+      this.OldTour = original.OldTour;
+      this.Tour = original.Tour;
+      this.Replaced = original.Replaced;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    #region IVRPMove Members
+
+    [ThreadStatic]
+    private static PotvinPDExchangeMoveEvaluator moveEvaluator;
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      if (moveEvaluator == null)
+        moveEvaluator = new PotvinPDExchangeMoveEvaluator();
+
+      return moveEvaluator;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDExchangeMoveMaker moveMaker;
+    public VRPMoveMaker GetMoveMaker() {
+      if (moveMaker == null)
+        moveMaker = new PotvinPDExchangeMoveMaker();
+
+      return moveMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDExchangeMoveTabuMaker tabuMaker;
+    public ITabuMaker GetTabuMaker() {
+      if (tabuMaker == null)
+        tabuMaker = new PotvinPDExchangeMoveTabuMaker();
+
+      return tabuMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDExchangeTabuCriterion tabuChecker;
+    public ITabuChecker GetTabuChecker() {
+      if (tabuChecker == null) {
+        tabuChecker = new PotvinPDExchangeTabuCriterion();
+        tabuChecker.UseAspirationCriterion.Value = false;
+      }
+
+      return tabuChecker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDExchangeTabuCriterion softTabuChecker;
+    public ITabuChecker GetSoftTabuChecker() {
+      if (softTabuChecker == null) {
+        softTabuChecker = new PotvinPDExchangeTabuCriterion();
+        softTabuChecker.UseAspirationCriterion.Value = true;
+      }
+
+      return softTabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMoveEvaluator", "Evaluates a exchange move for a PDP representation. ")]
+  [StorableClass]
+  public sealed class PotvinPDExchangeMoveEvaluator : PotvinMoveEvaluator, IPotvinPDExchangeMoveOperator {
+    public ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDExchangeMove>)Parameters["PotvinPDExchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDExchangeMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    public IValueParameter<DoubleValue> LambdaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Lambda"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinPDExchangeMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDExchangeMove>("PotvinPDExchangeMove", "The move that should be evaluated."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+      Parameters.Add(new ValueParameter<DoubleValue>("Lambda", "The lambda parameter.", new DoubleValue(0.015)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeMoveEvaluator(this, cloner);
+    }
+
+    private PotvinPDExchangeMoveEvaluator(PotvinPDExchangeMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinPDExchangeMove move = PDExchangeMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = PDExchangeMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinPDExchangeMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMoveGenerator", "Generates exchange moves from a given PDP encoding.")]
+  [StorableClass]
+  public abstract class PotvinPDExchangeMoveGenerator : PotvinMoveGenerator, IPotvinPDExchangeMoveOperator {
+    public ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDExchangeMove>)Parameters["PotvinPDExchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDExchangeMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDExchangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDExchangeMove>("PotvinPDExchangeMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinPDExchangeMoveGenerator(PotvinPDExchangeMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinPDExchangeMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PDExchangeMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveMaker.cs	(revision 15895)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMoveMaker", "Peforms the exchange move on a given PDP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinPDExchangeMoveMaker : PotvinMoveMaker, IPotvinPDExchangeMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDExchangeMove>)Parameters["PotvinPDExchangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDExchangeMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDExchangeMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDExchangeMove>("PotvinPDExchangeMove", "The moves that should be made."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeMoveMaker(this, cloner);
+    }
+
+    protected PotvinPDExchangeMoveMaker(PotvinPDExchangeMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinPDExchangeMove move, IVRPProblemInstance problemInstance) {
+      if (move.Tour >= solution.Tours.Count)
+        solution.Tours.Add(new Tour());
+      Tour tour = solution.Tours[move.Tour];
+
+      Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City));
+      oldTour.Stops.Remove(move.City);
+
+      if (problemInstance is IPickupAndDeliveryProblemInstance) {
+        IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+
+        int location = pdp.GetPickupDeliveryLocation(move.City);
+        Tour oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location));
+        oldTour2.Stops.Remove(location);
+
+        location = pdp.GetPickupDeliveryLocation(move.Replaced);
+        oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location));
+
+        oldTour2.Stops.Remove(location);
+        tour.Stops.Remove(move.Replaced);
+
+        solution.InsertPair(tour, move.City, pdp.GetPickupDeliveryLocation(move.City), problemInstance);
+        solution.InsertPair(oldTour, move.Replaced, pdp.GetPickupDeliveryLocation(move.Replaced), problemInstance);
+      } else {
+        tour.Stops.Remove(move.Replaced);
+
+        int place = solution.FindBestInsertionPlace(tour, move.City);
+        tour.Stops.Insert(place, move.City);
+
+        place = solution.FindBestInsertionPlace(oldTour, move.Replaced);
+        oldTour.Stops.Insert(place, move.Replaced);
+      }
+
+      solution.Repair();
+    }
+
+    protected override void PerformMove() {
+      PotvinPDExchangeMove move = PDExchangeMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeTabuCriterion", @"Checks if a certain exchange move is tabu.")]
+  [StorableClass]
+  public class PotvinPDExchangeTabuCriterion : SingleSuccessorOperator, IPotvinPDExchangeMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDExchangeMove>)Parameters["PotvinPDExchangeMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDExchangeMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDExchangeTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinPDExchangeTabuCriterion(PotvinPDExchangeTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDExchangeTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDExchangeMove>("PotvinPDExchangeMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinPDExchangeMove move = PDExchangeMoveParameter.ActualValue;
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+          if (pdp != null)
+            quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if ((attribute.City == move.City && attribute.Tour == move.Tour) ||
+              (attribute.City == move.Replaced && attribute.Tour == move.OldTour)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,142 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMoveTabuMaker", "Declares a given exchange move as tabu.")]
+  [StorableClass]
+  public class PotvinPDExchangeMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinPDExchangeMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntValue> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["TabuTenure"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+
+    public ILookupParameter<PotvinPDExchangeMove> PDExchangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDExchangeMove>)Parameters["PotvinPDExchangeMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDExchangeMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ILookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDExchangeMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinPDExchangeMoveTabuMaker(PotvinPDExchangeMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDExchangeMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+
+      Parameters.Add(new LookupParameter<PotvinPDExchangeMove>("PotvinPDExchangeMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+      Parameters.Add(new LookupParameter<IntValue>("PickupViolations", "The number of pickup violations."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeMoveTabuMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      int tabuTenure = TabuTenureParameter.ActualValue.Value;
+
+      int overlength = tabuList.Count - tabuTenure;
+      if (overlength >= 0) {
+        for (int i = 0; i < tabuTenure - 1; i++)
+          tabuList[i] = tabuList[i + overlength + 1];
+        while (tabuList.Count >= tabuTenure)
+          tabuList.RemoveAt(tabuList.Count - 1);
+      }
+
+      PotvinPDExchangeMove move = PDExchangeMoveParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      double quality = QualityParameter.ActualValue.Value;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      int pickupViolations = 0;
+      if (PickupViolationsParameter.ActualValue != null)
+        pickupViolations = PickupViolationsParameter.ActualValue.Value;
+
+      tabuList.Add(new PotvinPDRelocateMoveAttribute(baseQuality, move.OldTour, move.City, distance, overload, tardiness, pickupViolations));
+      tabuList.Add(new PotvinPDRelocateMoveAttribute(baseQuality, move.Tour, move.Replaced, distance, overload, tardiness, pickupViolations));
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeMultiMoveGenerator", "Generates exchange moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDExchangeMultiMoveGenerator : PotvinPDExchangeMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDExchangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinPDExchangeMultiMoveGenerator(PotvinPDExchangeMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDExchangeMove> result = new List<PotvinPDExchangeMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        var move = PotvinPDExchangeSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+        if (move != null)
+          result.Add(move);
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDExchangeSingleMoveGenerator", "Generates a single exchange move from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDExchangeSingleMoveGenerator : PotvinPDExchangeMoveGenerator,
+    ISingleMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDExchangeSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDExchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDExchangeSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinPDExchangeSingleMoveGenerator(PotvinPDExchangeSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinPDExchangeMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      List<int> cities = new List<int>();
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      for (int i = 1; i <= individual.Cities; i++) {
+        if (pdp == null || pdp.GetDemand(i) >= 0)
+          cities.Add(i);
+      }
+
+      if (cities.Count > 1 && individual.Tours.Count > 1) {
+        PotvinPDExchangeMove move = null;
+        while (cities.Count > 1 && move == null) {
+          int city = cities[rand.Next(cities.Count)];
+          Tour oldTour = individual.Tours.Find(t => t.Stops.Contains(city));
+          int oldTourIndex = individual.Tours.IndexOf(oldTour);
+
+          int max = individual.Tours.Count - 1;
+
+          int newTourIndex = rand.Next(max);
+          if (newTourIndex >= oldTourIndex)
+            newTourIndex++;
+
+          Tour newTour = individual.Tours[newTourIndex];
+          List<int> tourCities = new List<int>();
+          foreach (int stop in newTour.Stops) {
+            if (pdp == null ||
+              (pdp.GetDemand(stop) >= 0 &&
+              pdp.GetPickupDeliveryLocation(stop) != pdp.GetPickupDeliveryLocation(city) &&
+              pdp.GetPickupDeliveryLocation(stop) != city &&
+              pdp.GetPickupDeliveryLocation(city) != stop))
+              tourCities.Add(stop);
+          }
+
+          if (tourCities.Count > 0) {
+            int replaced = tourCities[rand.Next(tourCities.Count)];
+            move = new PotvinPDExchangeMove(city, oldTourIndex, newTourIndex, replaced, individual);
+          }
+        }
+
+        return move;
+      } else {
+        return null;
+      }
+    }
+
+    protected override PotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDExchangeMove> result = new List<PotvinPDExchangeMove>();
+
+      PotvinPDExchangeMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/IPotvinPDRearrangeMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/IPotvinPDRearrangeMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/IPotvinPDRearrangeMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinPDRearrangeMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeExhaustiveMoveGenerator", "Generates rearrange moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDRearrangeExhaustiveMoveGenerator : PotvinPDRearrangeMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDRearrangeExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinPDRearrangeExhaustiveMoveGenerator(PotvinPDRearrangeExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDRearrangeMove> result = new List<PotvinPDRearrangeMove>();
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+
+      for (int i = 1; i <= problemInstance.Cities.Value; i++) {
+        if (pdp == null || pdp.GetDemand(i) >= 0) {
+          int tour = individual.Tours.FindIndex(t => t.Stops.Contains(i));
+
+          result.Add(new PotvinPDRearrangeMove(i, tour, individual));
+        }
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMove.cs	(revision 15895)
@@ -0,0 +1,126 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMove", "Item that describes a rearrange move on a PDP representation.")]
+  [StorableClass]
+  public class PotvinPDRearrangeMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int City { get; protected set; }
+
+    [Storable]
+    public int Tour { get; protected set; }
+
+    public PotvinPDRearrangeMove()
+      : base() {
+      City = -1;
+      Tour = -1;
+
+      Individual = null;
+    }
+
+    public PotvinPDRearrangeMove(int city, int tour, PotvinEncoding individual) {
+      City = city;
+      Tour = tour;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeMove(this, cloner);
+    }
+
+    protected PotvinPDRearrangeMove(PotvinPDRearrangeMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.City = original.City;
+      this.Tour = original.Tour;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinPDRearrangeMove(bool deserializing) : base(deserializing) { }
+
+    #region IVRPMove Members
+
+    [ThreadStatic]
+    private static PotvinPDRearrangeMoveEvaluator moveEvaluator;
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      if (moveEvaluator == null)
+        moveEvaluator = new PotvinPDRearrangeMoveEvaluator();
+
+      return moveEvaluator;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDRearrangeMoveMaker moveMaker;
+    public VRPMoveMaker GetMoveMaker() {
+      if (moveMaker == null)
+        moveMaker = new PotvinPDRearrangeMoveMaker();
+
+      return moveMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDRearrangeMoveTabuMaker tabuMaker;
+    public ITabuMaker GetTabuMaker() {
+      if (tabuMaker == null)
+        tabuMaker = new PotvinPDRearrangeMoveTabuMaker();
+
+      return tabuMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDRearrangeTabuCriterion tabuChecker;
+    public ITabuChecker GetTabuChecker() {
+      if (tabuChecker == null) {
+        tabuChecker = new PotvinPDRearrangeTabuCriterion();
+        tabuChecker.UseAspirationCriterion.Value = false;
+      }
+
+      return tabuChecker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDRearrangeTabuCriterion softTabuChecker;
+    public ITabuChecker GetSoftTabuChecker() {
+      if (softTabuChecker == null) {
+        softTabuChecker = new PotvinPDRearrangeTabuCriterion();
+        softTabuChecker.UseAspirationCriterion.Value = true;
+      }
+
+      return softTabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMoveEvaluator", "Evaluates a rearrange move for a PDP representation. ")]
+  [StorableClass]
+  public sealed class PotvinPDRearrangeMoveEvaluator : PotvinMoveEvaluator, IPotvinPDRearrangeMoveOperator {
+    public ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDRearrangeMove>)Parameters["PotvinPDRearrangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDRearrangeMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    public IValueParameter<DoubleValue> LambdaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Lambda"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinPDRearrangeMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDRearrangeMove>("PotvinPDRearrangeMove", "The move that should be evaluated."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+      Parameters.Add(new ValueParameter<DoubleValue>("Lambda", "The lambda parameter.", new DoubleValue(0.015)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeMoveEvaluator(this, cloner);
+    }
+
+    private PotvinPDRearrangeMoveEvaluator(PotvinPDRearrangeMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = PDRearrangeMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinPDRearrangeMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMoveGenerator", "Generates rearrange moves from a given PDP encoding.")]
+  [StorableClass]
+  public abstract class PotvinPDRearrangeMoveGenerator : PotvinMoveGenerator, IPotvinPDRearrangeMoveOperator {
+    public ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDRearrangeMove>)Parameters["PotvinPDRearrangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDRearrangeMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDRearrangeMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDRearrangeMove>("PotvinPDRearrangeMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinPDRearrangeMoveGenerator(PotvinPDRearrangeMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinPDRearrangeMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PDRearrangeMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveMaker.cs	(revision 15895)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMoveMaker", "Peforms the rearrange move on a given PDP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinPDRearrangeMoveMaker : PotvinMoveMaker, IPotvinPDRearrangeMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDRearrangeMove>)Parameters["PotvinPDRearrangeMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDRearrangeMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDRearrangeMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDRearrangeMove>("PotvinPDRearrangeMove", "The moves that should be made."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeMoveMaker(this, cloner);
+    }
+
+    protected PotvinPDRearrangeMoveMaker(PotvinPDRearrangeMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinPDRearrangeMove move, IVRPProblemInstance problemInstance) {
+      Tour tour = solution.Tours[move.Tour];
+      int position = tour.Stops.IndexOf(move.City);
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      if (pdp != null) {
+        int location = pdp.GetPickupDeliveryLocation(move.City);
+        Tour tour2 = solution.Tours.Find(t => t.Stops.Contains(location));
+        int position2 = tour2.Stops.IndexOf(location);
+
+        tour.Stops.Remove(move.City);
+        tour2.Stops.Remove(location);
+
+        solution.InsertPair(tour, move.City, location, problemInstance, position, position2);
+      } else {
+        tour.Stops.Remove(move.City);
+        int place = solution.FindBestInsertionPlace(tour, move.City, position);
+        tour.Stops.Insert(place, move.City);
+      }
+
+      solution.Repair();
+    }
+
+    protected override void PerformMove() {
+      PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,164 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeTabuCriterion", @"Checks if a certain rearrange move is tabu.")]
+  [StorableClass]
+  public class PotvinPDRearrangeTabuCriterion : SingleSuccessorOperator, IPotvinPDRearrangeMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDRearrangeMove>)Parameters["PotvinPDRearrangeMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDRearrangeMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDRearrangeTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinPDRearrangeTabuCriterion(PotvinPDRearrangeTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDRearrangeTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDRearrangeMove>("PotvinPDRearrangeMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+          if (pdp != null)
+            quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.City == move.City && attribute.Tour == move.Tour) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMoveTabuMaker", "Declares a given rearrange move as tabu.")]
+  [StorableClass]
+  public class PotvinPDRearrangeMoveTabuMaker : TabuMaker, IPotvinPDRearrangeMoveOperator, IPotvinOperator, IVRPMoveOperator {
+    public ILookupParameter<PotvinPDRearrangeMove> PDRearrangeMoveParameter {
+      get { return (ILookupParameter<PotvinPDRearrangeMove>)Parameters["PotvinPDRearrangeMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDRearrangeMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ILookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDRearrangeMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinPDRearrangeMoveTabuMaker(PotvinPDRearrangeMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDRearrangeMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDRearrangeMove>("PotvinPDRearrangeMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+      Parameters.Add(new LookupParameter<IntValue>("PickupViolations", "The number of pickup violations."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeMoveTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      int pickupViolations = 0;
+      if (PickupViolationsParameter.ActualValue != null)
+        pickupViolations = PickupViolationsParameter.ActualValue.Value;
+
+      return new PotvinPDRelocateMoveAttribute(baseQuality, move.Tour, move.City, distance, overload, tardiness, pickupViolations);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeMultiMoveGenerator", "Generates rearrange moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDRearrangeMultiMoveGenerator : PotvinPDRearrangeMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDRearrangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinPDRearrangeMultiMoveGenerator(PotvinPDRearrangeMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDRearrangeMove> result = new List<PotvinPDRearrangeMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        var move = PotvinPDRearrangeSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+        if (move != null)
+          result.Add(move);
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRearrangeSingleMoveGenerator", "Generates a single rearrange move from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDRearrangeSingleMoveGenerator : PotvinPDRearrangeMoveGenerator,
+    ISingleMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRearrangeSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDRearrangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDRearrangeSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinPDRearrangeSingleMoveGenerator(PotvinPDRearrangeSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinPDRearrangeMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      List<int> cities = new List<int>();
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      for (int i = 1; i <= individual.Cities; i++) {
+        if (pdp == null || pdp.GetDemand(i) >= 0)
+          cities.Add(i);
+      }
+
+      if (cities.Count > 0) {
+        int city = cities[rand.Next(cities.Count)];
+        int tour = individual.Tours.FindIndex(t => t.Stops.Contains(city));
+        return new PotvinPDRearrangeMove(city, tour, individual);
+      } else {
+        return null;
+      }
+    }
+
+    protected override PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDRearrangeMove> result = new List<PotvinPDRearrangeMove>();
+
+      PotvinPDRearrangeMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/IPotvinPDShiftMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/IPotvinPDShiftMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/IPotvinPDShiftMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinPDShiftMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftExhaustiveMoveGenerator", "Generates shift moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDShiftExhaustiveMoveGenerator : PotvinPDShiftMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDShiftExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinPDShiftExhaustiveMoveGenerator(PotvinPDShiftExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDShiftMove> result = new List<PotvinPDShiftMove>();
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+
+      int max = individual.Tours.Count;
+      if (individual.Tours.Count >= problemInstance.Vehicles.Value)
+        max = max - 1;
+
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        for (int j = 0; j < individual.Tours[i].Stops.Count; j++) {
+          for (int k = 0; k <= max; k++) {
+            if (k != i) {
+              int city = individual.Tours[i].Stops[j];
+              if (pdp == null || pdp.GetDemand(city) >= 0) {
+                PotvinPDShiftMove move = new PotvinPDShiftMove(
+                  city, i, k, individual);
+
+                result.Add(move);
+              }
+            }
+          }
+        }
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMove.cs	(revision 15895)
@@ -0,0 +1,130 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMove", "Item that describes a shift move on a PDP representation.")]
+  [StorableClass]
+  public class PotvinPDShiftMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int City { get; protected set; }
+
+    [Storable]
+    public int OldTour { get; protected set; }
+
+    [Storable]
+    public int Tour { get; protected set; }
+
+    public PotvinPDShiftMove()
+      : base() {
+      City = -1;
+      Tour = -1;
+
+      Individual = null;
+    }
+
+    public PotvinPDShiftMove(int city, int oldTour, int tour, PotvinEncoding individual) {
+      City = city;
+      OldTour = oldTour;
+      Tour = tour;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftMove(this, cloner);
+    }
+
+    protected PotvinPDShiftMove(PotvinPDShiftMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.City = original.City;
+      this.OldTour = original.OldTour;
+      this.Tour = original.Tour;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinPDShiftMove(bool deserializing) : base(deserializing) { }
+
+    #region IVRPMove Members
+
+    [ThreadStatic]
+    private static PotvinPDShiftMoveEvaluator moveEvaluator;
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      if (moveEvaluator == null)
+        moveEvaluator = new PotvinPDShiftMoveEvaluator();
+
+      return moveEvaluator;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDShiftMoveMaker moveMaker;
+    public VRPMoveMaker GetMoveMaker() {
+      if (moveMaker == null)
+        moveMaker = new PotvinPDShiftMoveMaker();
+
+      return moveMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDShiftMoveTabuMaker tabuMaker;
+    public ITabuMaker GetTabuMaker() {
+      if (tabuMaker == null)
+        tabuMaker = new PotvinPDShiftMoveTabuMaker();
+
+      return tabuMaker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDShiftTabuCriterion tabuChecker;
+    public ITabuChecker GetTabuChecker() {
+      if (tabuChecker == null) {
+        tabuChecker = new PotvinPDShiftTabuCriterion();
+        tabuChecker.UseAspirationCriterion.Value = false;
+      }
+
+      return tabuChecker;
+    }
+
+    [ThreadStatic]
+    private static PotvinPDShiftTabuCriterion softTabuChecker;
+    public ITabuChecker GetSoftTabuChecker() {
+      if (softTabuChecker == null) {
+        softTabuChecker = new PotvinPDShiftTabuCriterion();
+        softTabuChecker.UseAspirationCriterion.Value = true;
+      }
+
+      return softTabuChecker;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMoveEvaluator", "Evaluates a shift move for a PDP representation. ")]
+  [StorableClass]
+  public sealed class PotvinPDShiftMoveEvaluator : PotvinMoveEvaluator, IPotvinPDShiftMoveOperator {
+    public ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter {
+      get { return (ILookupParameter<PotvinPDShiftMove>)Parameters["PotvinPDShiftMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDShiftMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    public IValueParameter<DoubleValue> LambdaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Lambda"]; }
+    }
+
+    [StorableConstructor]
+    private PotvinPDShiftMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDShiftMove>("PotvinPDShiftMove", "The move that should be evaluated."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+      Parameters.Add(new ValueParameter<DoubleValue>("Lambda", "The lambda parameter.", new DoubleValue(0.015)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftMoveEvaluator(this, cloner);
+    }
+
+    private PotvinPDShiftMoveEvaluator(PotvinPDShiftMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinPDShiftMove move = PDShiftMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = PDShiftMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinPDShiftMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMoveGenerator", "Generates shift moves from a given PDP encoding.")]
+  [StorableClass]
+  public abstract class PotvinPDShiftMoveGenerator : PotvinMoveGenerator, IPotvinPDShiftMoveOperator {
+    public ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter {
+      get { return (ILookupParameter<PotvinPDShiftMove>)Parameters["PotvinPDShiftMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDShiftMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDShiftMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDShiftMove>("PotvinPDShiftMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinPDShiftMoveGenerator(PotvinPDShiftMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinPDShiftMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(PDShiftMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveMaker.cs	(revision 15895)
@@ -0,0 +1,128 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMoveMaker", "Peforms the shift move on a given PDP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinPDShiftMoveMaker : PotvinMoveMaker, IPotvinPDShiftMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter {
+      get { return (ILookupParameter<PotvinPDShiftMove>)Parameters["PotvinPDShiftMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return PDShiftMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDShiftMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDShiftMove>("PotvinPDShiftMove", "The moves that should be made."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftMoveMaker(this, cloner);
+    }
+
+    protected PotvinPDShiftMoveMaker(PotvinPDShiftMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinPDShiftMove move, IVRPProblemInstance problemInstance) {
+      bool newTour = false;
+
+      if (move.Tour >= solution.Tours.Count) {
+        solution.Tours.Add(new Tour());
+        newTour = true;
+      }
+      Tour tour = solution.Tours[move.Tour];
+
+      Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City));
+      oldTour.Stops.Remove(move.City);
+
+      if (problemInstance is IPickupAndDeliveryProblemInstance) {
+        IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+
+        int location = pdp.GetPickupDeliveryLocation(move.City);
+        Tour oldTour2 = solution.Tours.Find(t => t.Stops.Contains(location));
+        oldTour2.Stops.Remove(location);
+
+        solution.InsertPair(tour, move.City, location, problemInstance);
+      } else {
+        int place = solution.FindBestInsertionPlace(tour, move.City);
+        tour.Stops.Insert(place, move.City);
+      }
+
+      if (newTour) {
+        List<int> vehicles = new List<int>();
+        for (int i = move.Tour; i < problemInstance.Vehicles.Value; i++) {
+          vehicles.Add(solution.GetVehicleAssignment(i));
+        }
+
+        double bestQuality = double.MaxValue;
+        int bestVehicle = -1;
+
+        int originalVehicle = solution.GetVehicleAssignment(move.Tour);
+        foreach (int vehicle in vehicles) {
+          solution.VehicleAssignment[move.Tour] = vehicle;
+
+          double quality = problemInstance.EvaluateTour(tour, solution).Quality;
+          if (quality < bestQuality) {
+            bestQuality = quality;
+            bestVehicle = vehicle;
+          }
+        }
+
+        solution.VehicleAssignment[move.Tour] = originalVehicle;
+
+        int index = -1;
+        for (int i = move.Tour; i < solution.VehicleAssignment.Length; i++) {
+          if (solution.VehicleAssignment[i] == bestVehicle) {
+            index = i;
+            break;
+          }
+        }
+        solution.VehicleAssignment[index] = originalVehicle;
+        solution.VehicleAssignment[move.Tour] = bestVehicle;
+      }
+
+      solution.Repair();
+    }
+
+    protected override void PerformMove() {
+      PotvinPDShiftMove move = PDShiftMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,164 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftTabuCriterion", @"Checks if a certain shift move is tabu.")]
+  [StorableClass]
+  public class PotvinPDShiftTabuCriterion : SingleSuccessorOperator, IPotvinPDShiftMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter {
+      get { return (ILookupParameter<PotvinPDShiftMove>)Parameters["PotvinPDShiftMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDShiftMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDShiftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinPDShiftTabuCriterion(PotvinPDShiftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDShiftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDShiftMove>("PotvinPDShiftMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinPDShiftMove move = PDShiftMoveParameter.ActualValue;
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+          if (pdp != null)
+            quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.City == move.City && attribute.Tour == move.Tour) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMoveTabuMaker", "Declares a given shift move as tabu.")]
+  [StorableClass]
+  public class PotvinPDShiftMoveTabuMaker : TabuMaker, IPotvinPDShiftMoveOperator, IPotvinOperator, IVRPMoveOperator {
+    public ILookupParameter<PotvinPDShiftMove> PDShiftMoveParameter {
+      get { return (ILookupParameter<PotvinPDShiftMove>)Parameters["PotvinPDShiftMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return PDShiftMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+    public ILookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinPDShiftMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinPDShiftMoveTabuMaker(PotvinPDShiftMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinPDShiftMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinPDShiftMove>("PotvinPDShiftMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+      Parameters.Add(new LookupParameter<IntValue>("PickupViolations", "The number of pickup violations."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftMoveTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      PotvinPDShiftMove move = PDShiftMoveParameter.ActualValue;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      int pickupViolations = 0;
+      if (PickupViolationsParameter.ActualValue != null)
+        pickupViolations = PickupViolationsParameter.ActualValue.Value;
+
+      return new PotvinPDRelocateMoveAttribute(baseQuality, move.OldTour, move.City, distance, overload, tardiness, pickupViolations);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftMultiMoveGenerator", "Generates shift moves from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDShiftMultiMoveGenerator : PotvinPDShiftMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDShiftMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinPDShiftMultiMoveGenerator(PotvinPDShiftMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDShiftMove> result = new List<PotvinPDShiftMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        var move = PotvinPDShiftSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+        if (move != null)
+          result.Add(move);
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDShiftSingleMoveGenerator", "Generates a single shift move from a given PDP encoding.")]
+  [StorableClass]
+  public sealed class PotvinPDShiftSingleMoveGenerator : PotvinPDShiftMoveGenerator,
+    ISingleMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDShiftSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinPDShiftSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinPDShiftSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinPDShiftSingleMoveGenerator(PotvinPDShiftSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinPDShiftMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      List<int> cities = new List<int>();
+
+      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
+      for (int i = 1; i <= individual.Cities; i++) {
+        if (pdp == null || pdp.GetDemand(i) >= 0)
+          cities.Add(i);
+      }
+
+      if (cities.Count >= 1) {
+        int city = cities[rand.Next(cities.Count)];
+        Tour oldTour = individual.Tours.Find(t => t.Stops.Contains(city));
+        int oldTourIndex = individual.Tours.IndexOf(oldTour);
+
+        int max = individual.Tours.Count;
+        if (individual.Tours.Count >= problemInstance.Vehicles.Value)
+          max = max - 1;
+
+        int newTourIndex = rand.Next(max);
+        if (newTourIndex >= oldTourIndex)
+          newTourIndex++;
+
+        return new PotvinPDShiftMove(city, oldTourIndex, newTourIndex, individual);
+      } else {
+        return null;
+      }
+    }
+
+    protected override PotvinPDShiftMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinPDShiftMove> result = new List<PotvinPDShiftMove>();
+
+      PotvinPDShiftMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PotvinPDRelocateMoveAttribute.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PotvinPDRelocateMoveAttribute.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PotvinPDRelocateMoveAttribute.cs	(revision 15895)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinPDRelocateMoveAttribute", "PD relocation move attribute")]
+  [StorableClass]
+  public class PotvinPDRelocateMoveAttribute : VRPMoveAttribute {
+    [Storable]
+    public int Tour { get; private set; }
+    [Storable]
+    public int City { get; private set; }
+
+    [Storable]
+    public double Distance { get; private set; }
+    [Storable]
+    public double Overload { get; private set; }
+    [Storable]
+    public double Tardiness { get; private set; }
+    [Storable]
+    public int PickupViolations { get; private set; }
+
+    [StorableConstructor]
+    protected PotvinPDRelocateMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PotvinPDRelocateMoveAttribute(PotvinPDRelocateMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour = original.Tour;
+      this.City = original.City;
+      this.Distance = original.Distance;
+      this.Overload = original.Overload;
+      this.Tardiness = original.Tardiness;
+      this.PickupViolations = original.PickupViolations;
+    }
+    public PotvinPDRelocateMoveAttribute(double moveQuality, int tour, int city,
+      double distance, double overload, double tardiness, int pickupViolations)
+      : base(moveQuality) {
+      Tour = tour;
+      City = city;
+      Distance = distance;
+      Overload = overload;
+      Tardiness = tardiness;
+      PickupViolations = pickupViolations;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinPDRelocateMoveAttribute(this, cloner);
+    }
+
+    public override int GetHashCode() {
+      return Tour.GetHashCode() + City.GetHashCode();
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PotvinPDRelocateMoveAttribute) {
+        PotvinPDRelocateMoveAttribute other = obj as PotvinPDRelocateMoveAttribute;
+
+        return Tour == other.Tour && City == other.City;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinMoveEvaluator", "Evaluates a Potvin VRP move.")]
+  [StorableClass]
+  public abstract class PotvinMoveEvaluator : VRPMoveEvaluator, IPotvinOperator {
+    [StorableConstructor]
+    protected PotvinMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinMoveEvaluator()
+      : base() {
+    }
+
+    protected PotvinMoveEvaluator(PotvinMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinMoveGenerator", "Generates Potvin VRP moves.")]
+  [StorableClass]
+  public abstract class PotvinMoveGenerator : VRPMoveGenerator, IPotvinOperator {
+    [StorableConstructor]
+    protected PotvinMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinMoveGenerator()
+      : base() {
+    }
+
+    protected PotvinMoveGenerator(PotvinMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PotvinEncoding)) {
+        VRPToursParameter.ActualValue = PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PotvinMoveMaker.cs	(revision 15895)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinMoveMaker", "Makes a Potvin VRP move.")]
+  [StorableClass]
+  public abstract class PotvinMoveMaker : VRPMoveMaker, IPotvinOperator {
+    [StorableConstructor]
+    protected PotvinMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinMoveMaker()
+      : base() {
+    }
+
+    protected PotvinMoveMaker(PotvinMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/IPotvinTwoOptStarMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/IPotvinTwoOptStarMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/IPotvinTwoOptStarMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinTwoOptStarMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarExhaustiveMoveGenerator", "Generates two opt star moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinTwoOptStarExhaustiveMoveGenerator : PotvinTwoOptStarMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinTwoOptStarExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinTwoOptStarExhaustiveMoveGenerator(PotvinTwoOptStarExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinTwoOptStarMove> result = new List<PotvinTwoOptStarMove>();
+
+      for (int tour1 = 0; tour1 < individual.Tours.Count; tour1++) {
+        for (int tour2 = tour1 + 1; tour2 < individual.Tours.Count; tour2++) {
+          for (int index1 = 0; index1 <= individual.Tours[tour1].Stops.Count; index1++) {
+            for (int index2 = 0; index2 <= individual.Tours[tour2].Stops.Count; index2++) {
+              if ((index1 != individual.Tours[tour1].Stops.Count || index2 != individual.Tours[tour2].Stops.Count) &&
+                  (index1 != 0 || index2 != 0))
+                result.Add(new PotvinTwoOptStarMove(tour1, index1, tour2, index2, individual));
+            }
+          }
+        }
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMove.cs	(revision 15895)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMove", "Item that describes a two opt star move on a VRP representation.")]
+  [StorableClass]
+  public class PotvinTwoOptStarMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int Tour1 { get; protected set; }
+
+    [Storable]
+    public int X1 { get; protected set; }
+
+    [Storable]
+    public int Tour2 { get; protected set; }
+
+    [Storable]
+    public int X2 { get; protected set; }
+
+    public PotvinTwoOptStarMove()
+      : base() {
+      X1 = -1;
+      Tour1 = -1;
+      X2 = -1;
+      Tour2 = -1;
+
+      Individual = null;
+    }
+
+    public PotvinTwoOptStarMove(int tour1, int x1, int tour2, int x2, PotvinEncoding individual) {
+      Tour1 = tour1;
+      X1 = x1;
+      Tour2 = tour2;
+      X2 = x2;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMove(this, cloner);
+    }
+
+    protected PotvinTwoOptStarMove(PotvinTwoOptStarMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour1 = original.Tour1;
+      this.X1 = original.X1;
+      this.Tour2 = original.Tour2;
+      this.X2 = original.X2;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMove(bool deserializing) : base(deserializing) { }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new PotvinTwoOptStarMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new PotvinTwoOptStarMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return new PotvinTwoOptStarMoveTabuMaker();
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return new PotvinTwoOptStarMoveTabuCriterion();
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      PotvinTwoOptStarMoveTabuCriterion tabuChecker = new PotvinTwoOptStarMoveTabuCriterion();
+      tabuChecker.UseAspirationCriterion.Value = true;
+
+      return tabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveAttribute.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveAttribute.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveAttribute.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMoveAttribute", "Two opt star move attribute")]
+  [StorableClass]
+  public class PotvinTwoOptStarMoveAttribute : VRPMoveAttribute {
+    [Storable]
+    public int Tour { get; private set; }
+    [Storable]
+    public int City { get; private set; }
+
+    [Storable]
+    public double Distance { get; private set; }
+    [Storable]
+    public double Overload { get; private set; }
+    [Storable]
+    public double Tardiness { get; private set; }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PotvinTwoOptStarMoveAttribute(PotvinTwoOptStarMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour = original.Tour;
+      this.City = original.City;
+      this.Distance = original.Distance;
+      this.Overload = original.Overload;
+      this.Tardiness = original.Tardiness;
+    }
+    public PotvinTwoOptStarMoveAttribute(double moveQuality, int tour, int city,
+      double distance, double overload, double tardiness)
+      : base(moveQuality) {
+      Tour = tour;
+      City = city;
+      Distance = distance;
+      Overload = overload;
+      Tardiness = tardiness;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMoveAttribute(this, cloner);
+    }
+
+    public override int GetHashCode() {
+      return Tour.GetHashCode() + City.GetHashCode();
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PotvinTwoOptStarMoveAttribute) {
+        PotvinTwoOptStarMoveAttribute other = obj as PotvinTwoOptStarMoveAttribute;
+
+        return Tour == other.Tour && City == other.City;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMoveEvaluator", "Evaluates a two opt star move for a VRP representation. ")]
+  [StorableClass]
+  public sealed class PotvinTwoOptStarMoveEvaluator : PotvinMoveEvaluator, IPotvinTwoOptStarMoveOperator {
+    public ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter {
+      get { return (ILookupParameter<PotvinTwoOptStarMove>)Parameters["PotvinTwoOptStarMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TwoOptStarMoveParameter; }
+    }
+    [StorableConstructor]
+    private PotvinTwoOptStarMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinTwoOptStarMove>("PotvinTwoOptStarMove", "The move that should be evaluated."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMoveEvaluator(this, cloner);
+    }
+
+    private PotvinTwoOptStarMoveEvaluator(PotvinTwoOptStarMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinTwoOptStarMove move = TwoOptStarMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = TwoOptStarMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinTwoOptStarMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMoveGenerator", "Generates two opt star moves from a given VRP encoding.")]
+  [StorableClass]
+  public abstract class PotvinTwoOptStarMoveGenerator : PotvinMoveGenerator, IPotvinTwoOptStarMoveOperator {
+    public ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter {
+      get { return (ILookupParameter<PotvinTwoOptStarMove>)Parameters["PotvinTwoOptStarMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TwoOptStarMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinTwoOptStarMove>("PotvinTwoOptStarMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinTwoOptStarMoveGenerator(PotvinTwoOptStarMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinTwoOptStarMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(TwoOptStarMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveMaker.cs	(revision 15895)
@@ -0,0 +1,106 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMoveMaker", "Peforms the two opt star move on a given VRP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinTwoOptStarMoveMaker : PotvinMoveMaker, IPotvinTwoOptStarMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter {
+      get { return (ILookupParameter<PotvinTwoOptStarMove>)Parameters["PotvinTwoOptStarMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return TwoOptStarMoveParameter; }
+    }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinTwoOptStarMove>("PotvinTwoOptStarMove", "The moves that should be made."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMoveMaker(this, cloner);
+    }
+
+    protected PotvinTwoOptStarMoveMaker(PotvinTwoOptStarMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void GetSegments(PotvinTwoOptStarMove move, out List<int> segmentX1, out List<int> segmentX2) {
+      PotvinEncoding solution = move.Individual as PotvinEncoding;
+
+      Tour route1 = solution.Tours[move.Tour1];
+      Tour route2 = solution.Tours[move.Tour2];
+
+      int x1 = move.X1;
+      int x2 = move.X2;
+
+      int count = route1.Stops.Count - x1;
+      segmentX1 = new List<int>();
+      if (count > 0) {
+        segmentX1 = route1.Stops.GetRange(x1, count);
+      }
+
+      count = route2.Stops.Count - x2;
+      segmentX2 = new List<int>();
+      if (count > 0) {
+        segmentX2 = route2.Stops.GetRange(x2, count);
+      }
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinTwoOptStarMove move, IVRPProblemInstance problemInstance) {
+      List<int> segmentX1;
+      List<int> segmentX2;
+      GetSegments(move, out segmentX1, out segmentX2);
+
+      Tour route1 = solution.Tours[move.Tour1];
+      Tour route2 = solution.Tours[move.Tour2];
+
+      foreach (int stop in segmentX1)
+        route1.Stops.Remove(stop);
+      route1.Stops.AddRange(segmentX2);
+
+      foreach (int stop in segmentX2)
+        route2.Stops.Remove(stop);
+      route2.Stops.AddRange(segmentX1);
+    }
+
+    protected override void PerformMove() {
+      PotvinTwoOptStarMove move = TwoOptStarMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,166 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarTabuCriterion", @"Checks if a certain two opt star move is tabu.")]
+  [StorableClass]
+  public class PotvinTwoOptStarMoveTabuCriterion : SingleSuccessorOperator, IPotvinTwoOptStarMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter {
+      get { return (ILookupParameter<PotvinTwoOptStarMove>)Parameters["PotvinTwoOptStarMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return TwoOptStarMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMoveTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinTwoOptStarMoveTabuCriterion(PotvinTwoOptStarMoveTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinTwoOptStarMoveTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinTwoOptStarMove>("PotvinTwoOptStarMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMoveTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinTwoOptStarMove move = TwoOptStarMoveParameter.ActualValue;
+
+      List<int> segmentX1;
+      List<int> segmentX2;
+      PotvinTwoOptStarMoveMaker.GetSegments(move, out segmentX1, out segmentX2);
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinTwoOptStarMoveAttribute attribute = tabuMove as PotvinTwoOptStarMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.Tour == move.Tour1 && segmentX2.Contains(attribute.City) ||
+                attribute.Tour == move.Tour2 && segmentX1.Contains(attribute.City)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMoveTabuMaker", "Declares a given two opt star move as tabu.")]
+  [StorableClass]
+  public class PotvinTwoOptStarMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinTwoOptStarMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntValue> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["TabuTenure"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+
+    public ILookupParameter<PotvinTwoOptStarMove> TwoOptStarMoveParameter {
+      get { return (ILookupParameter<PotvinTwoOptStarMove>)Parameters["PotvinTwoOptStarMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return TwoOptStarMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinTwoOptStarMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinTwoOptStarMoveTabuMaker(PotvinTwoOptStarMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinTwoOptStarMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+
+      Parameters.Add(new LookupParameter<PotvinTwoOptStarMove>("PotvinTwoOptStarMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMoveTabuMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      int tabuTenure = TabuTenureParameter.ActualValue.Value;
+
+      int overlength = tabuList.Count - tabuTenure;
+      if (overlength >= 0) {
+        for (int i = 0; i < tabuTenure - 1; i++)
+          tabuList[i] = tabuList[i + overlength + 1];
+        while (tabuList.Count >= tabuTenure)
+          tabuList.RemoveAt(tabuList.Count - 1);
+      }
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      PotvinTwoOptStarMove move = TwoOptStarMoveParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      double quality = QualityParameter.ActualValue.Value;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      List<int> segmentX1;
+      List<int> segmentX2;
+      PotvinTwoOptStarMoveMaker.GetSegments(move, out segmentX1, out segmentX2);
+
+      foreach (int city in segmentX1) {
+        tabuList.Add(new PotvinTwoOptStarMoveAttribute(baseQuality, move.Tour1, city, distance, overload, tardiness));
+      }
+
+      foreach (int city in segmentX2) {
+        tabuList.Add(new PotvinTwoOptStarMoveAttribute(baseQuality, move.Tour2, city, distance, overload, tardiness));
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarMultiMoveGenerator", "Generates two opt star moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinTwoOptStarMultiMoveGenerator : PotvinTwoOptStarMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinTwoOptStarMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinTwoOptStarMultiMoveGenerator(PotvinTwoOptStarMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinTwoOptStarMove> result = new List<PotvinTwoOptStarMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        result.Add(PotvinTwoOptStarSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue));
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinTwoOptStarSingleMoveGenerator", "Generates a single two opt star move from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinTwoOptStarSingleMoveGenerator : PotvinTwoOptStarMoveGenerator,
+    ISingleMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["PotvinTwoOptStarMove"]; }
+    }
+
+    #endregion
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinTwoOptStarSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinTwoOptStarSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinTwoOptStarSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinTwoOptStarSingleMoveGenerator(PotvinTwoOptStarSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinTwoOptStarMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      int route1Idx = rand.Next(individual.Tours.Count);
+      int route2Idx = rand.Next(individual.Tours.Count - 1);
+      if (route2Idx >= route1Idx)
+        route2Idx++;
+
+      Tour route1 = individual.Tours[route1Idx];
+      Tour route2 = individual.Tours[route2Idx];
+
+      int x1 = rand.Next(route1.Stops.Count + 1);
+      int x2 = rand.Next(route2.Stops.Count + 1);
+
+      return new PotvinTwoOptStarMove(route1Idx, x1, route2Idx, x2, individual);
+    }
+
+    protected override PotvinTwoOptStarMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinTwoOptStarMove> result = new List<PotvinTwoOptStarMove>();
+
+      PotvinTwoOptStarMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/IPotvinVehicleAssignmentMoveOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  public interface IPotvinVehicleAssignmentMoveOperator : IVRPMoveOperator {
+    ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentExhaustiveMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentExhaustiveMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentExhaustiveMoveGenerator : PotvinVehicleAssignmentMoveGenerator, IExhaustiveMoveGenerator {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentExhaustiveMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentExhaustiveMoveGenerator()
+      : base() {
+    }
+
+    private PotvinVehicleAssignmentExhaustiveMoveGenerator(PotvinVehicleAssignmentExhaustiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      for (int i = 0; i < individual.Tours.Count; i++) {
+        for (int j = i + 1; j < problemInstance.Vehicles.Value; j++) {
+          result.Add(new PotvinVehicleAssignmentMove(i, j, individual));
+        }
+
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMove.cs	(revision 15895)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMove", "Item that describes a relocation move on a VRP representation.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMove : Item, IVRPMove {
+    [Storable]
+    public IVRPEncoding Individual { get; protected set; }
+
+    [Storable]
+    public int Tour1 { get; protected set; }
+
+    [Storable]
+    public int Tour2 { get; protected set; }
+
+
+    public PotvinVehicleAssignmentMove()
+      : base() {
+      Tour1 = -1;
+      Tour2 = -1;
+
+      Individual = null;
+    }
+
+    public PotvinVehicleAssignmentMove(int tour1, int tour2, PotvinEncoding individual) {
+      Tour1 = tour1;
+      Tour2 = tour2;
+
+      this.Individual = individual.Clone() as PotvinEncoding;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMove(this, cloner);
+    }
+
+    protected PotvinVehicleAssignmentMove(PotvinVehicleAssignmentMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour1 = original.Tour1;
+      this.Tour2 = original.Tour2;
+
+      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMove(bool deserializing) : base(deserializing) { }
+
+    #region IVRPMove Members
+
+    public VRPMoveEvaluator GetMoveEvaluator() {
+      return new PotvinVehicleAssignmentMoveEvaluator();
+    }
+
+    public VRPMoveMaker GetMoveMaker() {
+      return new PotvinVehicleAssignmentMoveMaker();
+    }
+
+    public ITabuMaker GetTabuMaker() {
+      return new PotvinVehicleAssignmentMoveTabuMaker();
+    }
+
+    public ITabuChecker GetTabuChecker() {
+      return new PotvinVehicleAssignmentMoveTabuCriterion();
+    }
+
+    public ITabuChecker GetSoftTabuChecker() {
+      PotvinVehicleAssignmentMoveTabuCriterion tabuChecker = new PotvinVehicleAssignmentMoveTabuCriterion();
+      tabuChecker.UseAspirationCriterion.Value = true;
+
+      return tabuChecker;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveAttribute.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveAttribute", "vehicle assignment move attribute")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveAttribute : VRPMoveAttribute {
+    [Storable]
+    public int Tour { get; private set; }
+    [Storable]
+    public int Vehicle { get; private set; }
+
+    [Storable]
+    public double Distance { get; private set; }
+    [Storable]
+    public double Overload { get; private set; }
+    [Storable]
+    public double Tardiness { get; private set; }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveAttribute(PotvinVehicleAssignmentMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Tour = original.Tour;
+      this.Vehicle = original.Vehicle;
+      this.Distance = original.Distance;
+      this.Overload = original.Overload;
+      this.Tardiness = original.Tardiness;
+    }
+    public PotvinVehicleAssignmentMoveAttribute(double moveQuality, int tour, int vehicle,
+      double distance, double overload, double tardiness)
+      : base(moveQuality) {
+      Tour = tour;
+      Vehicle = vehicle;
+      Distance = distance;
+      Overload = overload;
+      Tardiness = tardiness;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveAttribute(this, cloner);
+    }
+
+    public override int GetHashCode() {
+      return Tour.GetHashCode() + Vehicle.GetHashCode();
+    }
+
+    public override bool Equals(object obj) {
+      if (obj is PotvinVehicleAssignmentMoveAttribute) {
+        PotvinVehicleAssignmentMoveAttribute other = obj as PotvinVehicleAssignmentMoveAttribute;
+
+        return Tour == other.Tour && Vehicle == other.Vehicle;
+      } else {
+        return base.Equals(obj);
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveEvaluator.cs	(revision 15895)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveEvaluator", "Evaluates a vehicle assignment move for a VRP representation. ")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMoveEvaluator : PotvinMoveEvaluator, IPotvinVehicleAssignmentMoveOperator {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMoveEvaluator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The move that should be evaluated."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveEvaluator(this, cloner);
+    }
+
+    private PotvinVehicleAssignmentMoveEvaluator(PotvinVehicleAssignmentMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void EvaluateMove() {
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = VehicleAssignmentMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;
+      PotvinVehicleAssignmentMoveMaker.Apply(newSolution, move, ProblemInstance);
+
+      UpdateEvaluation(newSolution);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public abstract class PotvinVehicleAssignmentMoveGenerator : PotvinMoveGenerator, IPotvinVehicleAssignmentMoveOperator {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    protected PotvinVehicleAssignmentMoveGenerator(PotvinVehicleAssignmentMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance);
+
+    public override IOperation InstrumentedApply() {
+      IOperation next = base.InstrumentedApply();
+
+      PotvinEncoding individual = VRPToursParameter.ActualValue as PotvinEncoding;
+      PotvinVehicleAssignmentMove[] moves = GenerateMoves(individual, ProblemInstance);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(VehicleAssignmentMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+
+      return next;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveMaker.cs	(revision 15895)
@@ -0,0 +1,86 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveMaker", "Peforms the vehicle assignment move on a given VRP encoding and updates the quality.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveMaker : PotvinMoveMaker, IPotvinVehicleAssignmentMoveOperator, IMoveMaker {
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
+    }
+
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveMaker(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveMaker(this, cloner);
+    }
+
+    protected PotvinVehicleAssignmentMoveMaker(PotvinVehicleAssignmentMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static void Apply(PotvinEncoding solution, PotvinVehicleAssignmentMove move, IVRPProblemInstance problemInstance) {
+      int vehicle1 = solution.VehicleAssignment[move.Tour1];
+      int vehicle2 = solution.VehicleAssignment[move.Tour2];
+
+      solution.VehicleAssignment[move.Tour1] = vehicle2;
+      solution.VehicleAssignment[move.Tour2] = vehicle1;
+    }
+
+    protected override void PerformMove() {
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;
+      Apply(newSolution, move, ProblemInstance);
+      newSolution.Repair();
+      VRPToursParameter.ActualValue = newSolution;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuCriterion.cs	(revision 15895)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveTabuCriterion", @"Checks if a certain vehicle assignment move is tabu.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveTabuCriterion : SingleSuccessorOperator, IPotvinVehicleAssignmentMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveDistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveOverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveTardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveTabuCriterion(PotvinVehicleAssignmentMoveTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public PotvinVehicleAssignmentMoveTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+
+      foreach (IItem tabuMove in tabuList) {
+        PotvinVehicleAssignmentMoveAttribute attribute = tabuMove as PotvinVehicleAssignmentMoveAttribute;
+
+        if (attribute != null) {
+          double distance = 0;
+          if (MoveDistanceParameter.ActualValue != null)
+            distance = MoveDistanceParameter.ActualValue.Value;
+
+          double overload = 0;
+          if (MoveOverloadParameter.ActualValue != null)
+            overload = MoveOverloadParameter.ActualValue.Value;
+
+          double tardiness = 0;
+          if (MoveTardinessParameter.ActualValue != null)
+            tardiness = MoveTardinessParameter.ActualValue.Value;
+
+          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+          double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+          if (cvrp != null)
+            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+          if (vrptw != null)
+            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+          if (!useAspiration || moveQuality >= quality) {
+            if (attribute.Tour == move.Tour1 && attribute.Vehicle == move.Individual.GetVehicleAssignment(move.Tour2)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Tour == move.Tour2 && attribute.Vehicle == move.Individual.GetVehicleAssignment(move.Tour1)) {
+              isTabu = true;
+              break;
+            }
+
+            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
+              isTabu = true;
+              break;
+            }
+          }
+        }
+      }
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 15895)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMoveTabuMaker", "Declares a given vehicle assignment move as tabu.")]
+  [StorableClass]
+  public class PotvinVehicleAssignmentMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinVehicleAssignmentMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
+    public LookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ValueLookupParameter<IntValue> TabuTenureParameter {
+      get { return (ValueLookupParameter<IntValue>)Parameters["TabuTenure"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+
+    public ILookupParameter<PotvinVehicleAssignmentMove> VehicleAssignmentMoveParameter {
+      get { return (ILookupParameter<PotvinVehicleAssignmentMove>)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+    public ILookupParameter VRPMoveParameter {
+      get { return VehicleAssignmentMoveParameter; }
+    }
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    [StorableConstructor]
+    protected PotvinVehicleAssignmentMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected PotvinVehicleAssignmentMoveTabuMaker(PotvinVehicleAssignmentMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public PotvinVehicleAssignmentMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list where move attributes are stored."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The tenure of the tabu list."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+
+      Parameters.Add(new LookupParameter<PotvinVehicleAssignmentMove>("PotvinVehicleAssignmentMove", "The moves that should be made."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload of the individual"));
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness of the individual"));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMoveTabuMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      int tabuTenure = TabuTenureParameter.ActualValue.Value;
+
+      int overlength = tabuList.Count - tabuTenure;
+      if (overlength >= 0) {
+        for (int i = 0; i < tabuTenure - 1; i++)
+          tabuList[i] = tabuList[i + overlength + 1];
+        while (tabuList.Count >= tabuTenure)
+          tabuList.RemoveAt(tabuList.Count - 1);
+      }
+
+      PotvinVehicleAssignmentMove move = VehicleAssignmentMoveParameter.ActualValue;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      double quality = QualityParameter.ActualValue.Value;
+      double baseQuality = moveQuality;
+      if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
+
+      double distance = 0;
+      if (DistanceParameter.ActualValue != null)
+        distance = DistanceParameter.ActualValue.Value;
+
+      double overload = 0;
+      if (OverloadParameter.ActualValue != null)
+        overload = OverloadParameter.ActualValue.Value;
+
+      double tardiness = 0;
+      if (TardinessParameter.ActualValue != null)
+        tardiness = TardinessParameter.ActualValue.Value;
+
+      tabuList.Add(new PotvinVehicleAssignmentMoveAttribute(baseQuality, move.Tour1, move.Individual.GetVehicleAssignment(move.Tour1),
+        distance, overload, tardiness));
+      tabuList.Add(new PotvinVehicleAssignmentMoveAttribute(baseQuality, move.Tour2, move.Individual.GetVehicleAssignment(move.Tour2),
+        distance, overload, tardiness));
+
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMultiMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentMultiMoveGenerator", "Generates vehicle assignment moves from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentMultiMoveGenerator : PotvinVehicleAssignmentMoveGenerator, IMultiMoveGenerator, IMultiVRPMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentMultiMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentMultiMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    private PotvinVehicleAssignmentMultiMoveGenerator(PotvinVehicleAssignmentMultiMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      for (int i = 0; i < SampleSizeParameter.ActualValue.Value; i++) {
+        var move = PotvinVehicleAssignmentSingleMoveGenerator.Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+        if (move != null)
+          result.Add(move);
+      }
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentSingleMoveGenerator.cs	(revision 15895)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinVehicleAssignmentSingleMoveGenerator", "Generates a single vehicle assignment move from a given VRP encoding.")]
+  [StorableClass]
+  public sealed class PotvinVehicleAssignmentSingleMoveGenerator : PotvinVehicleAssignmentMoveGenerator,
+    ISingleMoveGenerator {
+    #region IMultiVRPMoveOperator Members
+
+    public override ILookupParameter VRPMoveParameter {
+      get { return (ILookupParameter)Parameters["PotvinVehicleAssignmentMove"]; }
+    }
+
+    #endregion
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinVehicleAssignmentSingleMoveGenerator(this, cloner);
+    }
+
+    [StorableConstructor]
+    private PotvinVehicleAssignmentSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+
+    public PotvinVehicleAssignmentSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    private PotvinVehicleAssignmentSingleMoveGenerator(PotvinVehicleAssignmentSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PotvinVehicleAssignmentMove Apply(PotvinEncoding individual, IVRPProblemInstance problemInstance, IRandom rand) {
+      if (individual.Tours.Count > 1) {
+        int tour1 = rand.Next(individual.Tours.Count);
+        int tour2 = rand.Next(problemInstance.Vehicles.Value);
+
+        while (tour2 == tour1)
+          tour2 = rand.Next(problemInstance.Vehicles.Value);
+
+        return new PotvinVehicleAssignmentMove(tour1, tour2, individual);
+      } else {
+        return null;
+      }
+    }
+
+    protected override PotvinVehicleAssignmentMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
+      List<PotvinVehicleAssignmentMove> result = new List<PotvinVehicleAssignmentMove>();
+
+      PotvinVehicleAssignmentMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);
+      if (move != null)
+        result.Add(move);
+
+      return result.ToArray();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 15895)
@@ -0,0 +1,246 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
+  [Item("PotvinEncoding", "Represents a potvin encoding of VRP solutions. It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
+  [StorableClass]
+  public class PotvinEncoding : TourEncoding {
+    [Storable]
+    public List<int> Unrouted { get; set; }
+
+    // VehicleAssignment[tour] retreives the assigned vehicle for the given tour
+    [Storable]
+    public Permutation VehicleAssignment { get; private set; }
+
+    public PotvinEncoding(IVRPProblemInstance instance)
+      : base(instance) {
+      Unrouted = new List<int>();
+      VehicleAssignment = new Permutation(PermutationTypes.Absolute, instance.Vehicles.Value);
+    }
+
+    [StorableConstructor]
+    protected PotvinEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PotvinEncoding(this, cloner);
+    }
+
+    protected PotvinEncoding(PotvinEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.Unrouted = new List<int>(original.Unrouted);
+      this.VehicleAssignment = cloner.Clone<Permutation>(original.VehicleAssignment);
+    }
+
+    public override void Repair() {
+      List<Tour> toBeRemoved = new List<Tour>();
+      foreach (Tour tour in Tours) {
+        if (tour.Stops.Count == 0)
+          toBeRemoved.Add(tour);
+      }
+
+      foreach (Tour tour in toBeRemoved) {
+        int index = Tours.IndexOf(tour);
+        Tours.Remove(tour);
+        if (index < VehicleAssignment.Length) {
+          int vehicle = VehicleAssignment[index];
+          int max = System.Math.Min(VehicleAssignment.Length - 1, Tours.Count);
+
+          for (int i = index; i < max; i++) {
+            VehicleAssignment[i] = VehicleAssignment[i + 1];
+          }
+          VehicleAssignment[max] = vehicle;
+        }
+      }
+
+      while (Tours.Count > ProblemInstance.Vehicles.Value) {
+        Tour tour = Tours[Tours.Count - 1];
+        Tours[Tours.Count - 2].Stops.AddRange(tour.Stops);
+
+        Tours.Remove(tour);
+      }
+    }
+
+    public override int GetVehicleAssignment(int tour) {
+      return VehicleAssignment[tour];
+    }
+
+    public static PotvinEncoding ConvertFrom(IVRPEncoding encoding, IVRPProblemInstance instance) {
+      PotvinEncoding solution = new PotvinEncoding(instance);
+
+      TourEncoding.ConvertFrom(encoding, solution, instance);
+
+      List<int> vehicles = new List<int>();
+      for (int i = 0; i < instance.Vehicles.Value; i++)
+        vehicles.Add(i);
+
+      int[] assignment = new int[instance.Vehicles.Value];
+      for (int i = 0; i < assignment.Length; i++)
+        assignment[i] = -1;
+
+      for (int i = 0; i < solution.Tours.Count; i++) {
+        int vehicle = encoding.GetVehicleAssignment(i);
+        assignment[i] = vehicle;
+        vehicles.Remove(vehicle);
+      }
+
+      for (int i = 0; i < instance.Vehicles.Value; i++) {
+        if (assignment[i] == -1) {
+          int vehicle = vehicles[0];
+          assignment[i] = vehicle;
+          vehicles.RemoveAt(0);
+        }
+      }
+
+      solution.VehicleAssignment = new Permutation(PermutationTypes.Absolute, assignment);
+
+      return solution;
+    }
+
+    public static PotvinEncoding ConvertFrom(List<int> route, IVRPProblemInstance instance) {
+      PotvinEncoding solution = new PotvinEncoding(instance);
+
+      solution.Tours = new ItemList<Tour>();
+
+      Tour tour = new Tour();
+      int routeIdx = 0;
+      for (int i = 0; i < route.Count; i++) {
+        if (route[i] <= 0) {
+          if (tour.Stops.Count > 0) {
+            solution.Tours.Add(tour);
+            tour = new Tour();
+          }
+          int vehicle = -route[i];
+          solution.VehicleAssignment[routeIdx] = vehicle;
+          routeIdx++;
+        } else {
+          tour.Stops.Add(route[i]);
+        }
+      }
+
+      solution.Repair();
+
+      return solution;
+    }
+
+    public double GetTourLength(Tour tour) {
+      return tour.GetTourLength(ProblemInstance, this);
+    }
+
+    public int FindBestInsertionPlace(Tour tour, int city, int positionToAvoid = -1) {
+      if (tour.Stops.Count == 0)
+        return 0;
+
+      int place = -1;
+      double minQuality = -1;
+
+      VRPEvaluation eval = ProblemInstance.EvaluateTour(tour, this);
+
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        if (positionToAvoid != i) {
+          bool feasible;
+          double quality = ProblemInstance.GetInsertionCosts(eval, this, city, 0, i, out feasible);
+          if (place < 0 || quality < minQuality) {
+            place = i;
+            minQuality = quality;
+          }
+        }
+      }
+
+      if (place == -1)
+        place = 0;
+
+      return place;
+    }
+
+    public void InsertPair(Tour tour, int source, int target, IVRPProblemInstance problemInstance, int positionToAvoid = -1, int positionToAvoid2 = -1) {
+      int stops = tour.Stops.Count;
+      VRPEvaluation eval = problemInstance.EvaluateTour(tour, this);
+      double minCosts = double.MaxValue;
+      int sourceLocation = -1;
+      int targetLocation = -1;
+
+      for (int i = 0; i <= stops; i++) {
+        tour.Stops.Insert(i, source);
+        VRPEvaluation tourEval = problemInstance.EvaluateTour(tour, this);
+        double sourceCosts = tourEval.Quality - eval.Quality;
+
+        for (int j = i + 1; j <= stops + 1; j++) {
+          if (positionToAvoid != i || positionToAvoid2 != j || stops == 0) {
+            bool feasible;
+            double targetCosts = problemInstance.GetInsertionCosts(tourEval, this, target, 0, j, out feasible);
+
+            double costs = sourceCosts + targetCosts;
+            if (costs < minCosts) {
+              minCosts = costs;
+              sourceLocation = i;
+              targetLocation = j;
+            }
+          }
+        }
+        tour.Stops.Remove(source);
+      }
+
+      tour.Stops.Insert(sourceLocation, source);
+      tour.Stops.Insert(targetLocation, target);
+    }
+
+    public bool FindInsertionPlace(int city, int routeToAvoid, bool allowInfeasible, out int route, out int place) {
+      route = -1;
+      place = -1;
+      double minDetour = double.MaxValue;
+
+      VRPEvaluation eval = ProblemInstance.Evaluate(this);
+      bool originalFeasible = ProblemInstance.Feasible(eval);
+
+      for (int tour = 0; tour < Tours.Count; tour++) {
+        if (tour != routeToAvoid) {
+          double length = eval.Quality;
+
+          for (int i = 0; i <= Tours[tour].Stops.Count; i++) {
+            bool feasible;
+            double detour = ProblemInstance.GetInsertionCosts(eval, this, city, tour, i, out feasible);
+
+            if (feasible || allowInfeasible) {
+              if (route < 0 || detour < minDetour) {
+                route = tour;
+                place = i;
+                minDetour = detour;
+              }
+            }
+          }
+        }
+      }
+
+      return route >= 0 && place >= 0;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsCrossover.cs	(revision 15895)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsCrossover", "An operator which crosses two VRP representations.")]
+  [StorableClass]
+  public abstract class PrinsCrossover : VRPCrossover, IStochasticOperator, IPrinsOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected PrinsCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected PrinsCrossover(PrinsCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2);
+
+    public override IOperation InstrumentedApply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is PrinsEncoding)) {
+          parents[i] = PrinsEncoding.ConvertFrom(solution, ProblemInstance);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue =
+        Crossover(RandomParameter.ActualValue, parents[0] as PrinsEncoding, parents[1] as PrinsEncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Crossovers/PrinsPermutationCrossover.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsPermutationCrossover : PrinsCrossover, IPrinsOperator {
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new OrderCrossover()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsPermutationCrossover(this, cloner);
+    }
+
+    private PrinsPermutationCrossover(PrinsPermutationCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override PrinsEncoding Crossover(IRandom random, PrinsEncoding parent1, PrinsEncoding parent2) {
+      if (parent1.Length != parent2.Length)
+        return parent1.Clone() as PrinsEncoding;
+
+      //note - the inner crossover is called here and the result is converted to a prins representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new PrinsEncoding(permutation, ProblemInstance);
+      } else
+        return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/IPrinsOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/IPrinsOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/IPrinsOperator.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  public interface IPrinsOperator :
+    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsExhaustiveLSManipulator.cs	(revision 15895)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsExhaustiveLSManipulator", "An operator which manipulates a VRP representation by using the exhaustive Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsExhaustiveLSManipulator : PrinsLSManipulator {
+    [StorableConstructor]
+    private PrinsExhaustiveLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsExhaustiveLSManipulator()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsExhaustiveLSManipulator(this, cloner);
+    }
+
+    private PrinsExhaustiveLSManipulator(PrinsExhaustiveLSManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      List<Tour> tours = individual.GetTours();
+      bool improvement = false;
+      int iterations = 0;
+
+      do {
+        int u = depot;
+        improvement = false;
+        double originalQuality = GetQuality(individual);
+        PrinsEncoding child = null;
+
+        while (!improvement && u < ProblemInstance.Cities.Value) {
+          int v = depot;
+          while (!improvement && v < ProblemInstance.Cities.Value) {
+            if (u != v) {
+              child = Manipulate(individual,
+                originalQuality, u, v);
+
+              improvement = child != null;
+            }
+            v++;
+          }
+          u++;
+        }
+
+        if (improvement) {
+          for (int i = 0; i < child.Length; i++) {
+            individual[i] = child[i];
+          }
+        }
+
+        iterations++;
+      } while (improvement &&
+        iterations < Iterations.Value.Value);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsLSManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsLSManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsLSManipulator.cs	(revision 15895)
@@ -0,0 +1,459 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsLSManipulator", "An operator which manipulates a VRP representation by using the Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public abstract class PrinsLSManipulator : PrinsManipulator, IVRPLocalSearchManipulator {
+    public IValueParameter<IntValue> Iterations {
+      get { return (IValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+
+    [StorableConstructor]
+    protected PrinsLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsLSManipulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Iterations", "The number of max iterations.", new IntValue(5)));
+    }
+
+    protected PrinsLSManipulator(PrinsLSManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected double GetQuality(PrinsEncoding individual) {
+      return ProblemInstance.Evaluate(individual).Quality;
+    }
+
+    private int FindCity(PrinsEncoding individual, int city) {
+      int index = -1;
+
+      int i = 0;
+      while (i < individual.Length && index == -1) {
+        if (individual[i] == city)
+          index = i;
+
+        i++;
+      }
+
+      return index;
+    }
+
+    protected const int depot = -1;
+
+    private Tour FindTour(PrinsEncoding individual, int city) {
+      Tour found = null;
+
+      List<Tour> tours = individual.GetTours();
+      int i = 0;
+
+      while (found == null && i < tours.Count) {
+        if (tours[i].Stops.Contains(city))
+          found = tours[i];
+
+        i++;
+      }
+
+      return found;
+    }
+
+    //inserts u after v in the child
+    private void InsertAfter(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] != u) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts (u, x) after v in the child
+    private void InsertAfter(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] != u && parent[pi] != x) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+
+          child[ci] = x;
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts u before v in the child
+    private void InsertBefore(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+        }
+        if (parent[pi] != u) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //inserts (u, x) before v in the child
+    private void InsertBefore(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int pi = 0;
+      int ci = 0;
+
+      while (ci != child.Length) {
+        if (parent[pi] == v) {
+          child[ci] = u;
+          ci++;
+
+          child[ci] = x;
+          ci++;
+        }
+        if (parent[pi] != u && parent[pi] != x) {
+          child[ci] = parent[pi];
+          ci++;
+        }
+
+        pi++;
+      }
+    }
+
+    //swaps u and v
+    private void Swap(int u, int v, PrinsEncoding parent, PrinsEncoding child) {
+      for (int i = 0; i < child.Length; i++) {
+        if (parent[i] == u)
+          child[i] = v;
+        else if (parent[i] == v)
+          child[i] = u;
+        else
+          child[i] = parent[i];
+      }
+    }
+
+    //swaps (u, x) and v
+    private void Swap(int u, int x, int v, PrinsEncoding parent, PrinsEncoding child) {
+      int childIndex = 0;
+      int parentIndex = 0;
+
+      while (childIndex < child.Length) {
+        if (parent[parentIndex] == u) {
+          child[childIndex] = v;
+          parentIndex++;
+        } else if (parent[parentIndex] == v) {
+          child[childIndex] = u;
+          childIndex++;
+          child[childIndex] = x;
+        } else {
+          child[childIndex] = parent[parentIndex];
+        }
+
+        childIndex++;
+        parentIndex++;
+      }
+    }
+
+    //swaps (u, x) and (v, y)
+    private void Swap(int u, int x, int v, int y, PrinsEncoding parent, PrinsEncoding child) {
+      int i = 0;
+
+      while (i < child.Length) {
+        if (child[i] == u) {
+          child[i] = v;
+          i++;
+          child[i] = y;
+        } else if (child[i] == v) {
+          child[i] = u;
+          i++;
+          child[i] = x;
+        } else {
+          child[i] = parent[i];
+        }
+
+        i++;
+      }
+    }
+
+    //swaps (u, x) and (v, y) by (u, y) and (x, v)
+    private void Swap2(int u, int x, int v, int y, PrinsEncoding parent, PrinsEncoding child) {
+      int i = 0;
+
+      while (i < child.Length) {
+        if (parent[i] == x) {
+          child[i] = y;
+        } else if (parent[i] == v) {
+          child[i] = x;
+        } else if (parent[i] == y) {
+          child[i] = v;
+        } else {
+          child[i] = parent[i];
+        }
+
+        i++;
+      }
+    }
+
+    private void M1(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        if (v == depot) {
+          Tour tour = FindTour(child, u + 1);
+          v = tour.Stops[0] - 1;
+          InsertBefore(u, v, parent, child);
+        } else {
+          InsertAfter(u, v, parent, child);
+        }
+      }
+    }
+
+    private void M2(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Stops.IndexOf(u + 1);
+        if (iu < tour.Stops.Count - 1) {
+          int x = tour.Stops[iu + 1] - 1;
+
+          if (v == depot) {
+            tour = FindTour(child, u + 1);
+            v = tour.Stops[0] - 1;
+            InsertBefore(u, x, v, parent, child);
+          } else {
+            InsertAfter(u, x, v, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M3(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Stops.IndexOf(u + 1);
+        if (iu < tour.Stops.Count - 1) {
+          int x = tour.Stops[iu + 1] - 1;
+
+          if (v == depot) {
+            tour = FindTour(child, u + 1);
+            v = tour.Stops[0] - 1;
+            InsertBefore(x, u, v, parent, child);
+          } else {
+            InsertAfter(x, u, v, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M4(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Swap(u, v, parent, child);
+      }
+    }
+
+    private void M5(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Stops.IndexOf(u + 1);
+        if (iu < tour.Stops.Count - 1) {
+          int x = tour.Stops[iu + 1] - 1;
+
+          if (x != v)
+            Swap(u, x, v, parent, child);
+        }
+      }
+    }
+
+    private void M6(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tour = FindTour(child, u + 1);
+        int iu = tour.Stops.IndexOf(u + 1);
+        if (iu < tour.Stops.Count - 1) {
+          int x = tour.Stops[iu + 1] - 1;
+
+          tour = FindTour(child, v + 1);
+          int iv = tour.Stops.IndexOf(v + 1);
+          if (iv < tour.Stops.Count - 1) {
+            int y = tour.Stops[iv + 1] - 1;
+
+            if (x != v && y != u)
+              Swap(u, x, v, y, parent, child);
+          }
+        }
+      }
+    }
+
+    private void M7(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Stops[0] == tv.Stops[0]) {
+          int iu = tu.Stops.IndexOf(u + 1);
+          if (iu < tu.Stops.Count - 1) {
+            int x = tu.Stops[iu + 1] - 1;
+
+            int iv = tv.Stops.IndexOf(v + 1);
+            if (iv < tv.Stops.Count - 1) {
+              int y = tv.Stops[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap(x, v, parent, child);
+            }
+          }
+        }
+      }
+    }
+
+    private void M8(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Stops[0] != tv.Stops[0]) {
+          int iu = tu.Stops.IndexOf(u + 1);
+          if (iu < tu.Stops.Count - 1) {
+            int x = tu.Stops[iu + 1] - 1;
+
+            int iv = tv.Stops.IndexOf(v + 1);
+            if (iv < tv.Stops.Count - 1) {
+              int y = tv.Stops[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap(x, v, parent, child);
+            }
+          }
+        }
+      }
+    }
+
+    private void M9(PrinsEncoding parent, PrinsEncoding child, int u, int v) {
+      if (u != depot && v != depot) {
+        Tour tu = FindTour(child, u + 1);
+        Tour tv = FindTour(child, v + 1);
+
+        if (tu.Stops[0] != tv.Stops[0]) {
+          int iu = tu.Stops.IndexOf(u + 1);
+          if (iu < tu.Stops.Count - 1) {
+            int x = tu.Stops[iu + 1] - 1;
+
+            int iv = tv.Stops.IndexOf(v + 1);
+            if (iv < tv.Stops.Count - 1) {
+              int y = tv.Stops[iv + 1] - 1;
+
+              if (x != v && y != u)
+                Swap2(u, x, v, y, parent, child);
+            }
+          }
+        }
+      }
+    }
+
+    protected PrinsEncoding Manipulate(PrinsEncoding individual,
+      double originalQuality, int u, int v) {
+      PrinsEncoding child = null;
+      bool improvement = false;
+
+      if (u != v) {
+        child = individual.Clone() as PrinsEncoding;
+        M1(individual, child, u, v);
+        improvement = GetQuality(child) < originalQuality;
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M2(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M3(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M4(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M5(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M6(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M7(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M8(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+
+        if (!improvement) {
+          child = individual.Clone() as PrinsEncoding;
+          M9(individual, child, u, v);
+          improvement = GetQuality(child) < originalQuality;
+        }
+      }
+
+      if (improvement)
+        return child;
+      else
+        return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsManipulator.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsManipulator", "An operator which manipulates a VRP representation.")]
+  [StorableClass]
+  public abstract class PrinsManipulator : VRPManipulator, IStochasticOperator, IPrinsOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected PrinsManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected PrinsManipulator(PrinsManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void Manipulate(IRandom random, PrinsEncoding individual);
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is PrinsEncoding)) {
+        VRPToursParameter.ActualValue = PrinsEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as PrinsEncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsPermutationManipulator.cs	(revision 15895)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsPermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator. It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsPermutationManipulator : PrinsManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationManipulator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsPermutationManipulator(this, cloner);
+    }
+
+    private PrinsPermutationManipulator(PrinsPermutationManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/Manipulators/PrinsStochasticLSManipulator.cs	(revision 15895)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsStochasticLSManipulator", "An operator which manipulates a VRP representation by using the stochastic version of the Prins local search.  It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public sealed class PrinsStochasticLSManipulator : PrinsLSManipulator {
+    public IValueParameter<IntValue> SampleSize {
+      get { return (IValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsStochasticLSManipulator(bool deserializing) : base(deserializing) { }
+
+    public PrinsStochasticLSManipulator()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "The sample size.", new IntValue(200)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsStochasticLSManipulator(this, cloner);
+    }
+
+    private PrinsStochasticLSManipulator(PrinsStochasticLSManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, PrinsEncoding individual) {
+      List<Tour> tours = individual.GetTours();
+      bool improvement = false;
+      int iterations = 0;
+
+      do {
+        improvement = false;
+        double originalQuality = GetQuality(individual);
+        PrinsEncoding child = null;
+
+        int samples = 0;
+        while (!improvement &&
+          samples < SampleSize.Value.Value) {
+          int u = random.Next(ProblemInstance.Cities.Value);
+          int v = random.Next(ProblemInstance.Cities.Value);
+
+          child = Manipulate(individual,
+                originalQuality, u, v);
+
+          improvement = child != null;
+
+          samples++;
+        }
+
+        if (improvement) {
+          for (int i = 0; i < child.Length; i++) {
+            individual[i] = child[i];
+          }
+        }
+
+        iterations++;
+      } while (improvement &&
+        iterations < Iterations.Value.Value);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs	(revision 15895)
@@ -0,0 +1,178 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Prins {
+  [Item("PrinsEncoding", "Represents an Prins encoding of VRP solutions. It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
+  [StorableClass]
+  public class PrinsEncoding : General.PermutationEncoding {
+    #region IVRPEncoding Members
+    public override int GetTourIndex(Tour tour) {
+      return 0;
+    }
+
+    public override List<Tour> GetTours() {
+      List<Tour> result = new List<Tour>();
+
+      int cities = ProblemInstance.Cities.Value;
+
+      //Split permutation into vector P
+      int[] P = new int[cities + 1];
+      for (int i = 0; i <= cities; i++)
+        P[i] = -1;
+
+      double[] V = new double[cities + 1];
+      V[0] = 0;
+      for (int i = 1; i <= cities; i++) {
+        V[i] = double.MaxValue;
+      }
+
+      for (int i = 1; i <= cities; i++) {
+        int j = i;
+        Tour tour = new Tour();
+        bool feasible = true;
+
+        do {
+          tour.Stops.Add(this[j - 1] + 1);
+
+          VRPEvaluation eval =
+            ProblemInstance.EvaluateTour(tour, this);
+
+          double cost = eval.Quality;
+          feasible = ProblemInstance.Feasible(eval);
+
+          if (feasible || j == i) {
+            if (V[i - 1] + cost < V[j]) {
+              V[j] = V[i - 1] + cost;
+              P[j] = i - 1;
+            }
+            j++;
+          }
+
+        } while (j <= cities && feasible);
+      }
+
+      //extract VRP solution from vector P
+      int index = 0;
+      int index2 = cities;
+      Tour trip = null;
+      do {
+        index = P[index2];
+        trip = new Tour();
+
+        for (int k = index + 1; k <= index2; k++) {
+          trip.Stops.Add(this[k - 1] + 1);
+        }
+
+        if (trip.Stops.Count > 0)
+          result.Add(trip);
+
+        index2 = index;
+      } while (index != 0);
+
+      //if there are too many vehicles - repair
+      while (result.Count > ProblemInstance.Vehicles.Value) {
+        Tour tour = result[result.Count - 1];
+
+        //find predecessor / successor in permutation
+        int predecessorIndex = Array.IndexOf(this.array, tour.Stops[0] - 1) - 1;
+        if (predecessorIndex >= 0) {
+          int predecessor = this[predecessorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Stops.IndexOf(predecessor) + 1;
+            if (insertPosition != -1) {
+              t.Stops.InsertRange(insertPosition, tour.Stops);
+              break;
+            }
+          }
+        } else {
+          int successorIndex = Array.IndexOf(this.array,
+            tour.Stops[tour.Stops.Count - 1] - 1) + 1;
+          int successor = this[successorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Stops.IndexOf(successor);
+            if (insertPosition != -1) {
+              t.Stops.InsertRange(insertPosition, tour.Stops);
+              break;
+            }
+          }
+        }
+
+        result.Remove(tour);
+      }
+
+      return result;
+    }
+    #endregion
+    public PrinsEncoding(Permutation permutation, IVRPProblemInstance problemInstance)
+      : base(permutation, problemInstance) {
+    }
+
+    [StorableConstructor]
+    protected PrinsEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsEncoding(this, cloner);
+    }
+
+    protected PrinsEncoding(PrinsEncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public static PrinsEncoding ConvertFrom(IVRPEncoding encoding, IVRPProblemInstance problemInstance) {
+      List<Tour> tours = encoding.GetTours();
+      List<int> route = new List<int>();
+
+      foreach (Tour tour in tours) {
+        foreach (int city in tour.Stops)
+          route.Add(city - 1);
+      }
+
+      return new PrinsEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), problemInstance);
+    }
+
+    public static PrinsEncoding ConvertFrom(List<int> routeParam, IVRPProblemInstance problemInstance) {
+      List<int> route = new List<int>(routeParam);
+
+      while (route.Remove(0)) { //remove all delimiters (0)
+      }
+
+      for (int i = 0; i < route.Count; i++)
+        route[i]--;
+
+      return new PrinsEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), problemInstance);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Tour.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Tour.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Tour.cs	(revision 15895)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [StorableClass]
+  public class Tour : Item {
+    [Storable]
+    public List<int> Stops { get; private set; }
+
+    public Tour() {
+      Stops = new List<int>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Tour(this, cloner);
+    }
+
+    protected Tour(Tour original, Cloner cloner)
+      : base(original, cloner) {
+      this.Stops = new List<int>(original.Stops);
+    }
+
+    [StorableConstructor]
+    protected Tour(bool deserializing) : base(deserializing) { }
+
+    public double GetTourLength(IVRPProblemInstance instance, IVRPEncoding solution) {
+      double length = 0;
+
+      if (Stops.Count > 0) {
+        List<int> cities = new List<int>();
+        cities.Add(0);
+        foreach (int city in Stops) {
+          cities.Add(city);
+        }
+        cities.Add(0);
+
+        for (int i = 1; i < cities.Count; i++) {
+          length += instance.GetDistance(cities[i - 1], cities[i], solution);
+        }
+      }
+
+      return length;
+    }
+
+    public bool IsEqual(Tour tour) {
+      bool equal = (tour != null) && (tour.Stops.Count == Stops.Count);
+      int index = 0;
+
+      while (equal && index < Stops.Count) {
+        equal = equal && tour.Stops[index] == Stops[index];
+        index++;
+      }
+
+      return equal;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/VRPOperator.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings {
+  [Item("VRPOperator", "Represents a VRP operator.")]
+  [StorableClass]
+  public abstract class VRPOperator : InstrumentedOperator, IVRPOperator {
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+
+    public IVRPProblemInstance ProblemInstance {
+      get { return ProblemInstanceParameter.ActualValue; }
+    }
+
+    [StorableConstructor]
+    protected VRPOperator(bool deserializing) : base(deserializing) { }
+
+    public VRPOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+    }
+
+    protected VRPOperator(VRPOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuCrossover", "An operator which crosses two VRP representations.")]
+  [StorableClass]
+  public abstract class ZhuCrossover : VRPCrossover, IStochasticOperator, IZhuOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected ZhuCrossover(bool deserializing) : base(deserializing) { }
+
+    public ZhuCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected ZhuCrossover(ZhuCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2);
+
+    public override IOperation InstrumentedApply() {
+      ItemArray<IVRPEncoding> parents = new ItemArray<IVRPEncoding>(ParentsParameter.ActualValue.Length);
+      for (int i = 0; i < ParentsParameter.ActualValue.Length; i++) {
+        IVRPEncoding solution = ParentsParameter.ActualValue[i];
+
+        if (!(solution is ZhuEncoding)) {
+          parents[i] = ZhuEncoding.ConvertFrom(solution, ProblemInstance);
+        } else {
+          parents[i] = solution;
+        }
+      }
+      ParentsParameter.ActualValue = parents;
+
+      ChildParameter.ActualValue =
+        Crossover(RandomParameter.ActualValue, parents[0] as ZhuEncoding, parents[1] as ZhuEncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 15895)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuHeuristicCrossover1", "The Zhu Heuristic Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuHeuristicCrossover1 : ZhuCrossover {
+    [StorableConstructor]
+    private ZhuHeuristicCrossover1(bool deserializing) : base(deserializing) { }
+
+    public ZhuHeuristicCrossover1()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuHeuristicCrossover1(this, cloner);
+    }
+
+    private ZhuHeuristicCrossover1(ZhuHeuristicCrossover1 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void Swap(ZhuEncoding individual, int city1, int city2) {
+      int index1 = individual.IndexOf(city1);
+      int index2 = individual.IndexOf(city2);
+
+      int temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      parent1 = parent1.Clone() as ZhuEncoding;
+      parent2 = parent2.Clone() as ZhuEncoding;
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      if (parent1.Length != parent2.Length)
+        return child;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+      int predecessor = breakPoint - 1;
+      if (predecessor < 0)
+        predecessor = predecessor + child.Length;
+
+      while (i != predecessor) {
+        if (i == breakPoint) {
+          child[i] = parent1[i];
+          Swap(parent2, parent2[i], parent1[i]);
+        }
+
+        if (ProblemInstance.GetDistance(
+          child[i] + 1, parent1[(i + 1) % child.Length] + 1, child)
+          <
+          ProblemInstance.GetDistance(
+          child[i] + 1, parent2[(i + 1) % child.Length] + 1, child)) {
+          child[(i + 1) % child.Length] = parent1[(i + 1) % child.Length];
+          Swap(parent2, parent2[(i + 1) % child.Length], parent1[(i + 1) % child.Length]);
+        } else {
+          child[(i + 1) % child.Length] = parent2[(i + 1) % child.Length];
+          Swap(parent1, parent1[(i + 1) % child.Length], parent2[(i + 1) % child.Length]);
+        }
+
+        i = (i + 1) % child.Length;
+      }
+
+      return child;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 15895)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuHeuristicCrossover2", "The Zhu Heuristic Crossover (Version 2). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuHeuristicCrossover2 : ZhuCrossover {
+    [StorableConstructor]
+    private ZhuHeuristicCrossover2(bool deserializing) : base(deserializing) { }
+
+    public ZhuHeuristicCrossover2()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuHeuristicCrossover2(this, cloner);
+    }
+
+    private ZhuHeuristicCrossover2(ZhuHeuristicCrossover2 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      List<int> p1 = new List<int>(parent1);
+      List<int> p2 = new List<int>(parent2);
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      if (parent1.Length != parent2.Length)
+        return child;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+      int predecessor = breakPoint - 1;
+      if (predecessor < 0)
+        predecessor = predecessor + child.Length;
+
+      int parent1Index = i;
+      int parent2Index = i;
+
+      while (i != predecessor) {
+        if (i == breakPoint) {
+          child[i] = p1[parent1Index];
+
+          p1.Remove(child[i]);
+          if (parent1Index >= p1.Count)
+            parent1Index = 0;
+
+          p2.Remove(child[i]);
+          if (parent2Index >= p2.Count)
+            parent2Index = 0;
+        }
+
+        if (ProblemInstance.GetDistance(
+         child[i] + 1, p1[parent1Index] + 1, child)
+         <
+         ProblemInstance.GetDistance(
+         child[i] + 1, p2[parent2Index] + 1, child)) {
+          child[(i + 1) % child.Length] = p1[parent1Index];
+        } else {
+          child[(i + 1) % child.Length] = p2[parent2Index];
+        }
+
+        p1.Remove(child[(i + 1) % child.Length]);
+        if (parent1Index >= p1.Count)
+          parent1Index = 0;
+
+        p2.Remove(child[(i + 1) % child.Length]);
+        if (parent2Index >= p2.Count)
+          parent2Index = 0;
+
+        i = (i + 1) % child.Length;
+      }
+
+      return child;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 15895)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuMergeCrossover1", "The Zhu Merge Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuMergeCrossover1 : ZhuCrossover {
+    [StorableConstructor]
+    private ZhuMergeCrossover1(bool deserializing) : base(deserializing) { }
+
+    public ZhuMergeCrossover1()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuMergeCrossover1(this, cloner);
+    }
+
+    private ZhuMergeCrossover1(ZhuMergeCrossover1 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void Swap(ZhuEncoding individual, int city1, int city2) {
+      int index1 = individual.IndexOf(city1);
+      int index2 = individual.IndexOf(city2);
+
+      int temp = individual[index1];
+      individual[index1] = individual[index2];
+      individual[index2] = temp;
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      parent1 = parent1.Clone() as ZhuEncoding;
+      parent2 = parent2.Clone() as ZhuEncoding;
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      if (parent1.Length != parent2.Length)
+        return child;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+
+      DoubleArray dueTime = null;
+      if (ProblemInstance is ITimeWindowedProblemInstance) {
+        dueTime = (ProblemInstance as ITimeWindowedProblemInstance).DueTime;
+      }
+
+      do {
+        if (i == breakPoint) {
+          child[i] = parent1[i];
+          Swap(parent2, parent2[i], parent1[i]);
+        } else {
+          if (
+            (dueTime != null) &&
+            (dueTime[parent1[i] + 1] <
+             dueTime[parent2[i] + 1])) {
+            child[i] = parent1[i];
+            Swap(parent2, parent2[i], parent1[i]);
+          } else {
+            child[i] = parent2[i];
+            Swap(parent1, parent1[i], parent2[i]);
+          }
+        }
+
+        i = (i + 1) % child.Length;
+      } while (i != breakPoint);
+
+      return child;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuMergeCrossover2", "The Zhu Merge Crossover (Version 2).  It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuMergeCrossover2 : ZhuCrossover {
+    [StorableConstructor]
+    private ZhuMergeCrossover2(bool deserializing) : base(deserializing) { }
+
+    public ZhuMergeCrossover2()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuMergeCrossover2(this, cloner);
+    }
+
+    private ZhuMergeCrossover2(ZhuMergeCrossover2 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      List<int> p1 = new List<int>(parent1);
+      List<int> p2 = new List<int>(parent2);
+
+      ZhuEncoding child = parent2.Clone() as ZhuEncoding;
+
+      if (parent1.Length != parent2.Length)
+        return child;
+
+      int breakPoint = random.Next(child.Length);
+      int i = breakPoint;
+
+      int parent1Index = i;
+      int parent2Index = i;
+
+      DoubleArray dueTime = null;
+      if (ProblemInstance is ITimeWindowedProblemInstance) {
+        dueTime = (ProblemInstance as ITimeWindowedProblemInstance).DueTime;
+      }
+
+      do {
+        if (i == breakPoint) {
+          child[i] = p1[parent1Index];
+        } else {
+          if (dueTime != null &&
+            (dueTime[p1[parent1Index] + 1] <
+            dueTime[p2[parent2Index] + 1])) {
+            child[i] = p1[parent1Index];
+          } else {
+            child[i] = p2[parent2Index];
+          }
+        }
+
+        p1.Remove(child[i]);
+        if (parent1Index >= p1.Count)
+          parent1Index = 0;
+
+        p2.Remove(child[i]);
+        if (parent2Index >= p2.Count)
+          parent2Index = 0;
+
+        i = (i + 1) % child.Length;
+      } while (i != breakPoint);
+
+      return child;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 15895)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class PrinsPermutationCrossover : ZhuCrossover {
+    public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
+      get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
+    }
+
+    [StorableConstructor]
+    private PrinsPermutationCrossover(bool deserializing) : base(deserializing) { }
+
+    public PrinsPermutationCrossover()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationCrossover>("InnerCrossover", "The permutation crossover.", new PartiallyMatchedCrossover()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsPermutationCrossover(this, cloner);
+    }
+
+    private PrinsPermutationCrossover(PrinsPermutationCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override ZhuEncoding Crossover(IRandom random, ZhuEncoding parent1, ZhuEncoding parent2) {
+      //note - the inner crossover is called here and the result is converted to a prins representation
+      //some refactoring should be done here in the future - the crossover operation should be called directly
+      if (parent1.Length != parent2.Length)
+        return parent1.Clone() as ZhuEncoding;
+
+      InnerCrossoverParameter.ActualValue.ParentsParameter.ActualName = ParentsParameter.ActualName;
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerCrossoverParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+
+      string childName = InnerCrossoverParameter.ActualValue.ChildParameter.ActualName;
+      if (ExecutionContext.Scope.Variables.ContainsKey(childName)) {
+        Permutation permutation = ExecutionContext.Scope.Variables[childName].Value as Permutation;
+        ExecutionContext.Scope.Variables.Remove(childName);
+
+        return new ZhuEncoding(permutation, ProblemInstance);
+      } else
+        return null;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/IZhuOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/IZhuOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/IZhuOperator.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  public interface IZhuOperator :
+    ISingleDepotOperator, IHomogenousCapacitatedOperator, ITimeWindowedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuManipulator", "An operator which manipulates a VRP representation.")]
+  [StorableClass]
+  public abstract class ZhuManipulator : VRPManipulator, IStochasticOperator, IZhuOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected ZhuManipulator(bool deserializing) : base(deserializing) { }
+
+    public ZhuManipulator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+    }
+
+    protected ZhuManipulator(ZhuManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected abstract void Manipulate(IRandom random, ZhuEncoding individual);
+
+    public override IOperation InstrumentedApply() {
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      if (!(solution is ZhuEncoding)) {
+        VRPToursParameter.ActualValue = ZhuEncoding.ConvertFrom(solution, ProblemInstance);
+      }
+
+      Manipulate(RandomParameter.ActualValue, VRPToursParameter.ActualValue as ZhuEncoding);
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 15895)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuPermutationManipulator", "An operator which manipulates a VRP representation by using a standard permutation manipulator. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public sealed class ZhuPermutationManipulator : ZhuManipulator {
+    public IValueLookupParameter<IPermutationManipulator> InnerManipulatorParameter {
+      get { return (IValueLookupParameter<IPermutationManipulator>)Parameters["InnerManipulator"]; }
+    }
+
+    [StorableConstructor]
+    private ZhuPermutationManipulator(bool deserializing) : base(deserializing) { }
+
+    public ZhuPermutationManipulator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuPermutationManipulator(this, cloner);
+    }
+
+    private ZhuPermutationManipulator(ZhuPermutationManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected override void Manipulate(IRandom random, ZhuEncoding individual) {
+      InnerManipulatorParameter.ActualValue.PermutationParameter.ActualName = VRPToursParameter.ActualName;
+
+      IAtomicOperation op = this.ExecutionContext.CreateOperation(
+        InnerManipulatorParameter.ActualValue, this.ExecutionContext.Scope);
+      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs	(revision 15895)
@@ -0,0 +1,140 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
+  [Item("ZhuEncoding", "Represents a Zhu encoding of VRP solutions. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
+  [StorableClass]
+  public class ZhuEncoding : General.PermutationEncoding {
+    #region IVRPEncoding Members
+    public override int GetTourIndex(Tour tour) {
+      return 0;
+    }
+
+    public override List<Tour> GetTours() {
+      List<Tour> result = new List<Tour>();
+
+      Tour newTour = new Tour();
+
+      for (int i = 0; i < this.Length; i++) {
+        int city = this[i] + 1;
+        newTour.Stops.Add(city);
+        if (!ProblemInstance.TourFeasible(newTour, this)) {
+          newTour.Stops.Remove(city);
+          if (newTour.Stops.Count > 0)
+            result.Add(newTour);
+
+          newTour = new Tour();
+          newTour.Stops.Add(city);
+        }
+      }
+
+      if (newTour.Stops.Count > 0)
+        result.Add(newTour);
+
+      //if there are too many vehicles - repair
+      while (result.Count > ProblemInstance.Vehicles.Value) {
+        Tour tour = result[result.Count - 1];
+
+        //find predecessor / successor in permutation
+        int predecessorIndex = Array.IndexOf(this.array, tour.Stops[0] - 1) - 1;
+        if (predecessorIndex >= 0) {
+          int predecessor = this[predecessorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Stops.IndexOf(predecessor) + 1;
+            if (insertPosition != -1) {
+              t.Stops.InsertRange(insertPosition, tour.Stops);
+              break;
+            }
+          }
+        } else {
+          int successorIndex = Array.IndexOf(this.array,
+            tour.Stops[tour.Stops.Count - 1] - 1) + 1;
+          int successor = this[successorIndex] + 1;
+
+          foreach (Tour t in result) {
+            int insertPosition = t.Stops.IndexOf(successor);
+            if (insertPosition != -1) {
+              t.Stops.InsertRange(insertPosition, tour.Stops);
+              break;
+            }
+          }
+        }
+
+        result.Remove(tour);
+      }
+
+      return result;
+    }
+    #endregion
+
+    public ZhuEncoding(Permutation permutation, IVRPProblemInstance problemInstance)
+      : base(permutation, problemInstance) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuEncoding(this, cloner);
+    }
+
+    protected ZhuEncoding(ZhuEncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected ZhuEncoding(bool serializing)
+      : base(serializing) {
+    }
+
+    public static ZhuEncoding ConvertFrom(IVRPEncoding encoding, IVRPProblemInstance problemInstance) {
+      List<Tour> tours = encoding.GetTours();
+      List<int> route = new List<int>();
+
+      foreach (Tour tour in tours) {
+        foreach (int city in tour.Stops)
+          route.Add(city - 1);
+      }
+
+      return new ZhuEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), problemInstance);
+    }
+
+    public static ZhuEncoding ConvertFrom(List<int> routeParam, IVRPProblemInstance problemInstance) {
+      List<int> route = new List<int>(routeParam);
+
+      while (route.Remove(0)) { //remove all delimiters (0)
+      }
+
+      for (int i = 0; i < route.Count; i++)
+        route[i]--;
+
+      return new ZhuEncoding(
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), problemInstance);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 15895)
@@ -0,0 +1,491 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B94FFB82-43D4-40AB-9980-B03470ADF221}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.VehicleRouting</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.VehicleRouting-3.4</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Routing.TSP-3.3.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzer\BestAverageWorstTours\BestAverageWorstVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\BestAverageWorstVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\BestVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestAverageWorstCapacitatedVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestAverageWorstCapacitatedVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\Capacitated\BestCapacitatedVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\PickupAndDelivery\BestAverageWorstPickupAndDeliveryVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\PickupAndDelivery\BestAverageWorstPickupAndDeliveryVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\PickupAndDelivery\BestPickupAndDeliveryVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestAverageWorstTimeWindowedVRPToursAnalyzer.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestAverageWorstTimeWindowedVRPToursCalculator.cs" />
+    <Compile Include="Analyzer\BestAverageWorstTours\TimeWindowed\BestTimeWindowedVRPToursMemorizer.cs" />
+    <Compile Include="Analyzer\BestSolution\BestVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\BestSolution\Capacitated\BestCapacitatedVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\BestSolution\PickupAndDelivery\BestPickupAndDeliveryVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\BestSolution\TimeWindowed\BestTimeWindowedVRPSolutionAnalyzer.cs" />
+    <Compile Include="Analyzer\ConstraintRelaxation\Capacitated\CapacityRelaxationVRPAnalyzer.cs" />
+    <Compile Include="Analyzer\ConstraintRelaxation\PickupAndDelivery\PickupViolationsRelaxationVRPAnalyzer.cs" />
+    <Compile Include="Analyzer\ConstraintRelaxation\TimeWindowed\TimeWindowRelaxationVRPAnalyzer.cs" />
+    <Compile Include="Analyzer\VRPSolution.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\IPotvinTwoOptStarMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarSingleMoveGenerator.cs" />
+    <Compile Include="Improver\VRPImprovementOperator.cs" />
+    <Compile Include="Improver\VRPIntraRouteImprovementOperator.cs" />
+    <Compile Include="Interfaces\IVRPLocalSearchManipulator.cs" />
+    <Compile Include="Interpreters\MDCVRPInterpreter.cs" />
+    <Compile Include="Interpreters\VRPInterpreter.cs" />
+    <Compile Include="Interpreters\MDCVRPTWInterpreter.cs" />
+    <Compile Include="Interpreters\PDPTWInterpreter.cs" />
+    <Compile Include="Interpreters\CVRPTWInterpreter.cs" />
+    <Compile Include="Interpreters\CVRPInterpreter.cs" />
+    <Compile Include="Interpreters\IVRPDataInterpreter.cs" />
+    <Compile Include="PathRelinkers\VRPPathRelinker.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Encodings\Alba\AlbaEncoding.cs" />
+    <Compile Include="Encodings\Alba\Creators\RandomCreator.cs" />
+    <Compile Include="Encodings\Alba\Creators\AlbaCreator.cs" />
+    <Compile Include="Encodings\Alba\IAlbaOperator.cs" />
+    <Compile Include="Encodings\Alba\Crossovers\AlbaCrossover.cs" />
+    <Compile Include="Encodings\Alba\Crossovers\AlbaPermutationCrossover.cs" />
+    <Compile Include="Encodings\Alba\LocalImprovement\AlbaLambdaInterchangeLocalImprovementOperator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerInsertionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerInversionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaCustomerSwapManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaIntraRouteInversionManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaLambdaInterchangeManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaManipulator.cs" />
+    <Compile Include="Encodings\Alba\Manipulators\AlbaPermutationManipulator.cs" />
+    <Compile Include="Encodings\Alba\Moves\AlbaMoveEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\AlbaMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\AlbaMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaExhaustiveIntraRouteInversionMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMove.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaIntraRouteInversionMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\IntraRouteInversion\IAlbaIntraRouteInversionMoveOperator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaExhaustiveLambdaInterchangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMove.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaLambdaInterchangeMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\LambdaInterchange\IAlbaLambdaInterchangeMoveOperator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMove.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveEvaluator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveHardTabuCriterion.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveSoftTabuCriterion.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaTranslocationMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\AlbaStochasticTranslocationSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Alba\Moves\ThreeOpt\IAlbaTranslocationMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Creators\IterativeInsertionCreator.cs" />
+    <Compile Include="Encodings\Potvin\Creators\PushForwardInsertionCreator.cs" />
+    <Compile Include="Encodings\General\Creators\MultiVRPSolutionCreator.cs" />
+    <Compile Include="Encodings\General\Creators\VRPCreator.cs" />
+    <Compile Include="Encodings\General\Crossovers\BiasedMultiVRPSolutionCrossover.cs" />
+    <Compile Include="Encodings\General\Crossovers\MultiVRPSolutionCrossover.cs" />
+    <Compile Include="Encodings\General\Crossovers\RandomParentCloneCrossover.cs" />
+    <Compile Include="Encodings\General\Crossovers\VRPCrossover.cs" />
+    <Compile Include="Encodings\General\Manipulators\BiasedMultiVRPSolutionManipulator.cs" />
+    <Compile Include="Encodings\General\Manipulators\MultiVRPSolutionManipulator.cs" />
+    <Compile Include="Encodings\General\Manipulators\VRPManipulator.cs" />
+    <Compile Include="Encodings\General\Moves\Interfaces\IMultiVRPMoveGenerator.cs" />
+    <Compile Include="Encodings\General\Moves\Interfaces\IMultiVRPMoveOperator.cs" />
+    <Compile Include="Encodings\General\Moves\Interfaces\IVRPMove.cs" />
+    <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveTabuMaker.cs" />
+    <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveTabuChecker.cs" />
+    <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveEvaluator.cs" />
+    <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveGenerator.cs" />
+    <Compile Include="Encodings\General\Moves\MultiVRPMoveOperator\MultiVRPMoveMaker.cs" />
+    <Compile Include="Encodings\General\Moves\VRPMoveGenerator.cs" />
+    <Compile Include="Encodings\General\Moves\VRPMoveOperator.cs" />
+    <Compile Include="Encodings\General\Moves\VRPMoveMaker.cs" />
+    <Compile Include="Encodings\General\Moves\VRPMoveEvaluator.cs" />
+    <Compile Include="Encodings\General\PermutationEncoding.cs" />
+    <Compile Include="Encodings\General\ShakingOperators\VehicleRoutingShakingOperator.cs" />
+    <Compile Include="Encodings\General\TourEncoding.cs" />
+    <Compile Include="Encodings\GVR\Crossovers\GVRCrossover.cs" />
+    <Compile Include="Encodings\GVR\GVREncoding.cs" />
+    <Compile Include="Encodings\GVR\IGVROperator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRDisplacementManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRInsertionManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRInversionManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRManipulator.cs" />
+    <Compile Include="Encodings\GVR\Manipulators\GVRSwapManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Creators\PotvinCreator.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinCrossover.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinInsertionBasedCrossover.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinRouteBasedCrossover.cs" />
+    <Compile Include="Encodings\Potvin\Crossovers\PotvinSequenceBasedCrossover.cs" />
+    <Compile Include="Encodings\Potvin\IPotvinOperator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinPairwiseTwoLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinPairwiseOneLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinVehicleAssignmentManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinLocalSearchManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinOneLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\Potvin\Manipulators\PotvinTwoLevelExchangeManipulator.cs" />
+    <Compile Include="Encodings\General\Moves\VRPMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\IPotvinCustomerRelocationMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PotvinPDRelocateMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\IPotvinPDExchangeMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDExchange\PotvinPDExchangeSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\IPotvinPDRearrangeMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDRearrange\PotvinPDRearrangeSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\IPotvinPDShiftMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PickupDelivery\PDShift\PotvinPDShiftMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PotvinMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PotvinMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\PotvinMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\CustomerRelocation\PotvinCustomerRelocationMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\IPotvinVehicleAssignmentMoveOperator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveTabuCriterion.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveTabuMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentExhaustiveMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMove.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveAttribute.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveEvaluator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMoveMaker.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentMultiMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\Moves\VehicleAssignment\PotvinVehicleAssignmentSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Potvin\PotvinEncoding.cs" />
+    <Compile Include="Encodings\Prins\Crossovers\PrinsCrossover.cs" />
+    <Compile Include="Encodings\Prins\Crossovers\PrinsPermutationCrossover.cs" />
+    <Compile Include="Encodings\Prins\IPrinsOperator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsExhaustiveLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsPermutationManipulator.cs" />
+    <Compile Include="Encodings\Prins\Manipulators\PrinsStochasticLSManipulator.cs" />
+    <Compile Include="Encodings\Prins\PrinsEncoding.cs" />
+    <Compile Include="Encodings\VRPOperator.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuCrossover.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuHeuristicCrossover1.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuHeuristicCrossover2.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuMergeCrossover1.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuMergeCrossover2.cs" />
+    <Compile Include="Encodings\Zhu\Crossovers\ZhuPermutationCrossover.cs" />
+    <Compile Include="Encodings\Zhu\IZhuOperator.cs" />
+    <Compile Include="Encodings\Zhu\Manipulators\ZhuManipulator.cs" />
+    <Compile Include="Encodings\Zhu\Manipulators\ZhuPermutationManipulator.cs" />
+    <Compile Include="Encodings\Zhu\ZhuEncoding.cs" />
+    <Compile Include="Interfaces\IMultiVRPOperator.cs" />
+    <Compile Include="Interfaces\IVRPManipulator.cs" />
+    <Compile Include="Interfaces\IVRPCrossover.cs" />
+    <Compile Include="Interfaces\IVRPEvaluator.cs" />
+    <Compile Include="Interfaces\IVRPCreator.cs" />
+    <Compile Include="Interfaces\IVRPMoveOperator.cs" />
+    <Compile Include="Interfaces\IVRPMultiNeighborhoodShakingOperator.cs" />
+    <Compile Include="Interfaces\IVRPOperator.cs" />
+    <Compile Include="Interfaces\IVRPEncoding.cs" />
+    <Compile Include="Interfaces\IVRPProblemInstance.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPEvaluator.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPProblemInstance.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPTW\MDCVRPPDTW\MDCVRPPDTWEvaluator.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPTW\MDCVRPPDTW\MDCVRPPDTWProblemInstance.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPTW\MDCVRPTWEvaluator.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MDCVRP\MDCVRPTW\MDCVRPTWProblemInstance.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MultiDepotVRPProblemInstance.cs" />
+    <Compile Include="ProblemInstances\MultiDepotVRP\MultiDepotVRPEvaluator.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPPDTW\CVRPPDTWProblemInstance.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPPDTW\CVRPPDTWEvaluation.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPPDTW\CVRPPDTWEvaluator.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\SingleDepotVRPEvaluator.cs" />
+    <Compile Include="SimilarityCalculators\VRPSimilarityCalculator.cs" />
+    <Compile Include="SolutionParser.cs" />
+    <Compile Include="Variants\Capacitated\Heterogenous\IHeterogenousCapacitatedProblemInstance.cs" />
+    <Compile Include="Variants\Capacitated\Heterogenous\IHeterogenousCapacitatedOperator.cs" />
+    <Compile Include="Variants\Capacitated\Homogenous\IHomogenousCapacitatedOperator.cs" />
+    <Compile Include="Variants\Capacitated\Homogenous\IHomogenousCapacitatedProblemInstance.cs" />
+    <Compile Include="Variants\Capacitated\ICapacitatedProblemInstance.cs" />
+    <Compile Include="Variants\Capacitated\ICapacitatedOperator.cs" />
+    <Compile Include="Variants\General\IGeneralVRPOperator.cs" />
+    <Compile Include="Variants\MultiDepot\IMultiDepotOperator.cs" />
+    <Compile Include="Variants\MultiDepot\IMultiDepotProblemInstance.cs" />
+    <Compile Include="Variants\PickupAndDelivery\IPickupAndDeliveryOperator.cs" />
+    <Compile Include="Variants\PickupAndDelivery\IPickupAndDeliveryProblemInstance.cs" />
+    <Compile Include="Variants\SingleDepot\ISingleDepotOperator.cs" />
+    <Compile Include="Variants\SingleDepot\ISingleDepotProblemInstance.cs" />
+    <Compile Include="Variants\TimeWindowed\ITimeWindowedProblemInstance.cs" />
+    <Compile Include="Variants\TimeWindowed\ITimeWindowedOperator.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPTWProblemInstance.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPProblemInstance.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPTWEvaluation.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPEvaluation.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPTW\CVRPTWEvaluator.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\CVRP\CVRPEvaluator.cs" />
+    <Compile Include="ProblemInstances\VRPEvaluator.cs" />
+    <Compile Include="ProblemInstances\VRPEvaluation.cs" />
+    <Compile Include="ProblemInstances\SingleDepotVRP\SingleDepotVRPProblemInstance.cs" />
+    <Compile Include="ProblemInstances\VRPProblemInstance.cs" />
+    <Compile Include="Encodings\Tour.cs" />
+    <Compile Include="VehicleRoutingProblem.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- 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>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPImprovementOperator.cs	(revision 15895)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// A base class for operators which improve VRP solutions.
+  /// </summary>
+  [Item("VRPImprovementOperator", "A base class for operators which improve VRP solutions.")]
+  [StorableClass]
+  public abstract class VRPImprovementOperator : VRPOperator, IGeneralVRPOperator, ISingleObjectiveImprovementOperator {
+    #region Parameter properties
+    public ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IValueParameter<IntValue> ImprovementAttemptsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["ImprovementAttempts"]; }
+    }
+    public IValueLookupParameter<IntValue> LocalEvaluatedSolutions {
+      get { return (IValueLookupParameter<IntValue>)Parameters["LocalEvaluatedSolutions"]; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueParameter<IntValue> SampleSizeParameter {
+      get { return (IValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    public IValueLookupParameter<IItem> SolutionParameter {
+      get { return (IValueLookupParameter<IItem>)Parameters["Solution"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected VRPImprovementOperator(bool deserializing) : base(deserializing) { }
+    protected VRPImprovementOperator(VRPImprovementOperator original, Cloner cloner) : base(original, cloner) { }
+    protected VRPImprovementOperator()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope that contains the solution to be improved."));
+      Parameters.Add(new ValueParameter<IntValue>("ImprovementAttempts", "The number of improvement attempts the operator should perform.", new IntValue(100)));
+      Parameters.Add(new ValueLookupParameter<IntValue>("LocalEvaluatedSolutions", "The number of evaluated solutions."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "A pseudo random number generator."));
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "The number of moves that should be executed.", new IntValue(25)));
+      Parameters.Add(new ValueLookupParameter<IItem>("Solution", "The solution to be improved. This parameter is used for name translation only."));
+      #endregion
+    }
+
+    public override IOperation InstrumentedApply() {
+      var solution = SolutionParameter.ActualValue as IVRPEncoding;
+      var potvinSolution = solution is PotvinEncoding ? solution as PotvinEncoding : PotvinEncoding.ConvertFrom(solution, ProblemInstance);
+
+      if (solution == null)
+        throw new ArgumentException("Cannot improve solution because it has the wrong type.");
+
+      int evaluatedSolutions = Improve(potvinSolution);
+
+      SolutionParameter.ActualValue = solution;
+      LocalEvaluatedSolutions.ActualValue = new IntValue(evaluatedSolutions);
+
+      return base.InstrumentedApply();
+    }
+
+    protected abstract int Improve(PotvinEncoding solution);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPIntraRouteImprovementOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPIntraRouteImprovementOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Improver/VRPIntraRouteImprovementOperator.cs	(revision 15895)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which improves VRP solutions.
+  /// </summary>
+  [Item("VRPIntraRouteImprovementOperator", "An operator which improves VRP solutions.")]
+  [StorableClass]
+  public sealed class VRPIntraRouteImprovementOperator : VRPImprovementOperator {
+    [StorableConstructor]
+    private VRPIntraRouteImprovementOperator(bool deserializing) : base(deserializing) { }
+    private VRPIntraRouteImprovementOperator(VRPIntraRouteImprovementOperator original, Cloner cloner) : base(original, cloner) { }
+    public VRPIntraRouteImprovementOperator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPIntraRouteImprovementOperator(this, cloner);
+    }
+
+    protected override int Improve(PotvinEncoding solution) {
+      int evaluatedSolutions = 0;
+
+      var rand = RandomParameter.ActualValue;
+      var instance = ProblemInstance;
+      int sampleSize = SampleSizeParameter.Value.Value;
+      int attempts = ImprovementAttemptsParameter.Value.Value;
+      int customers = instance.Cities.Value;
+
+      // store city-to-tour assignment and position of the city within the tour
+      var tours = new Dictionary<int, Tour>();
+      var position = new Dictionary<int, int>();
+      foreach (Tour tour in solution.Tours) {
+        for (int stop = 0; stop < tour.Stops.Count; stop++) {
+          int city = tour.Stops[stop];
+          tours[city] = tour;
+          position[city] = stop;
+        }
+      }
+
+      for (int attempt = 0; attempt < attempts; attempt++) {
+        for (int sample = 0; sample < sampleSize; sample++) {
+          int chosenCust = 1 + rand.Next(customers);
+          var custTour = tours[chosenCust];
+
+          double beforeQuality = instance.EvaluateTour(custTour, solution).Quality;
+          evaluatedSolutions++;
+
+          custTour.Stops.RemoveAt(position[chosenCust]);
+          int place = solution.FindBestInsertionPlace(custTour, chosenCust);
+          evaluatedSolutions += custTour.Stops.Count;
+          custTour.Stops.Insert(place, chosenCust);
+
+          if (place != position[chosenCust]) {
+            double afterQuality = instance.EvaluateTour(custTour, solution).Quality;
+            if (afterQuality > beforeQuality) {
+              // revert move
+              custTour.Stops.RemoveAt(place);
+              custTour.Stops.Insert(position[chosenCust], chosenCust);
+            } else {
+              // accept move and update positions of the cities within the tour
+              for (int stop = 0; stop < custTour.Stops.Count; stop++) {
+                int city = custTour.Stops[stop];
+                position[city] = stop;
+              }
+              break;
+            }
+          }
+        }
+      }
+
+      return evaluatedSolutions;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IMultiVRPOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IMultiVRPOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IMultiVRPOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  interface IMultiVRPOperator : IVRPOperator {
+    void SetOperators(IEnumerable<IOperator> operators);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCreator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCreator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCreator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPCreator : IVRPOperator, ISolutionCreator {
+    ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCrossover.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCrossover.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPCrossover.cs	(revision 15895)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPCrossover : IVRPOperator, ICrossover {
+    ILookupParameter<ItemArray<IVRPEncoding>> ParentsParameter { get; }
+    ILookupParameter<IVRPEncoding> ChildParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEncoding.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEncoding.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEncoding.cs	(revision 15895)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPEncoding : IItem {
+    List<Tour> GetTours();
+    int GetTourIndex(Tour tour);
+    int GetVehicleAssignment(int tour);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPEvaluator : IVRPOperator, ISingleObjectiveEvaluator {
+    ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
+
+    VRPEvaluation Evaluate(IVRPProblemInstance instance, IVRPEncoding solution);
+    VRPEvaluation EvaluateTour(IVRPProblemInstance instance, Tour tour, IVRPEncoding solution);
+    bool Feasible(VRPEvaluation evaluation);
+    double GetInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, VRPEvaluation eval, int customer, int tour, int index, out bool feasible);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPLocalSearchManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPLocalSearchManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPLocalSearchManipulator.cs	(revision 15895)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPLocalSearchManipulator : IVRPManipulator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPManipulator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPManipulator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPManipulator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPManipulator : IVRPOperator, IManipulator {
+    ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMoveOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMoveOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMoveOperator.cs	(revision 15895)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPMoveOperator : IVRPOperator, IMoveOperator {
+    ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
+    ILookupParameter VRPMoveParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMultiNeighborhoodShakingOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMultiNeighborhoodShakingOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPMultiNeighborhoodShakingOperator.cs	(revision 15895)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPMultiNeighborhoodShakingOperator : IMultiNeighborhoodShakingOperator, IVRPOperator {
+    ILookupParameter<IVRPEncoding> VRPToursParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPOperator.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPOperator : IItem {
+    ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
+  public interface IVRPProblemInstance : IParameterizedNamedItem {
+    IVRPEvaluator SolutionEvaluator { get; set; }
+    IVRPEvaluator MoveEvaluator { get; }
+    IEnumerable<IOperator> Operators { get; }
+
+    event EventHandler EvaluationChanged;
+
+    DoubleMatrix Coordinates { get; }
+    DoubleMatrix DistanceMatrix { get; }
+    BoolValue UseDistanceMatrix { get; }
+    IntValue Vehicles { get; }
+    DoubleArray Demand { get; }
+    IntValue Cities { get; }
+
+    DoubleValue FleetUsageFactor { get; }
+    DoubleValue DistanceFactor { get; }
+
+    double[] GetCoordinates(int city);
+    double GetDemand(int city);
+    double GetDistance(int start, int end, IVRPEncoding solution);
+    double GetInsertionDistance(int start, int customer, int end, IVRPEncoding solution, out double startDistance, out double endDistance);
+    bool Feasible(IVRPEncoding solution);
+    bool TourFeasible(Tour tour, IVRPEncoding solution);
+    VRPEvaluation Evaluate(IVRPEncoding solution);
+    VRPEvaluation EvaluateTour(Tour tour, IVRPEncoding solution);
+    bool Feasible(VRPEvaluation eval);
+    double GetInsertionCosts(VRPEvaluation eval, IVRPEncoding solution, int customer, int tour, int index, out bool feasible);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPInterpreter.cs	(revision 15895)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public class CVRPInterpreter : VRPInterpreter, IVRPDataInterpreter<CVRPData> {   
+    protected override IVRPProblemInstance CreateProblemInstance() {
+      return new CVRPProblemInstance();
+    }
+
+    protected override void Interpret(IVRPData data, IVRPProblemInstance problemInstance) {
+      CVRPData cvrpData = (CVRPData)data;
+      CVRPProblemInstance problem = (CVRPProblemInstance)problemInstance;
+      
+      if (cvrpData.Coordinates != null)
+        problem.Coordinates = new DoubleMatrix(cvrpData.Coordinates);
+      if (cvrpData.MaximumVehicles != null)
+        problem.Vehicles.Value = (int)cvrpData.MaximumVehicles;
+      else
+        problem.Vehicles.Value = cvrpData.Dimension - 1;
+      problem.Capacity.Value = cvrpData.Capacity;
+      problem.Demand = new DoubleArray(cvrpData.Demands);
+      if (cvrpData.DistanceMeasure != DistanceMeasure.Euclidean) {
+        problem.UseDistanceMatrix.Value = true;
+        problem.DistanceMatrix = new DoubleMatrix(cvrpData.GetDistanceMatrix());
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPTWInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPTWInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/CVRPTWInterpreter.cs	(revision 15895)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public class CVRPTWInterpreter: CVRPInterpreter, IVRPDataInterpreter<CVRPTWData> {    
+    protected override IVRPProblemInstance CreateProblemInstance() {
+      return new CVRPTWProblemInstance();
+    }
+
+    protected override void Interpret(IVRPData data, IVRPProblemInstance problemInstance) {
+      base.Interpret(data, problemInstance);
+
+      CVRPTWData cvrptwData = (CVRPTWData)data;
+      CVRPTWProblemInstance problem = (CVRPTWProblemInstance)problemInstance;
+
+      problem.ReadyTime = new DoubleArray(cvrptwData.ReadyTimes);
+      problem.ServiceTime = new DoubleArray(cvrptwData.ServiceTimes);
+      problem.DueTime = new DoubleArray(cvrptwData.DueTimes);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/IVRPDataInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/IVRPDataInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/IVRPDataInterpreter.cs	(revision 15895)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public struct VRPInstanceDescription {
+    public string Name { get; set; }
+    public string Description { get; set; }
+    public IVRPProblemInstance ProblemInstance { get; set; }
+    public double? BestKnownQuality { get; set; }
+    public IVRPEncoding BestKnownSolution { get; set; }
+  }
+
+  public interface IVRPDataInterpreter {
+    VRPInstanceDescription Interpret(IVRPData data);
+  }
+
+  public interface IVRPDataInterpreter<T> : IVRPDataInterpreter where T : IVRPData {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPInterpreter.cs	(revision 15895)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public class MDCVRPInterpreter : VRPInterpreter, IVRPDataInterpreter<MDCVRPData> {   
+    protected override IVRPProblemInstance CreateProblemInstance() {
+      return new MDCVRPProblemInstance();
+    }
+
+    protected override void Interpret(IVRPData data, IVRPProblemInstance problemInstance) {
+      MDCVRPData cvrpData = (MDCVRPData)data;
+      MDCVRPProblemInstance problem = (MDCVRPProblemInstance)problemInstance;
+
+      if (cvrpData.Coordinates != null)
+        problem.Coordinates = new DoubleMatrix(cvrpData.Coordinates);
+      if (cvrpData.MaximumVehicles != null)
+        problem.Vehicles.Value = (int)cvrpData.MaximumVehicles;
+      else
+        problem.Vehicles.Value = cvrpData.Dimension - 1;
+      problem.Capacity = new DoubleArray(cvrpData.Capacity);
+      problem.Demand = new DoubleArray(cvrpData.Demands);
+      if (cvrpData.DistanceMeasure != DistanceMeasure.Euclidean) {
+        problem.UseDistanceMatrix.Value = true;
+        problem.DistanceMatrix = new DoubleMatrix(cvrpData.GetDistanceMatrix());
+      }
+
+      problem.Depots.Value = cvrpData.Depots;
+      problem.VehicleDepotAssignment = new IntArray(cvrpData.VehicleDepotAssignment);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPTWInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPTWInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/MDCVRPTWInterpreter.cs	(revision 15895)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public class MDCVRPTWInterpreter : MDCVRPInterpreter, IVRPDataInterpreter<MDCVRPTWData> {    
+    protected override IVRPProblemInstance CreateProblemInstance() {
+      return new MDCVRPTWProblemInstance();
+    }
+
+    protected override void Interpret(IVRPData data, IVRPProblemInstance problemInstance) {
+      base.Interpret(data, problemInstance);
+
+      MDCVRPTWData cvrptwData = (MDCVRPTWData)data;
+      MDCVRPTWProblemInstance problem = (MDCVRPTWProblemInstance)problemInstance;
+
+      problem.ReadyTime = new DoubleArray(cvrptwData.ReadyTimes);
+      problem.ServiceTime = new DoubleArray(cvrptwData.ServiceTimes);
+      problem.DueTime = new DoubleArray(cvrptwData.DueTimes);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/PDPTWInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/PDPTWInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/PDPTWInterpreter.cs	(revision 15895)
@@ -0,0 +1,44 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public class PDPTWInterpreter : CVRPTWInterpreter, IVRPDataInterpreter<PDPTWData> {    
+    protected override IVRPProblemInstance CreateProblemInstance() {
+      return new CVRPPDTWProblemInstance();
+    }
+
+    protected override void Interpret(IVRPData data, IVRPProblemInstance problemInstance) {
+      base.Interpret(data, problemInstance);
+
+      PDPTWData pdpData = (PDPTWData)data;
+      CVRPPDTWProblemInstance problem = (CVRPPDTWProblemInstance)problemInstance;
+
+      problem.PickupDeliveryLocation = new IntArray(pdpData.PickupDeliveryLocations);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/VRPInterpreter.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/VRPInterpreter.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Interpreters/VRPInterpreter.cs	(revision 15895)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.IO;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using System;
+
+namespace HeuristicLab.Problems.VehicleRouting.Interpreters {
+  public abstract class VRPInterpreter : IVRPDataInterpreter<IVRPData> {
+    protected abstract void Interpret(IVRPData data, IVRPProblemInstance problemInstance);
+
+    protected virtual IVRPEncoding GetBestKnowTour(IVRPData data, IVRPProblemInstance problemInstance) {
+      if (data.BestKnownTour != null) {
+        PotvinEncoding solution = new PotvinEncoding(problemInstance);
+
+        for (int i = 0; i < data.BestKnownTour.GetLength(0); i++) {
+          Tour tour = new Tour();
+          solution.Tours.Add(tour);
+
+          foreach (int stop in data.BestKnownTour[i]) {
+            tour.Stops.Add(stop + 1);
+          }
+        }
+
+        if (data.BestKnownTourVehicleAssignment != null) {
+          if (data.BestKnownTourVehicleAssignment.Length != solution.VehicleAssignment.Length)
+            throw new InvalidDataException("Number of vehicles of the best known tour does not match the number vehicles of the instance.");
+          for (int i = 0; i < data.BestKnownTourVehicleAssignment.Length; i++)
+            solution.VehicleAssignment[i] = data.BestKnownTourVehicleAssignment[i];
+        }
+
+        return solution;
+      } else {
+        return null;
+      }
+    }
+
+    protected abstract IVRPProblemInstance CreateProblemInstance();
+
+    public VRPInstanceDescription Interpret(IVRPData data) {
+      VRPInstanceDescription result = new VRPInstanceDescription();
+      result.Name = data.Name;
+      result.Description = data.Description;
+
+      IVRPProblemInstance problem = CreateProblemInstance();
+      Interpret(data, problem);
+      result.ProblemInstance = problem;
+
+      result.BestKnownQuality = data.BestKnownQuality;
+      result.BestKnownSolution = GetBestKnowTour(data, problem);
+
+      return result;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/PathRelinkers/VRPPathRelinker.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/PathRelinkers/VRPPathRelinker.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/PathRelinkers/VRPPathRelinker.cs	(revision 15895)
@@ -0,0 +1,324 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+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.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which relinks paths between VRP solutions.
+  /// </summary>
+  [Item("VRPPathRelinker", "An operator which relinks paths between VRP solutions.")]
+  [StorableClass]
+  public sealed class VRPPathRelinker : SingleObjectivePathRelinker, IGeneralVRPOperator, IStochasticOperator {
+    #region Parameter properties
+    public IValueParameter<IntValue> IterationsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueParameter<IntValue> SampleSizeParameter {
+      get { return (IValueParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private VRPPathRelinker(bool deserializing) : base(deserializing) { }
+    private VRPPathRelinker(VRPPathRelinker original, Cloner cloner) : base(original, cloner) { }
+    public VRPPathRelinker()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Iterations", "The number of iterations the operator should perform.", new IntValue(50)));
+      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new ValueParameter<IntValue>("SampleSize", "The number of moves that should be executed.", new IntValue(10)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPPathRelinker(this, cloner);
+    }
+
+    public static ItemArray<IItem> Apply(PotvinEncoding initiator, PotvinEncoding guide, PercentValue n, int sampleSize, int iterations, IRandom rand, IVRPProblemInstance problemInstance) {
+      if (initiator == null || guide == null)
+        throw new ArgumentException("Cannot relink path because one of the provided solutions or both are null.");
+
+      double sigma = 1.5;
+      double minPenalty = 0.001;
+      double maxPenalty = 1000000000;
+
+      var originalOverloadPenalty = new DoubleValue();
+      if (problemInstance is IHomogenousCapacitatedProblemInstance)
+        originalOverloadPenalty.Value = (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value;
+      var originalTardinessPenalty = new DoubleValue();
+      if (problemInstance is ITimeWindowedProblemInstance)
+        originalTardinessPenalty.Value = (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value;
+
+      PotvinEncoding current = MatchTours(initiator, guide, problemInstance);
+      double currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);
+
+      IList<PotvinEncoding> solutions = new List<PotvinEncoding>();
+      int i = 0;
+      while (i < iterations && !currentSimilarity.IsAlmost(1.0)) {
+        var currentEval = problemInstance.Evaluate(current);
+        currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);
+
+        if (currentSimilarity < 1.0) {
+          for (int sample = 0; sample < sampleSize; sample++) {
+            var next = current.Clone() as PotvinEncoding;
+
+            int neighborhood = rand.Next(3);
+            switch (neighborhood) {
+              case 0: next = RouteBasedXOver(next, guide, rand,
+                problemInstance);
+                break;
+              case 1: next = SequenceBasedXOver(next, guide, rand,
+                problemInstance);
+                break;
+              case 2: GuidedRelocateMove(next, guide, rand);
+                break;
+            }
+
+            next = MatchTours(next, guide, problemInstance);
+
+            var nextEval = problemInstance.Evaluate(next);
+            if ((nextEval.Quality < currentEval.Quality)) {
+              current = next;
+              solutions.Add(current);
+              break;
+            }
+          }
+
+          if (problemInstance is IHomogenousCapacitatedProblemInstance) {
+            if (((CVRPEvaluation)currentEval).Overload > 0) {
+              (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
+                Math.Min(maxPenalty,
+                (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
+            } else {
+              (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
+                Math.Max(minPenalty,
+                (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
+            }
+          }
+
+
+          if (problemInstance is ITimeWindowedProblemInstance) {
+            if (((CVRPTWEvaluation)currentEval).Tardiness > 0) {
+              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
+                Math.Min(maxPenalty,
+              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value * sigma);
+            } else {
+              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
+                Math.Max(minPenalty,
+                (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value / sigma);
+            }
+          }
+
+          i++;
+        }
+      }
+
+      if (problemInstance is IHomogenousCapacitatedProblemInstance)
+        (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value = originalOverloadPenalty.Value;
+      if (problemInstance is ITimeWindowedProblemInstance)
+        (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value = originalTardinessPenalty.Value;
+
+      return new ItemArray<IItem>(ChooseSelection(solutions, n));
+    }
+
+    private static IList<IItem> ChooseSelection(IList<PotvinEncoding> solutions, PercentValue n) {
+      IList<IItem> selection = new List<IItem>();
+      if (solutions.Count > 0) {
+        int noSol = (int)(solutions.Count * n.Value);
+        if (noSol <= 0) noSol++;
+        double stepSize = (double)solutions.Count / (double)noSol;
+        for (int i = 0; i < noSol; i++)
+          selection.Add(solutions.ElementAt((int)((i + 1) * stepSize - stepSize * 0.5)));
+      }
+
+      return selection;
+    }
+
+    protected override ItemArray<IItem> Relink(ItemArray<IItem> parents, PercentValue n) {
+      if (parents.Length != 2)
+        throw new ArgumentException("The number of parents is not equal to 2.");
+
+      if (!(parents[0] is PotvinEncoding))
+        parents[0] = PotvinEncoding.ConvertFrom(parents[0] as IVRPEncoding, ProblemInstanceParameter.ActualValue);
+      if (!(parents[1] is PotvinEncoding))
+        parents[1] = PotvinEncoding.ConvertFrom(parents[1] as IVRPEncoding, ProblemInstanceParameter.ActualValue);
+
+      return Apply(parents[0] as PotvinEncoding, parents[1] as PotvinEncoding, n,
+        SampleSizeParameter.Value.Value, IterationsParameter.Value.Value, RandomParameter.ActualValue, ProblemInstanceParameter.ActualValue);
+    }
+
+    private static int MatchingCities(Tour tour1, Tour tour2) {
+      return tour1.Stops.Intersect(tour2.Stops).Count();
+    }
+
+    private static PotvinEncoding MatchTours(PotvinEncoding initiator, PotvinEncoding guide, IVRPProblemInstance problemInstance) {
+      var result = new PotvinEncoding(problemInstance);
+
+      var used = new List<bool>();
+      for (int i = 0; i < initiator.Tours.Count; i++) {
+        used.Add(false);
+      }
+
+      for (int i = 0; i < guide.Tours.Count; i++) {
+        int bestMatch = -1;
+        int bestTour = -1;
+
+        for (int j = 0; j < initiator.Tours.Count; j++) {
+          if (!used[j]) {
+            int match = MatchingCities(guide.Tours[i], initiator.Tours[j]);
+            if (match > bestMatch) {
+              bestMatch = match;
+              bestTour = j;
+            }
+          }
+        }
+
+        if (bestTour != -1) {
+          result.Tours.Add(initiator.Tours[bestTour]);
+          used[bestTour] = true;
+        }
+      }
+
+      for (int i = 0; i < initiator.Tours.Count; i++) {
+        if (!used[i])
+          result.Tours.Add(initiator.Tours[i]);
+      }
+
+      return result;
+    }
+
+    #region moves
+    public static PotvinEncoding RouteBasedXOver(PotvinEncoding initiator, PotvinEncoding guide, IRandom random, IVRPProblemInstance problemInstance) {
+      return PotvinRouteBasedCrossover.Apply(random, initiator, guide, problemInstance, false);
+    }
+
+    public static PotvinEncoding SequenceBasedXOver(PotvinEncoding initiator, PotvinEncoding guide, IRandom random, IVRPProblemInstance problemInstance) {
+      return PotvinSequenceBasedCrossover.Apply(random, initiator, guide, problemInstance, false);
+    }
+
+    public static void GuidedRelocateMove(PotvinEncoding initiator, PotvinEncoding guide, IRandom random) {
+      List<int> cities = new List<int>();
+      foreach (Tour tour in initiator.Tours) {
+        foreach (int city in tour.Stops) {
+          Tour guideTour = guide.Tours.First(t => t.Stops.Contains(city));
+          if (guide.Tours.IndexOf(guideTour) != initiator.Tours.IndexOf(tour)) {
+            cities.Add(city);
+          }
+        }
+      }
+
+      if (cities.Count == 0) {
+        RelocateMove(initiator, random);
+      } else {
+        int city = cities[random.Next(cities.Count)];
+        Tour tour = initiator.Tours.First(t => t.Stops.Contains(city));
+        tour.Stops.Remove(city);
+
+        Tour guideTour = guide.Tours.First(t => t.Stops.Contains(city));
+        int guideTourIndex = guide.Tours.IndexOf(guideTour);
+
+        if (guideTourIndex < initiator.Tours.Count) {
+          Tour tour2 = initiator.Tours[guideTourIndex];
+
+          int guideIndex = guideTour.Stops.IndexOf(city);
+          if (guideIndex == 0) {
+            tour2.Stops.Insert(0, city);
+          } else {
+            int predecessor = guideTour.Stops[guideIndex - 1];
+            int initIndex = tour2.Stops.IndexOf(predecessor);
+            if (initIndex != -1) {
+              tour2.Stops.Insert(initIndex + 1, city);
+            } else {
+              if (guideIndex == guideTour.Stops.Count - 1) {
+                tour2.Stops.Insert(tour2.Stops.Count, city);
+              } else {
+                int sucessor = guideTour.Stops[guideIndex + 1];
+                initIndex = tour2.Stops.IndexOf(sucessor);
+                if (initIndex != -1) {
+                  tour2.Stops.Insert(initIndex, city);
+                } else {
+                  tour2.Stops.Insert(random.Next(tour2.Stops.Count + 1), city);
+                }
+              }
+            }
+          }
+        } else {
+          Tour tour2 = new Tour();
+          tour2.Stops.Add(city);
+          initiator.Tours.Add(tour2);
+        }
+
+        if (tour.Stops.Count == 0)
+          initiator.Tours.Remove(tour);
+      }
+    }
+
+    public static void RelocateMove(PotvinEncoding individual, IRandom random) {
+      int cities = individual.Cities;
+      int city = 1 + random.Next(cities);
+      Tour originalTour = individual.Tours.Find(t => t.Stops.Contains(city));
+      //consider creating new route
+      individual.Tours.Add(new Tour());
+
+      int position = 1 + random.Next(cities + individual.Tours.Count - 1);
+      if (position >= city) {
+        position++;
+      }
+
+      int originalPosition = originalTour.Stops.IndexOf(city);
+      originalTour.Stops.RemoveAt(originalPosition);
+
+      Tour insertionTour;
+      int insertionPosition;
+      if (position <= cities) {
+        insertionTour = individual.Tours.Find(t => t.Stops.Contains(position));
+        insertionPosition = insertionTour.Stops.IndexOf(position) + 1;
+      } else {
+        insertionTour = individual.Tours[position - cities - 1];
+        insertionPosition = 0;
+      }
+
+      insertionTour.Stops.Insert(insertionPosition, city);
+
+      individual.Tours.RemoveAll(t => t.Stops.Count == 0);
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.VehicleRouting plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.VehicleRouting", "3.4.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.VehicleRouting-3.4.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.Encodings.PermutationEncoding", "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")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class HeuristicLabProblemsVehicleRoutingPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,148 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPEvaluator", "Represents a multi depot CVRP evaluator.")]
+  [StorableClass]
+  public class MDCVRPEvaluator : VRPEvaluator {
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      double originalQuality = eval.Quality;
+
+      IHeterogenousCapacitatedProblemInstance cvrpInstance = instance as IHeterogenousCapacitatedProblemInstance;
+
+      double delivered = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      int tourIndex = solution.GetTourIndex(tour);
+      int vehicle = solution.GetVehicleAssignment(tourIndex);
+
+      double capacity = cvrpInstance.Capacity[vehicle];
+
+      var tourInfo = new CVRPTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count) {
+          end = tour.Stops[i];
+          delivered += instance.GetDemand(end);
+        }
+        //drive there
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
+
+        var stopInfo = new CVRPStopInsertionInfo(start, end, currentDistance, capacity - delivered);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      if (delivered > capacity) {
+        overweight = delivered - capacity;
+      }
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourInfo.Penalty = penalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var insertionInfo = (CVRPStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+
+      var cvrp = (IHeterogenousCapacitatedProblemInstance)instance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      double startDistance, endDistance;
+      costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance);
+
+      double demand = instance.GetDemand(customer);
+      if (demand > insertionInfo.SpareCapacity) {
+        feasible = false;
+
+        if (insertionInfo.SpareCapacity >= 0)
+          costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      OverloadParameter.ActualValue = new DoubleValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      OverloadParameter.ActualValue.Value = ((CVRPEvaluation)tourEvaluation).Overload;
+    }
+
+    [StorableConstructor]
+    protected MDCVRPEvaluator(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPEvaluator() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPEvaluator(this, cloner);
+    }
+
+    protected MDCVRPEvaluator(MDCVRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPProblemInstance", "Represents a multi depot CVRP instance.")]
+  [StorableClass]
+  public class MDCVRPProblemInstance : MultiDepotVRPProblemInstance, IHeterogenousCapacitatedProblemInstance {
+    protected IValueParameter<DoubleArray> CapacityParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["Capacity"]; }
+    }
+    protected IValueParameter<DoubleValue> OverloadPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
+    }
+
+    public DoubleArray Capacity {
+      get { return CapacityParameter.Value; }
+      set { CapacityParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentOverloadPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentOverloadPenalty"]; }
+    }
+
+    public DoubleValue OverloadPenalty {
+      get {
+        DoubleValue currentOverloadPenalty = CurrentOverloadPenaltyParameter.Value;
+        if (currentOverloadPenalty != null)
+          return currentOverloadPenalty;
+        else
+          return OverloadPenaltyParameter.Value;
+      }
+    }
+    DoubleValue ICapacitatedProblemInstance.CurrentOverloadPenalty {
+      get { return CurrentOverloadPenaltyParameter.Value; }
+      set { CurrentOverloadPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return base.GetOperators()
+        .Where(o => o is IHeterogenousCapacitatedOperator).Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ICapacitatedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new MDCVRPEvaluator();
+      }
+    }
+
+    [StorableConstructor]
+    protected MDCVRPProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPProblemInstance() {
+      Parameters.Add(new ValueParameter<DoubleArray>("Capacity", "The capacity of each vehicle.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalOverloadPenalty", "The overload penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentOverloadPenalty", "The current overload penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPProblemInstance(this, cloner);
+    }
+
+    protected MDCVRPProblemInstance(MDCVRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      CapacityParameter.ValueChanged += new EventHandler(CapacityParameter_ValueChanged);
+      OverloadPenaltyParameter.ValueChanged += new EventHandler(OverloadPenaltyParameter_ValueChanged);
+      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentOverloadPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void CapacityParameter_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void OverloadPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs	(revision 15895)
@@ -0,0 +1,341 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPPDTWEvaluator", "Represents a multi depot CVRPPDTW evaluator.")]
+  [StorableClass]
+  public class MDCVRPPDTWEvaluator : MDCVRPTWEvaluator {
+    public ILookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPPDTWEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      double originalQuality = eval.Quality;
+
+      var cvrpInstance = (IHeterogenousCapacitatedProblemInstance)instance;
+      DoubleArray demand = instance.Demand;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+
+      var pdp = (IPickupAndDeliveryProblemInstance)instance;
+      IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
+
+      var mdp = (IMultiDepotProblemInstance)instance;
+      IntArray vehicleAssignment = mdp.VehicleDepotAssignment;
+      int depots = mdp.Depots.Value;
+
+      double time = 0.0;
+      double waitingTime = 0.0;
+      double serviceTime = 0.0;
+      double tardiness = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      int tourIndex = solution.GetTourIndex(tour);
+      int vehicle = solution.GetVehicleAssignment(tourIndex);
+      int depot = vehicleAssignment[vehicle];
+
+      double capacity = cvrpInstance.Capacity[vehicle];
+
+      double currentLoad = 0.0;
+      Dictionary<int, bool> stops = new Dictionary<int, bool>();
+      int pickupViolations = 0;
+
+      double tourStartTime = readyTime[0];
+      time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
+
+        double arrivalTime = time;
+
+        int endIndex;
+        if (end == 0)
+          endIndex = depot;
+        else
+          endIndex = end + depots - 1;
+
+        //check if it was serviced on time
+        if (time > dueTime[endIndex])
+          tardiness += time - dueTime[endIndex];
+
+        //wait
+        double currentWaitingTime = 0.0;
+        if (time < readyTime[endIndex])
+          currentWaitingTime = readyTime[endIndex] - time;
+
+        double waitTime = readyTime[endIndex] - time;
+
+        waitingTime += currentWaitingTime;
+        time += currentWaitingTime;
+
+        double spareTime = dueTime[endIndex] - time;
+        double arrivalSpareCapacity = capacity - currentLoad;
+
+        if (end > 0) {
+          //service
+          double currentServiceTime = serviceTimes[end - 1];
+          serviceTime += currentServiceTime;
+          time += currentServiceTime;
+
+          //Pickup / deliver
+          bool validPickupDelivery =
+            ((demand[end - 1] >= 0) ||
+             (stops.ContainsKey(pickupDeliveryLocation[end - 1])));
+
+          if (validPickupDelivery) {
+            currentLoad += demand[end - 1];
+          } else {
+            pickupViolations++;
+          }
+
+          if (currentLoad > capacity)
+            overweight += currentLoad - capacity;
+        }
+
+        double spareCapacity = capacity - currentLoad;
+        var stopInfo = new CVRPPDTWStopInsertionInfo(start, end, currentDistance, spareCapacity,
+          arrivalTime, time, spareTime, waitTime, new List<int>(stops.Keys), arrivalSpareCapacity);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+
+        stops.Add(end, true);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double tourPenalty = 0;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
+      (eval as CVRPTWEvaluation).TravelTime += time;
+
+      penalty = tardiness * vrptw.TardinessPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      ((CVRPPDTWEvaluation)eval).PickupViolations += pickupViolations;
+      penalty = pickupViolations * pdp.PickupViolationPenalty.Value;
+      eval.Penalty += penalty;
+      tourPenalty += penalty;
+
+      eval.Quality += penalty;
+      eval.Quality += time * vrptw.TimeFactor.Value;
+      tourInfo.Penalty = tourPenalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPPDTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+      bool tourFeasible = true;
+
+      ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+      double tardinessPenalty = vrptw.TardinessPenalty.Value;
+
+      IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance;
+      int depots = mdp.Depots.Value;
+
+      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+      IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
+      double pickupPenalty = pdp.PickupViolationPenalty.Value;
+
+      double startDistance, endDistance;
+      costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance);
+
+      double demand = instance.GetDemand(customer);
+      if (demand > insertionInfo.ArrivalSpareCapacity) {
+        tourFeasible = feasible = false;
+        if (insertionInfo.ArrivalSpareCapacity >= 0)
+          costs += (demand - insertionInfo.ArrivalSpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+      int destination = pickupDeliveryLocation[customer - 1];
+
+      bool validPickup = true;
+      if (demand < 0 && !insertionInfo.Visited.Contains(destination)) {
+        tourFeasible = feasible = false;
+        validPickup = false;
+        costs += pickupPenalty;
+      }
+
+      double time = 0;
+      double tardiness = 0;
+
+      if (index > 0)
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
+      else
+        time = tourInfo.TourStartTime;
+
+      time += startDistance;
+
+      int customerIndex = customer + depots - 1;
+
+      if (time > dueTime[customerIndex]) {
+        tardiness += time - dueTime[customerIndex];
+      }
+      if (time < readyTime[customerIndex])
+        time += readyTime[customerIndex] - time;
+      time += serviceTimes[customer - 1];
+      time += endDistance;
+
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
+      for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
+
+        if (demand >= 0) {
+          if (nextStop.End == destination) {
+            demand = 0;
+            costs -= pickupPenalty;
+            if (tourInsertionInfo.Penalty == pickupPenalty && tourFeasible)
+              feasible = true;
+          } else if (nextStop.SpareCapacity < 0) {
+            costs += demand * overloadPenalty;
+          } else if (nextStop.SpareCapacity < demand) {
+            tourFeasible = feasible = false;
+            costs += (demand - nextStop.SpareCapacity) * overloadPenalty;
+          }
+        } else if (validPickup) {
+          if (nextStop.SpareCapacity < 0) {
+            costs += Math.Max(demand, nextStop.SpareCapacity) * overloadPenalty;
+          }
+        }
+
+        if (additionalTime < 0) {
+          //arrive earlier than before
+          //wait probably
+          if (nextStop.WaitingTime < 0) {
+            double wait = nextStop.WaitingTime - additionalTime;
+            if (wait > 0)
+              additionalTime += wait;
+          } else {
+            additionalTime = 0;
+          }
+
+          //check due date, decrease tardiness
+          if (nextStop.SpareTime < 0) {
+            costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
+          }
+        } else {
+          //arrive later than before, probably don't have to wait
+          if (nextStop.WaitingTime > 0) {
+            additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime);
+          }
+
+          //check due date
+          if (nextStop.SpareTime > 0) {
+            double spare = nextStop.SpareTime - additionalTime;
+            if (spare < 0)
+              tardiness += -spare;
+          } else {
+            tardiness += additionalTime;
+          }
+        }
+      }
+
+      costs += additionalTime * vrptw.TimeFactor.Value;
+
+      if (tardiness > 0) {
+        tourFeasible = feasible = false;
+      }
+
+      costs += tardiness * tardinessPenalty;
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      PickupViolationsParameter.ActualValue = new IntValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      PickupViolationsParameter.ActualValue.Value = (tourEvaluation as CVRPPDTWEvaluation).PickupViolations;
+    }
+
+    [StorableConstructor]
+    protected MDCVRPPDTWEvaluator(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPPDTWEvaluator() {
+      Parameters.Add(new LookupParameter<IntValue>("PickupViolations", "The number of pickup violations."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPPDTWEvaluator(this, cloner);
+    }
+
+    protected MDCVRPPDTWEvaluator(MDCVRPPDTWEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs	(revision 15895)
@@ -0,0 +1,139 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPPDTWProblemInstance", "Represents a multi depot CVRPPDTW instance.")]
+  [StorableClass]
+  public class MDCVRPPDTWProblemInstance : MDCVRPTWProblemInstance, IPickupAndDeliveryProblemInstance {
+    protected IValueParameter<IntArray> PickupDeliveryLocationParameter {
+      get { return (IValueParameter<IntArray>)Parameters["PickupDeliveryLocation"]; }
+    }
+    protected IValueParameter<DoubleValue> PickupViolationPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalPickupViolationPenalty"]; }
+    }
+
+    public IntArray PickupDeliveryLocation {
+      get { return PickupDeliveryLocationParameter.Value; }
+      set { PickupDeliveryLocationParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentPickupViolationPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentPickupViolationPenalty"]; }
+    }
+
+    public DoubleValue PickupViolationPenalty {
+      get {
+        DoubleValue currentPickupViolationPenalty = CurrentPickupViolationPenaltyParameter.Value;
+        if (currentPickupViolationPenalty != null)
+          return currentPickupViolationPenalty;
+        else
+          return PickupViolationPenaltyParameter.Value;
+      }
+    }
+    DoubleValue IPickupAndDeliveryProblemInstance.CurrentPickupViolationPenalty {
+      get { return CurrentPickupViolationPenaltyParameter.Value; }
+      set { CurrentPickupViolationPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return
+        ApplicationManager.Manager.GetInstances<IPickupAndDeliveryOperator>()
+        .Where(o => !(o is IAnalyzer))
+        .Cast<IOperator>().Union(base.GetOperators());
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<IPickupAndDeliveryOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new MDCVRPPDTWEvaluator();
+      }
+    }
+
+    public int GetPickupDeliveryLocation(int city) {
+      return PickupDeliveryLocation[city - 1];
+    }
+
+    [StorableConstructor]
+    protected MDCVRPPDTWProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPPDTWProblemInstance() {
+      Parameters.Add(new ValueParameter<IntArray>("PickupDeliveryLocation", "The pickup and delivery location for each customer.", new IntArray()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalPickupViolationPenalty", "The pickup violation penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentPickupViolationPenalty", "The current pickup violation penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPPDTWProblemInstance(this, cloner);
+    }
+
+    protected MDCVRPPDTWProblemInstance(MDCVRPPDTWProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      PickupDeliveryLocationParameter.ValueChanged += new EventHandler(PickupDeliveryLocationParameter_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentPickupViolationPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void PickupDeliveryLocationParameter_ValueChanged(object sender, EventArgs e) {
+      PickupDeliveryLocationParameter.Value.ItemChanged += new EventHandler<EventArgs<int>>(Value_ItemChanged);
+      EvalBestKnownSolution();
+    }
+
+    void Value_ItemChanged(object sender, EventArgs<int> e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs	(revision 15895)
@@ -0,0 +1,291 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPTWEvaluator", "Represents a multi depot CVRPTW evaluator.")]
+  [StorableClass]
+  public class MDCVRPTWEvaluator : MDCVRPEvaluator {
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    public ILookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPTWEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      double originalQuality = eval.Quality;
+
+      var cvrpInstance = (IHeterogenousCapacitatedProblemInstance)instance;
+      DoubleArray demand = instance.Demand;
+      
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+
+      var mdp = (IMultiDepotProblemInstance)instance;
+      IntArray vehicleAssignment = mdp.VehicleDepotAssignment;
+      int depots = mdp.Depots.Value;
+
+      double time = 0.0;
+      double waitingTime = 0.0;
+      double serviceTime = 0.0;
+      double tardiness = 0.0;
+      double delivered = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      int tourIndex = solution.GetTourIndex(tour);
+      int vehicle = solution.GetVehicleAssignment(tourIndex);
+      int depot = vehicleAssignment[vehicle];
+
+      double capacity = cvrpInstance.Capacity[vehicle];
+
+      double tourStartTime = vrptw.ReadyTime[depot];
+      time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count) {
+          end = tour.Stops[i];
+          delivered += instance.GetDemand(end);
+        }
+
+        //drive there
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
+
+        double arrivalTime = time;
+
+        int endIndex;
+        if (end == 0)
+          endIndex = depot;
+        else
+          endIndex = end + depots - 1;
+
+        //check if it was serviced on time
+        if (time > dueTime[endIndex])
+          tardiness += time - dueTime[endIndex];
+
+        //wait
+        double currentWaitingTime = 0.0;
+        if (time < readyTime[endIndex])
+          currentWaitingTime = readyTime[endIndex] - time;
+
+        double waitTime = readyTime[endIndex] - time;
+
+        waitingTime += currentWaitingTime;
+        time += currentWaitingTime;
+
+        double spareTime = dueTime[endIndex] - time;
+
+        //service
+        double currentServiceTime = 0;
+        if (end > 0)
+          currentServiceTime = serviceTimes[end - 1];
+        serviceTime += currentServiceTime;
+        time += currentServiceTime;
+
+        var stopInfo = new CVRPTWStopInsertionInfo(start, end, currentDistance, capacity - delivered, arrivalTime, time, spareTime, waitTime);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      if (delivered > capacity) {
+        overweight = delivered - capacity;
+      }
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double tourPenalty = 0;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
+      ((CVRPTWEvaluation)eval).TravelTime += time;
+
+      penalty = tardiness * vrptw.TardinessPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+      eval.Quality += time * vrptw.TimeFactor.Value;
+      tourInfo.Penalty = tourPenalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+
+      var cvrp = (ICapacitatedProblemInstance)instance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+      double tardinessPenalty = vrptw.TardinessPenalty.Value;
+
+      var mdp = (IMultiDepotProblemInstance)instance;
+      int depots = mdp.Depots.Value;
+
+      double startDistance, endDistance;
+      costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance);
+
+      double demand = instance.GetDemand(customer);
+      if (demand > tourInfo.SpareCapacity) {
+        feasible = false;
+
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+
+      double time = 0;
+      double tardiness = 0;
+
+      if (index > 0)
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
+      else
+        time = tourInfo.TourStartTime;
+
+      time += startDistance;
+
+      int customerIndex = customer + depots - 1;
+
+      if (time > dueTime[customerIndex]) {
+        tardiness += time - dueTime[customerIndex];
+      }
+      if (time < readyTime[customerIndex])
+        time += readyTime[customerIndex] - time;
+      time += serviceTimes[customer - 1];
+      time += endDistance;
+
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
+      for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
+
+        if (additionalTime < 0) {
+          //arrive earlier than before
+          //wait probably
+          if (nextStop.WaitingTime < 0) {
+            double wait = nextStop.WaitingTime - additionalTime;
+            if (wait > 0)
+              additionalTime += wait;
+          } else {
+            additionalTime = 0;
+          }
+
+          //check due date, decrease tardiness
+          if (nextStop.SpareTime < 0) {
+            costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
+          }
+        } else {
+          //arrive later than before, probably don't have to wait
+          if (nextStop.WaitingTime > 0) {
+            additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime);
+          }
+
+          //check due date
+          if (nextStop.SpareTime > 0) {
+            double spare = nextStop.SpareTime - additionalTime;
+            if (spare < 0)
+              tardiness += -spare;
+          } else {
+            tardiness += additionalTime;
+          }
+        }
+      }
+
+      costs += additionalTime * vrptw.TimeFactor.Value;
+
+      if (tardiness > 0) {
+        feasible = false;
+      }
+
+      costs += tardiness * tardinessPenalty;
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      TardinessParameter.ActualValue = new DoubleValue(0);
+      TravelTimeParameter.ActualValue = new DoubleValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      TardinessParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).Tardiness;
+      TravelTimeParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).TravelTime;
+    }
+
+    [StorableConstructor]
+    protected MDCVRPTWEvaluator(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPTWEvaluator() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("TravelTime", "The travel time."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPTWEvaluator(this, cloner);
+    }
+
+    protected MDCVRPTWEvaluator(MDCVRPTWEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs	(revision 15895)
@@ -0,0 +1,167 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MDCVRPTWProblemInstance", "Represents a multi depot CVRPTW instance.")]
+  [StorableClass]
+  public class MDCVRPTWProblemInstance : MDCVRPProblemInstance, ITimeWindowedProblemInstance {
+    protected IValueParameter<DoubleArray> ReadyTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    protected IValueParameter<DoubleArray> DueTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    protected IValueParameter<DoubleArray> ServiceTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    protected IValueParameter<DoubleValue> TimeFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalTimeFactor"]; }
+    }
+    protected IValueParameter<DoubleValue> TardinessPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalTardinessPenalty"]; }
+    }
+
+    public DoubleArray ReadyTime {
+      get { return ReadyTimeParameter.Value; }
+      set { ReadyTimeParameter.Value = value; }
+    }
+    public DoubleArray DueTime {
+      get { return DueTimeParameter.Value; }
+      set { DueTimeParameter.Value = value; }
+    }
+    public DoubleArray ServiceTime {
+      get { return ServiceTimeParameter.Value; }
+      set { ServiceTimeParameter.Value = value; }
+    }
+    public DoubleValue TimeFactor {
+      get { return TimeFactorParameter.Value; }
+      set { TimeFactorParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentTardinessPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentTardinessPenalty"]; }
+    }
+
+    public DoubleValue TardinessPenalty {
+      get {
+        DoubleValue currentTardinessPenalty = CurrentTardinessPenaltyParameter.Value;
+        if (currentTardinessPenalty != null)
+          return currentTardinessPenalty;
+        else
+          return TardinessPenaltyParameter.Value;
+      }
+    }
+    DoubleValue ITimeWindowedProblemInstance.CurrentTardinessPenalty {
+      get { return CurrentTardinessPenaltyParameter.Value; }
+      set { CurrentTardinessPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return base.GetOperators()
+        .Where(o => o is ITimeWindowedOperator).Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ITimeWindowedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new MDCVRPTWEvaluator();
+      }
+    }
+
+    [StorableConstructor]
+    protected MDCVRPTWProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public MDCVRPTWProblemInstance() {
+      Parameters.Add(new ValueParameter<DoubleArray>("ReadyTime", "The ready time of each customer.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleArray>("DueTime", "The due time of each customer.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleArray>("ServiceTime", "The service time of each customer.", new DoubleArray()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalTimeFactor", "The time factor considered in the evaluation.", new DoubleValue(0)));
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalTardinessPenalty", "The tardiness penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentTardinessPenalty", "The current tardiness penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MDCVRPTWProblemInstance(this, cloner);
+    }
+
+    protected MDCVRPTWProblemInstance(MDCVRPTWProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      TardinessPenaltyParameter.ValueChanged += new EventHandler(TardinessPenaltyParameter_ValueChanged);
+      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
+      TimeFactorParameter.ValueChanged += new EventHandler(TimeFactorParameter_ValueChanged);
+      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentTardinessPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
+      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void TimeFactor_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("SingleDepotVRPEvaluator", "Represents a single depot VRP evaluator.")]
+  [StorableClass]
+  public class MultiDepotVRPEvaluator : VRPEvaluator {
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      double distance = 0.0;
+      double quality = 0.0;
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
+
+        var stopInfo = new StopInsertionInfo(start, end, currentDistance);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      //Fleet usage
+      quality += instance.FleetUsageFactor.Value;
+      //Distance
+      quality += instance.DistanceFactor.Value * distance;
+
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      eval.Quality += quality;
+      tourInfo.Quality = quality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = true;
+      double startDistance, endDistance;
+
+      costs += instance.GetInsertionDistance(insertionInfo.Start, customer, insertionInfo.End, solution, out startDistance, out endDistance);
+
+      return costs;
+    }
+
+    [StorableConstructor]
+    protected MultiDepotVRPEvaluator(bool deserializing) : base(deserializing) { }
+
+    public MultiDepotVRPEvaluator() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiDepotVRPEvaluator(this, cloner);
+    }
+
+    protected MultiDepotVRPEvaluator(MultiDepotVRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,190 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("MultiDepotVRPProblemInstance", "Represents a multi depot VRP instance.")]
+  [StorableClass]
+  public class MultiDepotVRPProblemInstance : VRPProblemInstance, IMultiDepotProblemInstance {
+    protected IValueParameter<IntValue> DepotsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Depots"]; }
+    }
+
+    protected IValueParameter<IntArray> VehicleDepotAssignmentParameter {
+      get { return (IValueParameter<IntArray>)Parameters["VehicleDepotAssignment"]; }
+    }
+
+    public IntValue Depots {
+      get {
+        return DepotsParameter.Value;
+      }
+    }
+
+    public IntArray VehicleDepotAssignment {
+      get {
+        return VehicleDepotAssignmentParameter.Value;
+      }
+      set {
+        VehicleDepotAssignmentParameter.Value = value;
+      }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return ApplicationManager.Manager.GetInstances<IMultiDepotOperator>().Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<IMultiDepotOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>();
+    }
+
+    public override IntValue Cities {
+      get {
+        return new IntValue(Demand.Length);
+      }
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new MultiDepotVRPEvaluator();
+      }
+    }
+
+    protected override IVRPCreator Creator {
+      get {
+        return new HeuristicLab.Problems.VehicleRouting.Encodings.Alba.RandomCreator();
+      }
+    }
+
+    public override double GetDemand(int city) {
+      return base.GetDemand(city - 1);
+    }
+
+    public override double[] GetCoordinates(int city) {
+      double[] coordinates;
+
+      if (city == 0) {
+        //calculate centroid
+        coordinates = new double[Coordinates.Columns];
+
+        for (int i = 0; i < Depots.Value; i++) {
+          for (int j = 0; j < coordinates.Length; j++) {
+            coordinates[j] += Coordinates[i, j];
+          }
+        }
+
+        for (int j = 0; j < coordinates.Length; j++) {
+          coordinates[j] /= (double)Depots.Value;
+        }
+      } else {
+        city += Depots.Value - 1;
+        coordinates = base.GetCoordinates(city);
+      }
+
+      return coordinates;
+    }
+
+    public int GetDepot(int customer, IVRPEncoding solution) {
+      int depot = -1;
+
+      Tour tour =
+          solution.GetTours().FirstOrDefault(t => t.Stops.Contains(customer));
+
+      if (tour != null) {
+        int tourIndex = solution.GetTourIndex(tour);
+        int vehicle = solution.GetVehicleAssignment(tourIndex);
+        depot = VehicleDepotAssignment[vehicle];
+      }
+
+      return depot;
+    }
+
+    public override double GetDistance(int start, int end, IVRPEncoding solution) {
+      if (start == 0 && end == 0)
+        return 0;
+
+      if (start == 0) {
+        start = GetDepot(end, solution);
+        end += Depots.Value - 1;
+      } else if (end == 0) {
+        end = GetDepot(start, solution);
+        start += Depots.Value - 1;
+      } else {
+        start += Depots.Value - 1;
+        end += Depots.Value - 1;
+      }
+
+      return base.GetDistance(start, end, solution);
+    }
+
+    public override double GetInsertionDistance(int start, int customer, int end, IVRPEncoding solution,
+      out double startDistance, out double endDistance) {
+      if (start == 0) {
+        start = GetDepot(end, solution);
+        end += Depots.Value - 1;
+      } else if (end == 0) {
+        end = GetDepot(start, solution);
+        start += Depots.Value - 1;
+      } else {
+        start += Depots.Value - 1;
+        end += Depots.Value - 1;
+      }
+      customer += Depots.Value - 1;
+
+      double distance = base.GetDistance(start, end, solution);
+
+      startDistance = base.GetDistance(start, customer, solution);
+      endDistance = base.GetDistance(customer, end, solution);
+
+      double newDistance = startDistance + endDistance;
+
+      return newDistance - distance;
+    }
+
+    [StorableConstructor]
+    protected MultiDepotVRPProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public MultiDepotVRPProblemInstance() {
+      Parameters.Add(new ValueParameter<IntValue>("Depots", "The number of depots", new IntValue(0)));
+      Parameters.Add(new ValueParameter<IntArray>("VehicleDepotAssignment", "The assignment of vehicles to depots", new IntArray()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiDepotVRPProblemInstance(this, cloner);
+    }
+
+    protected MultiDepotVRPProblemInstance(MultiDepotVRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 15895)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Globalization;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  public class CVRPStopInsertionInfo : StopInsertionInfo {
+    private double spareCapacity;
+
+    public double SpareCapacity {
+      get { return spareCapacity; }
+    }
+
+    public CVRPStopInsertionInfo(int start, int end, double distance, double spareCapacity)
+      : base(start, end, distance) {
+      this.spareCapacity = spareCapacity;
+    }
+
+    protected override void GetStopInsertionReport(StringBuilder builder) {
+      base.GetStopInsertionReport(builder);
+      builder.Append("Capacity left:\t");
+      builder.AppendLine(SpareCapacity.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPTourInsertionInfo : TourInsertionInfo {
+    private double capacity;
+
+    public virtual double SpareCapacity {
+      get { return stopInsertionInfos.Count == 0 ? capacity : ((CVRPStopInsertionInfo)stopInsertionInfos.Last()).SpareCapacity; }
+    }
+    
+    public CVRPTourInsertionInfo(int vehicle, double capacity)
+      : base(vehicle) {
+      this.capacity = capacity;
+    }
+
+    protected override void GetTourInsertionReport(StringBuilder builder) {
+      base.GetTourInsertionReport(builder);
+      builder.Append("Capacity left:\t");
+      builder.AppendLine(SpareCapacity.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPEvaluation : VRPEvaluation {
+    public double Overload { get; set; }
+
+    protected override void GetEvaluationReport(StringBuilder builder) {
+      base.GetEvaluationReport(builder);
+      builder.Append("Overload:\t");
+      builder.AppendLine(Overload.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,149 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPEvaluator", "Represents a single depot CVRP evaluator.")]
+  [StorableClass]
+  public class CVRPEvaluator : VRPEvaluator {
+    public ILookupParameter<DoubleValue> OverloadParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Overload"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+      double capacity = cvrpInstance.Capacity.Value;
+      var tourInfo = new CVRPTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+      double originalQuality = eval.Quality;
+
+      DoubleArray demand = instance.Demand;
+
+      double delivered = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        delivered += demand[end];
+
+        //drive there
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
+
+        var stopInfo = new CVRPStopInsertionInfo(start, end, currentDistance, capacity - delivered);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      if (delivered > capacity) {
+        overweight = delivered - capacity;
+      }
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourInfo.Penalty = penalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var tourInfo = (CVRPTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+
+      var cvrp = (ICapacitatedProblemInstance)instance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
+      double newDistance =
+        instance.GetDistance(insertionInfo.Start, customer, solution) +
+        instance.GetDistance(customer, insertionInfo.End, solution);
+      costs += instance.DistanceFactor.Value * (newDistance - distance);
+
+      double demand = instance.Demand[customer];
+      if (demand > tourInfo.SpareCapacity) {
+        feasible = false;
+
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      OverloadParameter.ActualValue = new DoubleValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      OverloadParameter.ActualValue.Value = ((CVRPEvaluation)tourEvaluation).Overload;
+    }
+
+    [StorableConstructor]
+    protected CVRPEvaluator(bool deserializing) : base(deserializing) { }
+
+    public CVRPEvaluator() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Overload", "The overload."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPEvaluator(this, cloner);
+    }
+
+    protected CVRPEvaluator(CVRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPProblemInstance", "Represents a single depot CVRP instance.")]
+  [StorableClass]
+  public class CVRPProblemInstance : SingleDepotVRPProblemInstance, IHomogenousCapacitatedProblemInstance {
+    protected IValueParameter<DoubleValue> CapacityParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Capacity"]; }
+    }
+    protected IValueParameter<DoubleValue> OverloadPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
+    }
+
+    public DoubleValue Capacity {
+      get { return CapacityParameter.Value; }
+      set { CapacityParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentOverloadPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentOverloadPenalty"]; }
+    }
+
+    public DoubleValue OverloadPenalty {
+      get {
+        DoubleValue currentOverloadPenalty = CurrentOverloadPenaltyParameter.Value;
+        if (currentOverloadPenalty != null)
+          return currentOverloadPenalty;
+        else
+          return OverloadPenaltyParameter.Value;
+      }
+    }
+    DoubleValue ICapacitatedProblemInstance.CurrentOverloadPenalty {
+      get { return CurrentOverloadPenaltyParameter.Value; }
+      set { CurrentOverloadPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return base.GetOperators()
+        .Where(o => o is IHomogenousCapacitatedOperator).Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ICapacitatedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new CVRPEvaluator();
+      }
+    }
+
+    [StorableConstructor]
+    protected CVRPProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public CVRPProblemInstance() {
+      Parameters.Add(new ValueParameter<DoubleValue>("Capacity", "The capacity of each vehicle.", new DoubleValue(0)));
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalOverloadPenalty", "The overload penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentOverloadPenalty", "The current overload penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPProblemInstance(this, cloner);
+    }
+
+    protected CVRPProblemInstance(CVRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      CapacityParameter.ValueChanged += new EventHandler(CapacityParameter_ValueChanged);
+      CapacityParameter.Value.ValueChanged += new EventHandler(Capacity_ValueChanged);
+      OverloadPenaltyParameter.ValueChanged += new EventHandler(OverloadPenaltyParameter_ValueChanged);
+      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentOverloadPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void CapacityParameter_ValueChanged(object sender, EventArgs e) {
+      CapacityParameter.Value.ValueChanged += new EventHandler(Capacity_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void Capacity_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void OverloadPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 15895)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  public class CVRPPDTWStopInsertionInfo : CVRPTWStopInsertionInfo {
+    private List<int> visited;
+
+    public List<int> Visited {
+      get { return visited; }
+    }
+
+    private double arrivalSpareCapacity;
+
+    public double ArrivalSpareCapacity {
+      get { return arrivalSpareCapacity; }
+    }
+
+    public CVRPPDTWStopInsertionInfo(int start, int end, double distance, double spareCapacity,
+      double arrivalTime, double leaveTime, double spareTime, double waitingTime, List<int> visited, double arrivalSpareCapacity)
+      : base(start, end, distance, spareCapacity, arrivalTime, leaveTime, spareTime, waitingTime) {
+      this.visited = visited;
+      this.arrivalSpareCapacity = arrivalSpareCapacity;
+    }
+  }
+
+  public class CVRPPDTWEvaluation : CVRPTWEvaluation {
+    public int PickupViolations { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs	(revision 15895)
@@ -0,0 +1,325 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPPDTWEvaluator", "Represents a single depot CVRPPDTW evaluator.")]
+  [StorableClass]
+  public class CVRPPDTWEvaluator : CVRPTWEvaluator {
+    public ILookupParameter<IntValue> PickupViolationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["PickupViolations"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPPDTWEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+      double capacity = cvrpInstance.Capacity.Value;
+      double originalQuality = eval.Quality;
+
+      DoubleArray demand = instance.Demand;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+
+      var pdp = (IPickupAndDeliveryProblemInstance)instance;
+      IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
+
+
+      double time = 0.0;
+      double waitingTime = 0.0;
+      double serviceTime = 0.0;
+      double tardiness = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      double currentLoad = 0.0;
+      Dictionary<int, bool> stops = new Dictionary<int, bool>();
+      int pickupViolations = 0;
+
+      double tourStartTime = readyTime[0];
+      time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
+
+        double arrivalTime = time;
+
+        //check if it was serviced on time
+        if (time > dueTime[end])
+          tardiness += time - dueTime[end];
+
+        //wait
+        double currentWaitingTime = 0.0;
+        if (time < readyTime[end])
+          currentWaitingTime = readyTime[end] - time;
+
+        double waitTime = readyTime[end] - time;
+
+        waitingTime += currentWaitingTime;
+        time += currentWaitingTime;
+
+        double spareTime = dueTime[end] - time;
+
+        //service
+        double currentServiceTime = serviceTimes[end];
+        serviceTime += currentServiceTime;
+        time += currentServiceTime;
+
+        //Pickup / deliver
+        double arrivalSpareCapacity = capacity - currentLoad;
+
+        bool validPickupDelivery =
+          ((demand[end] >= 0) ||
+           (stops.ContainsKey(pickupDeliveryLocation[end])));
+
+        if (validPickupDelivery) {
+          currentLoad += demand[end];
+        } else {
+          pickupViolations++;
+        }
+
+        if (currentLoad > capacity)
+          overweight += currentLoad - capacity;
+
+        double spareCapacity = capacity - currentLoad;
+        var stopInfo = new CVRPPDTWStopInsertionInfo(start, end, currentDistance, spareCapacity,
+          arrivalTime, time, spareTime, waitTime, new List<int>(stops.Keys), arrivalSpareCapacity);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+
+        stops.Add(end, true);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double tourPenalty = 0;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
+      ((CVRPTWEvaluation)eval).TravelTime += time;
+
+      penalty = tardiness * vrptw.TardinessPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      ((CVRPPDTWEvaluation)eval).PickupViolations += pickupViolations;
+      penalty = pickupViolations * pdp.PickupViolationPenalty.Value;
+      eval.Penalty += penalty;
+      tourPenalty += penalty;
+
+      eval.Quality += penalty;
+      eval.Quality += time * vrptw.TimeFactor.Value;
+      tourInfo.Penalty = tourPenalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPPDTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+      bool tourFeasible = true;
+
+      var cvrp = (ICapacitatedProblemInstance)instance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+      double tardinessPenalty = vrptw.TardinessPenalty.Value;
+
+      IPickupAndDeliveryProblemInstance pdp = (IPickupAndDeliveryProblemInstance)instance;
+      IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
+      double pickupPenalty = pdp.PickupViolationPenalty.Value;
+
+      double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
+      double newDistance =
+        instance.GetDistance(insertionInfo.Start, customer, solution) +
+        instance.GetDistance(customer, insertionInfo.End, solution);
+      costs += instance.DistanceFactor.Value * (newDistance - distance);
+
+      double demand = instance.Demand[customer];
+      if (demand > insertionInfo.ArrivalSpareCapacity) {
+        tourFeasible = feasible = false;
+        if (insertionInfo.ArrivalSpareCapacity >= 0)
+          costs += (demand - insertionInfo.ArrivalSpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+      int destination = pickupDeliveryLocation[customer];
+
+      bool validPickup = true;
+      if (demand < 0 && !insertionInfo.Visited.Contains(destination)) {
+        tourFeasible = feasible = false;
+        validPickup = false;
+        costs += pickupPenalty;
+      }
+
+      double time = 0;
+      double tardiness = 0;
+
+      if (index > 0)
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
+      else
+        time = tourInfo.TourStartTime;
+
+      time += instance.GetDistance(insertionInfo.Start, customer, solution);
+      if (time > dueTime[customer]) {
+        tardiness += time - dueTime[customer];
+      }
+      if (time < readyTime[customer])
+        time += readyTime[customer] - time;
+      time += serviceTimes[customer];
+      time += instance.GetDistance(customer, insertionInfo.End, solution);
+
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
+      for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
+
+        if (demand >= 0) {
+          if (nextStop.End == destination) {
+            demand = 0;
+            costs -= pickupPenalty;
+            if (tourInsertionInfo.Penalty == pickupPenalty && tourFeasible)
+              feasible = true;
+          } else if (nextStop.SpareCapacity < 0) {
+            costs += demand * overloadPenalty;
+          } else if (nextStop.SpareCapacity < demand) {
+            tourFeasible = feasible = false;
+            costs += (demand - nextStop.SpareCapacity) * overloadPenalty;
+          }
+        } else if (validPickup) {
+          if (nextStop.SpareCapacity < 0) {
+            // ABE: The costs decrease when there is overload!?
+            costs += Math.Max(demand, nextStop.SpareCapacity) * overloadPenalty;
+          }
+        }
+
+        if (additionalTime < 0) {
+          //arrive earlier than before
+          //wait probably
+          if (nextStop.WaitingTime < 0) {
+            double wait = nextStop.WaitingTime - additionalTime;
+            if (wait > 0)
+              additionalTime += wait;
+          } else {
+            additionalTime = 0;
+          }
+
+          //check due date, decrease tardiness
+          if (nextStop.SpareTime < 0) {
+            // ABE: Again, the costs decrease when there is tardiness!?
+            costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
+          }
+        } else {
+          //arrive later than before, probably don't have to wait
+          if (nextStop.WaitingTime > 0) {
+            additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime);
+          }
+
+          //check due date
+          if (nextStop.SpareTime > 0) {
+            double spare = nextStop.SpareTime - additionalTime;
+            if (spare < 0)
+              tardiness += -spare;
+          } else {
+            tardiness += additionalTime;
+          }
+        }
+      }
+
+      costs += additionalTime * vrptw.TimeFactor.Value;
+
+      if (tardiness > 0) {
+        tourFeasible = feasible = false;
+      }
+
+      costs += tardiness * tardinessPenalty;
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      PickupViolationsParameter.ActualValue = new IntValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      PickupViolationsParameter.ActualValue.Value = (tourEvaluation as CVRPPDTWEvaluation).PickupViolations;
+    }
+
+    [StorableConstructor]
+    protected CVRPPDTWEvaluator(bool deserializing) : base(deserializing) { }
+
+    public CVRPPDTWEvaluator() {
+      Parameters.Add(new LookupParameter<IntValue>("PickupViolations", "The number of pickup violations."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPPDTWEvaluator(this, cloner);
+    }
+
+    protected CVRPPDTWEvaluator(CVRPPDTWEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs	(revision 15895)
@@ -0,0 +1,139 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPPDTWProblemInstance", "Represents a single depot CVRPPDTW instance.")]
+  [StorableClass]
+  public class CVRPPDTWProblemInstance : CVRPTWProblemInstance, IPickupAndDeliveryProblemInstance {
+    protected IValueParameter<IntArray> PickupDeliveryLocationParameter {
+      get { return (IValueParameter<IntArray>)Parameters["PickupDeliveryLocation"]; }
+    }
+    protected IValueParameter<DoubleValue> PickupViolationPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalPickupViolationPenalty"]; }
+    }
+
+    public IntArray PickupDeliveryLocation {
+      get { return PickupDeliveryLocationParameter.Value; }
+      set { PickupDeliveryLocationParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentPickupViolationPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentPickupViolationPenalty"]; }
+    }
+
+    public DoubleValue PickupViolationPenalty {
+      get {
+        DoubleValue currentPickupViolationPenalty = CurrentPickupViolationPenaltyParameter.Value;
+        if (currentPickupViolationPenalty != null)
+          return currentPickupViolationPenalty;
+        else
+          return PickupViolationPenaltyParameter.Value;
+      }
+    }
+    DoubleValue IPickupAndDeliveryProblemInstance.CurrentPickupViolationPenalty {
+      get { return CurrentOverloadPenaltyParameter.Value; }
+      set { CurrentPickupViolationPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return
+        ApplicationManager.Manager.GetInstances<IPickupAndDeliveryOperator>()
+        .Where(o => !(o is IAnalyzer))
+        .Cast<IOperator>().Union(base.GetOperators());
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<IPickupAndDeliveryOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new CVRPPDTWEvaluator();
+      }
+    }
+
+    public int GetPickupDeliveryLocation(int city) {
+      return PickupDeliveryLocation[city];
+    }
+
+    [StorableConstructor]
+    protected CVRPPDTWProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public CVRPPDTWProblemInstance() {
+      Parameters.Add(new ValueParameter<IntArray>("PickupDeliveryLocation", "The pickup and delivery location for each customer.", new IntArray()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalPickupViolationPenalty", "The pickup violation penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentPickupViolationPenalty", "The current pickup violation penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPPDTWProblemInstance(this, cloner);
+    }
+
+    protected CVRPPDTWProblemInstance(CVRPPDTWProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      PickupDeliveryLocationParameter.ValueChanged += new EventHandler(PickupDeliveryLocationParameter_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentPickupViolationPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void PickupDeliveryLocationParameter_ValueChanged(object sender, EventArgs e) {
+      PickupDeliveryLocationParameter.Value.ItemChanged += new EventHandler<EventArgs<int>>(Value_ItemChanged);
+      EvalBestKnownSolution();
+    }
+
+    void Value_ItemChanged(object sender, EventArgs<int> e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 15895)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Globalization;
+using System.Text;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  public class CVRPTWStopInsertionInfo : CVRPStopInsertionInfo {
+
+    private double arrivalTime;
+
+    public double ArrivalTime {
+      get { return arrivalTime; }
+    }
+
+    private double leaveTime;
+
+    public double LeaveTime {
+      get { return leaveTime; }
+    }
+
+    private double spareTime;
+
+    public double SpareTime {
+      get { return spareTime; }
+    }
+
+    private double waitingTime;
+
+    public double WaitingTime {
+      get { return waitingTime; }
+    }
+
+    public CVRPTWStopInsertionInfo(int start, int end, double distance, double spareCapacity, double arrivalTime, double leaveTime, double spareTime, double waitingTime)
+      : base(start, end, distance, spareCapacity) {
+      this.arrivalTime = arrivalTime;
+      this.leaveTime = leaveTime;
+      this.spareTime = spareTime;
+      this.waitingTime = waitingTime;
+    }
+
+    protected override void GetStopInsertionReport(StringBuilder builder) {
+      base.GetStopInsertionReport(builder);
+      builder.Append("SpareTime:\t");
+      builder.AppendLine(SpareTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("ArrivalTime:\t");
+      builder.AppendLine(ArrivalTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("WaitingTime:\t");
+      builder.AppendLine(Math.Max(0, WaitingTime).ToString(CultureInfo.CurrentCulture));
+      builder.Append("LeaveTime:\t");
+      builder.AppendLine(LeaveTime.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPTWTourInsertionInfo : CVRPTourInsertionInfo {
+    private double tourStartTime;
+
+    public double TourStartTime {
+      get { return tourStartTime; }
+    }
+
+    public CVRPTWTourInsertionInfo(int vehicle, double capacity, double tourStartTime)
+      : base(vehicle, capacity) {
+      this.tourStartTime = tourStartTime;
+    }
+
+    protected override void GetTourInsertionReport(StringBuilder builder) {
+      base.GetTourInsertionReport(builder);
+      builder.Append("Tour start:\t");
+      builder.AppendLine(TourStartTime.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPTWEvaluation : CVRPEvaluation {
+    public double Tardiness { get; set; }
+    public double TravelTime { get; set; }
+
+    protected override void GetEvaluationReport(StringBuilder builder) {
+      base.GetEvaluationReport(builder);
+      builder.Append("TravelTime:\t");
+      builder.AppendLine(TravelTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Tardiness:\t");
+      builder.AppendLine(Tardiness.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 15895)
@@ -0,0 +1,271 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPTWEvaluator", "Represents a single depot CVRPTW evaluator.")]
+  [StorableClass]
+  public class CVRPTWEvaluator : CVRPEvaluator {
+    public ILookupParameter<DoubleValue> TardinessParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
+    }
+
+    public ILookupParameter<DoubleValue> TravelTimeParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["TravelTime"]; }
+    }
+
+    protected override VRPEvaluation CreateTourEvaluation() {
+      return new CVRPTWEvaluation();
+    }
+
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+
+      double originalQuality = eval.Quality;
+
+      DoubleArray demand = instance.Demand;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+
+      double time = 0.0;
+      double waitingTime = 0.0;
+      double serviceTime = 0.0;
+      double tardiness = 0.0;
+      double delivered = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
+
+      double capacity = cvrpInstance.Capacity.Value;
+      
+      double tourStartTime = readyTime[0];
+      time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), cvrpInstance.Capacity.Value, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
+        delivered += demand[end];
+
+        double arrivalTime = time;
+
+        //check if it was serviced on time
+        if (time > dueTime[end])
+          tardiness += time - dueTime[end];
+
+        //wait
+        double currentWaitingTime = 0.0;
+        if (time < readyTime[end])
+          currentWaitingTime = readyTime[end] - time;
+
+        double waitTime = readyTime[end] - time;
+
+        waitingTime += currentWaitingTime;
+        time += currentWaitingTime;
+
+        double spareTime = dueTime[end] - time;
+
+        //service
+        double currentServiceTime = serviceTimes[end];
+        serviceTime += currentServiceTime;
+        time += currentServiceTime;
+
+        var stopInfo = new CVRPTWStopInsertionInfo(start, end, currentDistance, capacity - delivered, arrivalTime, time, spareTime, waitTime);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      if (delivered > capacity) {
+        overweight = delivered - capacity;
+      }
+
+      ((CVRPEvaluation)eval).Overload += overweight;
+      double tourPenalty = 0;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+
+      (eval as CVRPTWEvaluation).Tardiness += tardiness;
+      (eval as CVRPTWEvaluation).TravelTime += time;
+
+      penalty = tardiness * vrptw.TardinessPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
+      tourPenalty += penalty;
+      eval.Quality += time * vrptw.TimeFactor.Value;
+      tourInfo.Penalty = tourPenalty;
+      tourInfo.Quality = eval.Quality - originalQuality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = tourInsertionInfo.Penalty < double.Epsilon;
+
+      var cvrp = (ICapacitatedProblemInstance)instance;
+      double overloadPenalty = cvrp.OverloadPenalty.Value;
+
+      var vrptw = (ITimeWindowedProblemInstance)instance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
+      double tardinessPenalty = vrptw.TardinessPenalty.Value;
+
+      double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
+      double newDistance =
+        instance.GetDistance(insertionInfo.Start, customer, solution) +
+        instance.GetDistance(customer, insertionInfo.End, solution);
+      costs += instance.DistanceFactor.Value * (newDistance - distance);
+
+      double demand = instance.Demand[customer];
+      if (demand > tourInfo.SpareCapacity) {
+        feasible = false;
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
+        else
+          costs += demand * overloadPenalty;
+      }
+
+      double time = 0;
+      double tardiness = 0;
+
+      if (index > 0)
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
+      else
+        time = tourInfo.TourStartTime;
+
+      time += instance.GetDistance(insertionInfo.Start, customer, solution);
+      if (time > dueTime[customer]) {
+        tardiness += time - dueTime[customer];
+      }
+      if (time < readyTime[customer])
+        time += readyTime[customer] - time;
+      time += serviceTimes[customer];
+      time += instance.GetDistance(customer, insertionInfo.End, solution);
+
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
+      for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
+
+        if (additionalTime < 0) {
+          //arrive earlier than before
+          //wait probably
+          if (nextStop.WaitingTime < 0) {
+            double wait = nextStop.WaitingTime - additionalTime;
+            if (wait > 0)
+              additionalTime += wait;
+          } else {
+            additionalTime = 0;
+          }
+
+          //check due date, decrease tardiness
+          if (nextStop.SpareTime < 0) {
+            costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
+          }
+        } else {
+          //arrive later than before, probably don't have to wait
+          if (nextStop.WaitingTime > 0) {
+            additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime);
+          }
+
+          //check due date
+          if (nextStop.SpareTime > 0) {
+            double spare = nextStop.SpareTime - additionalTime;
+            if (spare < 0)
+              tardiness += -spare;
+          } else {
+            tardiness += additionalTime;
+          }
+        }
+      }
+
+      costs += additionalTime * vrptw.TimeFactor.Value;
+
+      if (tardiness > 0) {
+        feasible = false;
+      }
+
+      costs += tardiness * tardinessPenalty;
+
+      return costs;
+    }
+
+    protected override void InitResultParameters() {
+      base.InitResultParameters();
+
+      TardinessParameter.ActualValue = new DoubleValue(0);
+      TravelTimeParameter.ActualValue = new DoubleValue(0);
+    }
+
+    protected override void SetResultParameters(VRPEvaluation tourEvaluation) {
+      base.SetResultParameters(tourEvaluation);
+
+      TardinessParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).Tardiness;
+      TravelTimeParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).TravelTime;
+    }
+
+    [StorableConstructor]
+    protected CVRPTWEvaluator(bool deserializing) : base(deserializing) { }
+
+    public CVRPTWEvaluator() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Tardiness", "The tardiness."));
+      Parameters.Add(new LookupParameter<DoubleValue>("TravelTime", "The travel time."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPTWEvaluator(this, cloner);
+    }
+
+    protected CVRPTWEvaluator(CVRPTWEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 15895)
@@ -0,0 +1,167 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPTWProblemInstance", "Represents a single depot CVRPTW instance.")]
+  [StorableClass]
+  public class CVRPTWProblemInstance : CVRPProblemInstance, ITimeWindowedProblemInstance {
+    protected IValueParameter<DoubleArray> ReadyTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["ReadyTime"]; }
+    }
+    protected IValueParameter<DoubleArray> DueTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["DueTime"]; }
+    }
+    protected IValueParameter<DoubleArray> ServiceTimeParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["ServiceTime"]; }
+    }
+
+    protected IValueParameter<DoubleValue> TimeFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalTimeFactor"]; }
+    }
+    protected IValueParameter<DoubleValue> TardinessPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalTardinessPenalty"]; }
+    }
+
+    public DoubleArray ReadyTime {
+      get { return ReadyTimeParameter.Value; }
+      set { ReadyTimeParameter.Value = value; }
+    }
+    public DoubleArray DueTime {
+      get { return DueTimeParameter.Value; }
+      set { DueTimeParameter.Value = value; }
+    }
+    public DoubleArray ServiceTime {
+      get { return ServiceTimeParameter.Value; }
+      set { ServiceTimeParameter.Value = value; }
+    }
+    public DoubleValue TimeFactor {
+      get { return TimeFactorParameter.Value; }
+      set { TimeFactorParameter.Value = value; }
+    }
+
+    protected IValueParameter<DoubleValue> CurrentTardinessPenaltyParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["CurrentTardinessPenalty"]; }
+    }
+
+    public DoubleValue TardinessPenalty {
+      get {
+        DoubleValue currentTardinessPenalty = CurrentTardinessPenaltyParameter.Value;
+        if (currentTardinessPenalty != null)
+          return currentTardinessPenalty;
+        else
+          return TardinessPenaltyParameter.Value;
+      }
+    }
+    DoubleValue ITimeWindowedProblemInstance.CurrentTardinessPenalty {
+      get { return CurrentTardinessPenaltyParameter.Value; }
+      set { CurrentTardinessPenaltyParameter.Value = value; }
+    }
+
+    protected override IEnumerable<IOperator> GetOperators() {
+      return base.GetOperators()
+        .Where(o => o is ITimeWindowedOperator).Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ITimeWindowedOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>().Union(base.GetAnalyzers());
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new CVRPTWEvaluator();
+      }
+    }
+
+    [StorableConstructor]
+    protected CVRPTWProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public CVRPTWProblemInstance() {
+      Parameters.Add(new ValueParameter<DoubleArray>("ReadyTime", "The ready time of each customer.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleArray>("DueTime", "The due time of each customer.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleArray>("ServiceTime", "The service time of each customer.", new DoubleArray()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalTimeFactor", "The time factor considered in the evaluation.", new DoubleValue(0)));
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalTardinessPenalty", "The tardiness penalty considered in the evaluation.", new DoubleValue(100)));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentTardinessPenalty", "The current tardiness penalty considered in the evaluation.") { Hidden = true });
+
+      AttachEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPTWProblemInstance(this, cloner);
+    }
+
+    protected CVRPTWProblemInstance(CVRPTWProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      TardinessPenaltyParameter.ValueChanged += new EventHandler(TardinessPenaltyParameter_ValueChanged);
+      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
+      TimeFactorParameter.ValueChanged += new EventHandler(TimeFactorParameter_ValueChanged);
+      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+    }
+
+    public override void InitializeState() {
+      base.InitializeState();
+
+      CurrentTardinessPenaltyParameter.Value = null;
+    }
+
+    #region Event handlers
+    void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
+      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void TimeFactor_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("SingleDepotVRPEvaluator", "Represents a single depot VRP evaluator.")]
+  [StorableClass]
+  public class SingleDepotVRPEvaluator : VRPEvaluator {
+    protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      var tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+
+      double distance = 0.0;
+      double quality = 0.0;
+
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
+
+        var stopInfo = new StopInsertionInfo(start, end, currentDistance);
+        tourInfo.AddStopInsertionInfo(stopInfo);
+      }
+
+      //Fleet usage
+      quality += instance.FleetUsageFactor.Value;
+      //Distance
+      quality += instance.DistanceFactor.Value * distance;
+
+      eval.Distance += distance;
+      eval.VehicleUtilization += 1;
+
+      tourInfo.Quality = quality;
+      eval.Quality += quality;
+    }
+
+    protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
+      out bool feasible) {
+      var insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
+
+      double costs = 0;
+      feasible = true;
+
+      double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
+      double newDistance =
+        instance.GetDistance(insertionInfo.Start, customer, solution) +
+        instance.GetDistance(customer, insertionInfo.End, solution);
+
+      costs += instance.DistanceFactor.Value * (newDistance - distance);
+
+      return costs;
+    }
+
+    [StorableConstructor]
+    protected SingleDepotVRPEvaluator(bool deserializing) : base(deserializing) { }
+
+    public SingleDepotVRPEvaluator() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleDepotVRPEvaluator(this, cloner);
+    }
+
+    protected SingleDepotVRPEvaluator(SingleDepotVRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("SingleDepotVRPProblemInstance", "Represents a single depot VRP instance.")]
+  [StorableClass]
+  public class SingleDepotVRPProblemInstance : VRPProblemInstance, ISingleDepotProblemInstance {
+    protected override IEnumerable<IOperator> GetOperators() {
+      return ApplicationManager.Manager.GetInstances<ISingleDepotOperator>().Cast<IOperator>();
+    }
+
+    protected override IEnumerable<IOperator> GetAnalyzers() {
+      return ApplicationManager.Manager.GetInstances<ISingleDepotOperator>()
+        .Where(o => o is IAnalyzer)
+        .Cast<IOperator>();
+    }
+
+    public override IntValue Cities {
+      get {
+        return new IntValue(Demand.Length - 1);
+      }
+    }
+
+    protected override IVRPEvaluator Evaluator {
+      get {
+        return new SingleDepotVRPEvaluator();
+      }
+    }
+
+    protected override IVRPCreator Creator {
+      get {
+        return new HeuristicLab.Problems.VehicleRouting.Encodings.Alba.RandomCreator();
+      }
+    }
+
+    [StorableConstructor]
+    protected SingleDepotVRPProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public SingleDepotVRPProblemInstance() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleDepotVRPProblemInstance(this, cloner);
+    }
+
+    protected SingleDepotVRPProblemInstance(SingleDepotVRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 15895)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  public class StopInsertionInfo {
+    private int start;
+    public int Start {
+      get { return start; }
+    }
+
+    private int end;
+    public int End {
+      get { return end; }
+    }
+
+    private double distance;
+    public double Distance {
+      get { return distance; }
+    }
+
+    public StopInsertionInfo(int start, int end, double distance)
+      : base() {
+      this.start = start;
+      this.end = end;
+      this.distance = distance;
+    }
+
+    protected virtual void GetStopInsertionReport(StringBuilder builder) {
+      builder.Append("From\t");
+      builder.Append(Start.ToString(CultureInfo.CurrentCulture));
+      builder.Append("\tto\t");
+      builder.AppendLine(End.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetStopInsertionReport(builder);
+    }
+  }
+
+  public class TourInsertionInfo {
+    public double Penalty { get; set; }
+    public double Quality { get; set; }
+    public double Distance { get { return stopInsertionInfos.Count > 0 ? stopInsertionInfos.Sum(x => x.Distance) : 0; } }
+
+    public int Vehicle { get; set; }
+
+    protected List<StopInsertionInfo> stopInsertionInfos;
+
+    public TourInsertionInfo(int vehicle)
+      : base() {
+      stopInsertionInfos = new List<StopInsertionInfo>();
+      Vehicle = vehicle;
+    }
+
+    public void AddStopInsertionInfo(StopInsertionInfo info) {
+      stopInsertionInfos.Add(info);
+    }
+
+    public StopInsertionInfo GetStopInsertionInfo(int stop) {
+      return stopInsertionInfos[stop];
+    }
+
+    public int GetStopCount() {
+      return stopInsertionInfos.Count;
+    }
+
+    protected virtual void GetTourInsertionReport(StringBuilder builder) {
+      builder.AppendLine("=== Tour ===");
+      builder.Append("Vehicle:\t");
+      builder.AppendLine(Vehicle.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Quality:\t");
+      builder.AppendLine(Quality.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Penalty:\t");
+      builder.AppendLine(Penalty.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetTourInsertionReport(builder);
+      builder.AppendLine("==== Stops ====");
+      for (var i = 0; i < stopInsertionInfos.Count; i++) {
+        stopInsertionInfos[i].GetReport(builder);
+      }
+    }
+  }
+
+  public class InsertionInfo {
+    private List<TourInsertionInfo> tourInsertionInfos;
+
+    public InsertionInfo()
+      : base() {
+      tourInsertionInfos = new List<TourInsertionInfo>();
+    }
+
+    public void AddTourInsertionInfo(TourInsertionInfo info) {
+      tourInsertionInfos.Add(info);
+    }
+
+    public TourInsertionInfo GetTourInsertionInfo(int tour) {
+      return tourInsertionInfos[tour];
+    }
+
+    protected virtual void GetInsertionReport(StringBuilder builder) {
+      builder.AppendLine("== VRP Route Report ==");
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetInsertionReport(builder);
+      for (var i = 0; i < tourInsertionInfos.Count; i++) {
+        tourInsertionInfos[i].GetReport(builder);
+      }
+    }
+  }
+
+  public class VRPEvaluation {
+    public double Quality { get; set; }
+    public double Distance { get; set; }
+    public int VehicleUtilization { get; set; }
+    public InsertionInfo InsertionInfo { get; set; }
+
+    public double Penalty { get; set; }
+
+    public VRPEvaluation() {
+      InsertionInfo = new InsertionInfo();
+    }
+
+    protected virtual void GetEvaluationReport(StringBuilder builder) {
+      builder.AppendLine("= VRP Solution Report =");
+      builder.Append("Quality:\t");
+      builder.AppendLine(Quality.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Penalty:\t");
+      builder.AppendLine(Penalty.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Vehicles used:\t");
+      builder.AppendLine(VehicleUtilization.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetEvaluationReport(builder);
+      InsertionInfo.GetReport(builder);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluator.cs	(revision 15895)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("VRPEvaluator", "Represents a VRP evaluator.")]
+  [StorableClass]
+  public abstract class VRPEvaluator : VRPOperator, IVRPEvaluator {
+    public ILookupParameter<IVRPEncoding> VRPToursParameter {
+      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
+    }
+
+    #region ISingleObjectiveEvaluator Members
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    #endregion
+
+    public ILookupParameter<DoubleValue> DistanceParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Distance"]; }
+    }
+    public ILookupParameter<DoubleValue> VehcilesUtilizedParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["VehiclesUtilized"]; }
+    }
+
+    public ILookupParameter<DoubleValue> PenaltyParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Penalty"]; }
+    }
+
+    [StorableConstructor]
+    protected VRPEvaluator(bool deserializing) : base(deserializing) { }
+
+    public VRPEvaluator() {
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the VRP solution."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Distance", "The distance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("VehiclesUtilized", "The number of vehicles utilized."));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("Penalty", "The applied penalty."));
+    }
+
+    protected VRPEvaluator(VRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected virtual VRPEvaluation CreateTourEvaluation() {
+      return new VRPEvaluation();
+    }
+
+    protected abstract void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution);
+
+    protected virtual void InitResultParameters() {
+      QualityParameter.ActualValue = new DoubleValue(0);
+      VehcilesUtilizedParameter.ActualValue = new DoubleValue(0);
+      DistanceParameter.ActualValue = new DoubleValue(0);
+      PenaltyParameter.ActualValue = new DoubleValue(0);
+    }
+
+    protected virtual void SetResultParameters(VRPEvaluation tourEvaluation) {
+      QualityParameter.ActualValue.Value = tourEvaluation.Quality;
+      VehcilesUtilizedParameter.ActualValue.Value = tourEvaluation.VehicleUtilization;
+      DistanceParameter.ActualValue.Value = tourEvaluation.Distance;
+      PenaltyParameter.ActualValue.Value = tourEvaluation.Penalty;
+    }
+
+    #region IVRPEvaluator Members
+
+    public bool Feasible(VRPEvaluation evaluation) {
+      return evaluation.Penalty < double.Epsilon;
+    }
+
+    protected abstract double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer, out bool feasible);
+
+    public double GetInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, VRPEvaluation eval, int customer, int tour, int index, out bool feasible) {
+      bool tourFeasible;
+      double costs = GetTourInsertionCosts(
+        instance,
+        solution,
+        eval.InsertionInfo.GetTourInsertionInfo(tour),
+        index,
+        customer, out tourFeasible);
+
+      feasible = tourFeasible;
+
+      return costs;
+    }
+
+    public VRPEvaluation EvaluateTour(IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
+      VRPEvaluation evaluation = CreateTourEvaluation();
+      EvaluateTour(evaluation, instance, tour, solution);
+      return evaluation;
+    }
+
+    public virtual VRPEvaluation Evaluate(IVRPProblemInstance instance, IVRPEncoding solution) {
+      VRPEvaluation evaluation = CreateTourEvaluation();
+
+      foreach (Tour tour in solution.GetTours()) {
+        EvaluateTour(evaluation, instance, tour, solution);
+      }
+
+      return evaluation;
+    }
+
+    public override IOperation InstrumentedApply() {
+      InitResultParameters();
+
+      VRPEvaluation evaluation = CreateTourEvaluation();
+      IVRPEncoding solution = VRPToursParameter.ActualValue;
+      foreach (Tour tour in solution.GetTours()) {
+        EvaluateTour(evaluation, ProblemInstance, tour, solution);
+      }
+      SetResultParameters(evaluation);
+
+      QualityParameter.ActualValue = new DoubleValue(evaluation.Quality);
+
+      return base.InstrumentedApply();
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 15895)
@@ -0,0 +1,344 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("VRPProblemInstance", "Represents a VRP instance.")]
+  [StorableClass]
+  public abstract class VRPProblemInstance : ParameterizedNamedItem, IVRPProblemInstance, IStatefulItem {
+    IVRPEvaluator moveEvaluator;
+
+    private object locker = new object();
+
+    public IVRPEvaluator MoveEvaluator {
+      get {
+        lock (locker) {
+          if (evaluator == null)
+            return null;
+          else {
+            if (moveEvaluator == null) {
+              moveEvaluator = evaluator.Clone() as IVRPEvaluator;
+
+              foreach (IParameter parameter in moveEvaluator.Parameters) {
+                if (parameter is ILookupParameter
+                  && parameter != moveEvaluator.ProblemInstanceParameter
+                  && parameter != moveEvaluator.VRPToursParameter) {
+                  (parameter as ILookupParameter).ActualName =
+                    VRPMoveEvaluator.MovePrefix +
+                    (parameter as ILookupParameter).ActualName;
+                }
+              }
+            }
+
+            return moveEvaluator;
+          }
+        }
+      }
+    }
+
+    protected abstract IEnumerable<IOperator> GetOperators();
+    protected abstract IEnumerable<IOperator> GetAnalyzers();
+
+    public IEnumerable<IOperator> Operators {
+      get {
+        return GetOperators().Union(GetAnalyzers());
+      }
+    }
+
+    protected ValueParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    }
+    protected OptionalValueParameter<DoubleMatrix> DistanceMatrixParameter {
+      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
+    }
+    protected ValueParameter<BoolValue> UseDistanceMatrixParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
+    }
+    protected ValueParameter<IntValue> VehiclesParameter {
+      get { return (ValueParameter<IntValue>)Parameters["Vehicles"]; }
+    }
+    protected ValueParameter<DoubleArray> DemandParameter {
+      get { return (ValueParameter<DoubleArray>)Parameters["Demand"]; }
+    }
+
+    protected IValueParameter<DoubleValue> FleetUsageFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalFleetUsageFactor"]; }
+    }
+    protected IValueParameter<DoubleValue> DistanceFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["EvalDistanceFactor"]; }
+    }
+
+    public DoubleMatrix Coordinates {
+      get { return CoordinatesParameter.Value; }
+      set { CoordinatesParameter.Value = value; }
+    }
+
+    public DoubleMatrix DistanceMatrix {
+      get { return DistanceMatrixParameter.Value; }
+      set { DistanceMatrixParameter.Value = value; }
+    }
+    public BoolValue UseDistanceMatrix {
+      get { return UseDistanceMatrixParameter.Value; }
+      set { UseDistanceMatrixParameter.Value = value; }
+    }
+    public IntValue Vehicles {
+      get { return VehiclesParameter.Value; }
+      set { VehiclesParameter.Value = value; }
+    }
+    public DoubleArray Demand {
+      get { return DemandParameter.Value; }
+      set { DemandParameter.Value = value; }
+    }
+    public virtual IntValue Cities {
+      get { return new IntValue(Demand.Length); }
+    }
+
+    public DoubleValue FleetUsageFactor {
+      get { return FleetUsageFactorParameter.Value; }
+      set { FleetUsageFactorParameter.Value = value; }
+    }
+    public DoubleValue DistanceFactor {
+      get { return DistanceFactorParameter.Value; }
+      set { DistanceFactorParameter.Value = value; }
+    }
+
+    protected virtual double CalculateDistance(int start, int end) {
+      double distance = 0.0;
+
+      distance =
+          Math.Sqrt(
+            Math.Pow(Coordinates[start, 0] - Coordinates[end, 0], 2) +
+            Math.Pow(Coordinates[start, 1] - Coordinates[end, 1], 2));
+
+      return distance;
+    }
+
+    private DoubleMatrix CreateDistanceMatrix() {
+      DoubleMatrix distanceMatrix = new DoubleMatrix(Coordinates.Rows, Coordinates.Rows);
+
+      for (int i = 0; i < distanceMatrix.Rows; i++) {
+        for (int j = 0; j < distanceMatrix.Columns; j++) {
+          double distance = CalculateDistance(i, j);
+
+          distanceMatrix[i, j] = distance;
+        }
+      }
+
+      return distanceMatrix;
+    }
+
+    public virtual double[] GetCoordinates(int city) {
+      double[] coordinates = new double[Coordinates.Columns];
+
+      for (int i = 0; i < Coordinates.Columns; i++) {
+        coordinates[i] = Coordinates[city, i];
+      }
+
+      return coordinates;
+    }
+
+    public virtual double GetDemand(int city) {
+      return Demand[city];
+    }
+
+    //cache for performance improvement
+    private DoubleMatrix distanceMatrix = null;
+    private IVRPEvaluator evaluator = null;
+
+    public IVRPEvaluator SolutionEvaluator {
+      get {
+        return evaluator;
+      }
+
+      set {
+        lock (locker) {
+          moveEvaluator = null;
+          evaluator = value;
+          EvalBestKnownSolution();
+        }
+      }
+    }
+
+    public virtual double GetDistance(int start, int end, IVRPEncoding solution) {
+      if (distanceMatrix == null && UseDistanceMatrix.Value) {
+        distanceMatrix = DistanceMatrix ?? CreateDistanceMatrix();
+      }
+
+      if (distanceMatrix != null) return distanceMatrix[start, end];
+      return CalculateDistance(start, end);
+    }
+
+    public virtual double GetInsertionDistance(int start, int customer, int end, IVRPEncoding solution,
+      out double startDistance, out double endDistance) {
+      double distance = GetDistance(start, end, solution);
+
+      startDistance = GetDistance(start, customer, solution);
+      endDistance = GetDistance(customer, end, solution);
+
+      double newDistance = startDistance + endDistance;
+
+      return newDistance - distance;
+    }
+
+    public bool Feasible(IVRPEncoding solution) {
+      return evaluator.Feasible(
+        evaluator.Evaluate(
+          this, solution));
+    }
+
+    public bool TourFeasible(Tour tour, IVRPEncoding solution) {
+      return evaluator.Feasible(
+        evaluator.EvaluateTour(
+        this, tour, solution));
+    }
+
+    public VRPEvaluation Evaluate(IVRPEncoding solution) {
+      return evaluator.Evaluate(this, solution);
+    }
+
+    public VRPEvaluation EvaluateTour(Tour tour, IVRPEncoding solution) {
+      return evaluator.EvaluateTour(this, tour, solution);
+    }
+
+    public bool Feasible(VRPEvaluation eval) {
+      return evaluator.Feasible(eval);
+    }
+
+    public double GetInsertionCosts(VRPEvaluation eval, IVRPEncoding solution, int customer, int tour, int index, out bool feasible) {
+      return evaluator.GetInsertionCosts(this, solution, eval, customer, tour, index, out feasible);
+    }
+
+
+    public event EventHandler EvaluationChanged;
+
+    protected void EvalBestKnownSolution() {
+      EventHandler tmp = EvaluationChanged;
+      if (tmp != null)
+        tmp(this, null);
+    }
+
+    protected abstract IVRPEvaluator Evaluator { get; }
+    protected abstract IVRPCreator Creator { get; }
+
+    [StorableConstructor]
+    protected VRPProblemInstance(bool deserializing) : base(deserializing) { }
+
+    public VRPProblemInstance()
+      : base() {
+      Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", new DoubleMatrix()));
+      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true)));
+      Parameters.Add(new ValueParameter<IntValue>("Vehicles", "The number of vehicles.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<DoubleArray>("Demand", "The demand of each customer.", new DoubleArray()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalFleetUsageFactor", "The fleet usage factor considered in the evaluation.", new DoubleValue(0)));
+      Parameters.Add(new ValueParameter<DoubleValue>("EvalDistanceFactor", "The distance factor considered in the evaluation.", new DoubleValue(1)));
+
+      evaluator = Evaluator;
+      AttachEventHandlers();
+    }
+
+    protected VRPProblemInstance(VRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      evaluator = Evaluator;
+      AttachEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      evaluator = Evaluator;
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      DistanceFactorParameter.ValueChanged += new EventHandler(DistanceFactorParameter_ValueChanged);
+      DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
+      FleetUsageFactorParameter.ValueChanged += new EventHandler(FleetUsageFactorParameter_ValueChanged);
+      FleetUsageFactorParameter.Value.ValueChanged += new EventHandler(FleetUsageFactor_ValueChanged);
+      DistanceMatrixParameter.ValueChanged += new EventHandler(DistanceMatrixParameter_ValueChanged);
+      if (DistanceMatrix != null) {
+        DistanceMatrix.ItemChanged += new EventHandler<EventArgs<int, int>>(DistanceMatrix_ItemChanged);
+        DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
+      }
+      UseDistanceMatrixParameter.ValueChanged += new EventHandler(UseDistanceMatrixParameter_ValueChanged);
+      UseDistanceMatrix.ValueChanged += new EventHandler(UseDistanceMatrix_ValueChanged);
+    }
+
+    public virtual void InitializeState() {
+    }
+
+    public virtual void ClearState() {
+    }
+
+    #region Event handlers
+    void DistanceFactorParameter_ValueChanged(object sender, EventArgs e) {
+      DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void DistanceFactor_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void FleetUsageFactorParameter_ValueChanged(object sender, EventArgs e) {
+      FleetUsageFactorParameter.Value.ValueChanged += new EventHandler(FleetUsageFactor_ValueChanged);
+      EvalBestKnownSolution();
+    }
+    void FleetUsageFactor_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void DistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
+      if (DistanceMatrix != null) {
+        DistanceMatrix.ItemChanged += new EventHandler<EventArgs<int, int>>(DistanceMatrix_ItemChanged);
+        DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
+      }
+      distanceMatrix = DistanceMatrix;
+      EvalBestKnownSolution();
+    }
+    void DistanceMatrix_Reset(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    void DistanceMatrix_ItemChanged(object sender, EventArgs<int, int> e) {
+      distanceMatrix = DistanceMatrix;
+      EvalBestKnownSolution();
+    }
+    void UseDistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
+      UseDistanceMatrix.ValueChanged += new EventHandler(UseDistanceMatrix_ValueChanged);
+      if (!UseDistanceMatrix.Value)
+        distanceMatrix = null;
+      EvalBestKnownSolution();
+    }
+    void UseDistanceMatrix_ValueChanged(object sender, EventArgs e) {
+      if (!UseDistanceMatrix.Value)
+        distanceMatrix = null;
+      EvalBestKnownSolution();
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+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.VehicleRouting")]
+[assembly: AssemblyDescription("HeuristicLab Vehicle Routing Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("10E4FF40-80AF-4C6F-93EE-B30E818BBFA2")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.7.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SimilarityCalculators/VRPSimilarityCalculator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SimilarityCalculators/VRPSimilarityCalculator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SimilarityCalculators/VRPSimilarityCalculator.cs	(revision 15895)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  /// <summary>
+  /// An operator which performs similarity calculation between two VRP solutions.
+  /// </summary>
+  /// <remarks>
+  /// The operator calculates the similarity based on the number of edges the two solutions have in common.
+  /// </remarks>
+  [Item("VRPSimilarityCalculator", "An operator which performs similarity calculation between two VRP solutions.")]
+  [StorableClass]
+  public sealed class VRPSimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator {
+    protected override bool IsCommutative { get { return true; } }
+
+    [Storable]
+    public IVRPProblemInstance ProblemInstance { get; set; }
+
+    private VRPSimilarityCalculator(bool deserializing) : base(deserializing) { }
+    private VRPSimilarityCalculator(VRPSimilarityCalculator original, Cloner cloner)
+      : base(original, cloner) {
+      this.ProblemInstance = cloner.Clone(original.ProblemInstance);
+    }
+    public VRPSimilarityCalculator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPSimilarityCalculator(this, cloner);
+    }
+
+    public static double CalculateSimilarity(PotvinEncoding left, PotvinEncoding right) {
+      if (left == null || right == null)
+        throw new ArgumentException("Cannot calculate similarity because one of the provided solutions or both are null.");
+      if (left == right) return 1.0;
+
+      // extract edges from first solution
+      var edges1 = new List<Tuple<int, int>>();
+      foreach (Tour tour in left.Tours) {
+        edges1.Add(new Tuple<int, int>(0, tour.Stops[0]));
+        for (int i = 0; i < tour.Stops.Count - 1; i++)
+          edges1.Add(new Tuple<int, int>(tour.Stops[i], tour.Stops[i + 1]));
+        edges1.Add(new Tuple<int, int>(tour.Stops[tour.Stops.Count - 1], 0));
+      }
+
+      // extract edges from second solution
+      var edges2 = new List<Tuple<int, int>>();
+      foreach (Tour tour in right.Tours) {
+        edges2.Add(new Tuple<int, int>(0, tour.Stops[0]));
+        for (int i = 0; i < tour.Stops.Count - 1; i++)
+          edges2.Add(new Tuple<int, int>(tour.Stops[i], tour.Stops[i + 1]));
+        edges2.Add(new Tuple<int, int>(tour.Stops[tour.Stops.Count - 1], 0));
+      }
+
+      if (edges1.Count + edges2.Count == 0)
+        throw new ArgumentException("Cannot calculate diversity because no tours exist.");
+
+      int identicalEdges = 0;
+      foreach (var edge in edges1) {
+        if (edges2.Any(x => x.Equals(edge)))
+          identicalEdges++;
+      }
+
+      return identicalEdges * 2.0 / (edges1.Count + edges2.Count);
+    }
+
+    public override double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution) {
+      var sol1 = leftSolution.Variables[SolutionVariableName].Value as IVRPEncoding;
+      var sol2 = rightSolution.Variables[SolutionVariableName].Value as IVRPEncoding;
+
+      var potvinSol1 = sol1 is PotvinEncoding ? sol1 as PotvinEncoding : PotvinEncoding.ConvertFrom(sol1, ProblemInstance);
+      var potvinSol2 = sol2 is PotvinEncoding ? sol2 as PotvinEncoding : PotvinEncoding.ConvertFrom(sol2, ProblemInstance);
+
+      return CalculateSimilarity(potvinSol1, potvinSol2);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SolutionParser.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SolutionParser.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/SolutionParser.cs	(revision 15895)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  class SolutionParser {
+    private string file;
+
+    private List<List<int>> routes;
+
+    public List<List<int>> Routes {
+      get {
+        return routes;
+      }
+    }
+
+    public SolutionParser(string file) {
+      this.file = file;
+      this.routes = new List<List<int>>();
+    }
+
+    public void Parse() {
+      this.routes.Clear();
+      using (StreamReader reader = new StreamReader(file)) {
+        String line;
+        while ((line = reader.ReadLine()) != null) {
+          string[] token = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+
+          if (token.Length > 2) {
+            List<int> route = new List<int>();
+
+            for (int i = 2; i < token.Length; i++) {
+              route.Add(int.Parse(token[i]));
+            }
+
+            routes.Add(route);
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedOperator.cs	(revision 15895)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IHeterogenousCapacitatedOperator : IHomogenousCapacitatedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Heterogenous/IHeterogenousCapacitatedProblemInstance.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IHeterogenousCapacitatedProblemInstance : ICapacitatedProblemInstance {
+    DoubleArray Capacity { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedOperator.cs	(revision 15895)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IHomogenousCapacitatedOperator : ICapacitatedOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/Homogenous/IHomogenousCapacitatedProblemInstance.cs	(revision 15895)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IHomogenousCapacitatedProblemInstance : ICapacitatedProblemInstance {
+    DoubleValue Capacity { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ICapacitatedOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/Capacitated/ICapacitatedProblemInstance.cs	(revision 15895)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ICapacitatedProblemInstance : IVRPProblemInstance {
+    DoubleValue OverloadPenalty { get; }
+    DoubleValue CurrentOverloadPenalty { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/General/IGeneralVRPOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/General/IGeneralVRPOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/General/IGeneralVRPOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IGeneralVRPOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IMultiDepotOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/MultiDepot/IMultiDepotProblemInstance.cs	(revision 15895)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IMultiDepotProblemInstance : IVRPProblemInstance {
+    IntValue Depots { get; }
+    IntArray VehicleDepotAssignment { get; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IPickupAndDeliveryOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/PickupAndDelivery/IPickupAndDeliveryProblemInstance.cs	(revision 15895)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface IPickupAndDeliveryProblemInstance : IVRPProblemInstance {
+    IntArray PickupDeliveryLocation { get; }
+    DoubleValue PickupViolationPenalty { get; }
+    DoubleValue CurrentPickupViolationPenalty { get; set; }
+
+    int GetPickupDeliveryLocation(int city);
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ISingleDepotOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/SingleDepot/ISingleDepotProblemInstance.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ISingleDepotProblemInstance : IVRPProblemInstance {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedOperator.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedOperator.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedOperator.cs	(revision 15895)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ITimeWindowedOperator : IVRPOperator {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedProblemInstance.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedProblemInstance.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/Variants/TimeWindowed/ITimeWindowedProblemInstance.cs	(revision 15895)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Data;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+
+namespace HeuristicLab.Problems.VehicleRouting.Variants {
+  public interface ITimeWindowedProblemInstance : IVRPProblemInstance {
+    DoubleArray ReadyTime { get; }
+    DoubleArray DueTime { get; }
+    DoubleArray ServiceTime { get; }
+    DoubleValue TimeFactor { get; }
+    DoubleValue TardinessPenalty { get; }
+    DoubleValue CurrentTardinessPenalty { get; set; }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 15895)
@@ -0,0 +1,409 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis;
+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.Problems.Instances;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Interpreters;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Problems.VehicleRouting.Variants;
+
+namespace HeuristicLab.Problems.VehicleRouting {
+  [Item("Vehicle Routing Problem (VRP)", "Represents a Vehicle Routing Problem.")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 110)]
+  [StorableClass]
+  public sealed class VehicleRoutingProblem : Problem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent, IProblemInstanceConsumer<IVRPData> {
+    public string Filename { get; set; }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
+    }
+
+    #region Parameter Properties
+    public ValueParameter<BoolValue> MaximizationParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.MaximizationParameter {
+      get { return MaximizationParameter; }
+    }
+    public ValueParameter<IVRPProblemInstance> ProblemInstanceParameter {
+      get { return (ValueParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
+    }
+    public OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.BestKnownQualityParameter {
+      get { return BestKnownQualityParameter; }
+    }
+    public OptionalValueParameter<VRPSolution> BestKnownSolutionParameter {
+      get { return (OptionalValueParameter<VRPSolution>)Parameters["BestKnownSolution"]; }
+    }
+    public IConstrainedValueParameter<IVRPCreator> SolutionCreatorParameter {
+      get { return (IConstrainedValueParameter<IVRPCreator>)Parameters["SolutionCreator"]; }
+    }
+    IParameter IHeuristicOptimizationProblem.SolutionCreatorParameter {
+      get { return SolutionCreatorParameter; }
+    }
+    public IValueParameter<IVRPEvaluator> EvaluatorParameter {
+      get { return (IValueParameter<IVRPEvaluator>)Parameters["Evaluator"]; }
+    }
+    IParameter IHeuristicOptimizationProblem.EvaluatorParameter {
+      get { return EvaluatorParameter; }
+    }
+    #endregion
+
+    #region Properties
+    public IVRPProblemInstance ProblemInstance {
+      get { return ProblemInstanceParameter.Value; }
+      set { ProblemInstanceParameter.Value = value; }
+    }
+
+    public VRPSolution BestKnownSolution {
+      get { return BestKnownSolutionParameter.Value; }
+      set { BestKnownSolutionParameter.Value = value; }
+    }
+
+    public DoubleValue BestKnownQuality {
+      get { return BestKnownQualityParameter.Value; }
+      set { BestKnownQualityParameter.Value = value; }
+    }
+
+    public ISingleObjectiveEvaluator Evaluator {
+      get { return EvaluatorParameter.Value; }
+    }
+
+    IEvaluator IHeuristicOptimizationProblem.Evaluator {
+      get { return this.Evaluator; }
+    }
+
+    ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator {
+      get { return SolutionCreatorParameter.Value; }
+    }
+    public IVRPCreator SolutionCreator {
+      get { return SolutionCreatorParameter.Value; }
+      set { SolutionCreatorParameter.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private VehicleRoutingProblem(bool deserializing) : base(deserializing) { }
+    public VehicleRoutingProblem()
+      : base() {
+      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the Vehicle Routing Problem is a minimization problem.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this VRP instance."));
+      Parameters.Add(new OptionalValueParameter<VRPSolution>("BestKnownSolution", "The best known solution of this VRP instance."));
+
+      Parameters.Add(new ConstrainedValueParameter<IVRPCreator>("SolutionCreator", "The operator which should be used to create new VRP solutions."));
+      Parameters.Add(new ValueParameter<IVRPEvaluator>("Evaluator", "The operator which should be used to evaluate VRP solutions."));
+
+      EvaluatorParameter.Hidden = true;
+
+      InitializeRandomVRPInstance();
+      InitializeOperators();
+
+      AttachEventHandlers();
+      AttachProblemInstanceEventHandlers();
+
+      EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      cloner.Clone(ProblemInstance);
+      return new VehicleRoutingProblem(this, cloner);
+    }
+
+    private VehicleRoutingProblem(VehicleRoutingProblem original, Cloner cloner)
+      : base(original, cloner) {
+      this.AttachEventHandlers();
+      this.AttachProblemInstanceEventHandlers();
+
+      ProblemInstance.SolutionEvaluator = EvaluatorParameter.Value;
+    }
+
+    #region Events
+    public event EventHandler SolutionCreatorChanged;
+    private void OnSolutionCreatorChanged() {
+      EventHandler handler = SolutionCreatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler EvaluatorChanged;
+    private void OnEvaluatorChanged() {
+      EventHandler handler = EvaluatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+      AttachProblemInstanceEventHandlers();
+
+      ProblemInstance.SolutionEvaluator = EvaluatorParameter.Value;
+    }
+
+    [Storable(Name = "operators", AllowOneWay = true)]
+    private List<IOperator> StorableOperators {
+      set { Operators.AddRange(value); }
+    }
+
+    private void AttachEventHandlers() {
+      ProblemInstanceParameter.ValueChanged += new EventHandler(ProblemInstanceParameter_ValueChanged);
+      BestKnownSolutionParameter.ValueChanged += new EventHandler(BestKnownSolutionParameter_ValueChanged);
+      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
+      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
+    }
+
+    private void AttachProblemInstanceEventHandlers() {
+      if (ProblemInstance != null) {
+        ProblemInstance.EvaluationChanged += new EventHandler(ProblemInstance_EvaluationChanged);
+      }
+    }
+
+    private void EvalBestKnownSolution() {
+      if (BestKnownSolution != null) {
+        //call evaluator
+        BestKnownQuality = new DoubleValue(ProblemInstance.Evaluate(BestKnownSolution.Solution).Quality);
+        BestKnownSolution.Quality = BestKnownQuality;
+      }
+    }
+
+    void BestKnownSolutionParameter_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+
+    void ProblemInstance_EvaluationChanged(object sender, EventArgs e) {
+      BestKnownQuality = null;
+      EvalBestKnownSolution();
+    }
+
+    void ProblemInstanceParameter_ValueChanged(object sender, EventArgs e) {
+      InitializeOperators();
+      AttachProblemInstanceEventHandlers();
+
+      EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
+
+      OnSolutionCreatorChanged();
+      OnEvaluatorChanged();
+      OnOperatorsChanged();
+    }
+
+    public void SetProblemInstance(IVRPProblemInstance instance) {
+      ProblemInstanceParameter.ValueChanged -= new EventHandler(ProblemInstanceParameter_ValueChanged);
+
+      ProblemInstance = instance;
+      AttachProblemInstanceEventHandlers();
+
+      OnSolutionCreatorChanged();
+      OnEvaluatorChanged();
+
+      ProblemInstanceParameter.ValueChanged += new EventHandler(ProblemInstanceParameter_ValueChanged);
+    }
+
+    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
+      OnSolutionCreatorChanged();
+    }
+    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
+      if (ProblemInstance != null)
+        ProblemInstance.SolutionEvaluator = EvaluatorParameter.Value;
+      OnEvaluatorChanged();
+    }
+
+    private void InitializeOperators() {
+      var solutionCreatorParameter = SolutionCreatorParameter as ConstrainedValueParameter<IVRPCreator>;
+      solutionCreatorParameter.ValidValues.Clear();
+
+      Operators.Clear();
+
+      if (ProblemInstance != null) {
+        Operators.AddRange(
+        ProblemInstance.Operators.Concat(
+          ApplicationManager.Manager.GetInstances<IGeneralVRPOperator>().Cast<IOperator>()).OrderBy(op => op.Name));
+        Operators.Add(new VRPSimilarityCalculator());
+        Operators.Add(new QualitySimilarityCalculator());
+        Operators.Add(new NoSimilarityCalculator());
+        Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
+        IVRPCreator defaultCreator = null;
+        foreach (IVRPCreator creator in Operators.Where(o => o is IVRPCreator)) {
+          solutionCreatorParameter.ValidValues.Add(creator);
+          if (creator is Encodings.Alba.RandomCreator)
+            defaultCreator = creator;
+        }
+        Operators.Add(new AlbaLambdaInterchangeLocalImprovementOperator());
+        if (defaultCreator != null)
+          solutionCreatorParameter.Value = defaultCreator;
+      }
+
+      ParameterizeOperators();
+    }
+
+    private void ParameterizeOperators() {
+      foreach (IOperator op in Operators.OfType<IOperator>()) {
+        if (op is IMultiVRPOperator) {
+          (op as IMultiVRPOperator).SetOperators(Operators.OfType<IOperator>());
+        }
+      }
+      if (ProblemInstance != null) {
+        foreach (ISingleObjectiveImprovementOperator op in Operators.OfType<ISingleObjectiveImprovementOperator>()) {
+          op.SolutionParameter.ActualName = SolutionCreator.VRPToursParameter.ActualName;
+          op.SolutionParameter.Hidden = true;
+        }
+        foreach (ISingleObjectivePathRelinker op in Operators.OfType<ISingleObjectivePathRelinker>()) {
+          op.ParentsParameter.ActualName = SolutionCreator.VRPToursParameter.ActualName;
+          op.ParentsParameter.Hidden = true;
+        }
+        foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) {
+          op.SolutionVariableName = SolutionCreator.VRPToursParameter.ActualName;
+          op.QualityVariableName = ProblemInstance.SolutionEvaluator.QualityParameter.ActualName;
+          var calc = op as VRPSimilarityCalculator;
+          if (calc != null) calc.ProblemInstance = ProblemInstance;
+        }
+      }
+    }
+
+    #endregion
+
+    private void InitializeRandomVRPInstance() {
+      System.Random rand = new System.Random();
+
+      CVRPTWProblemInstance problem = new CVRPTWProblemInstance();
+      int cities = 100;
+
+      problem.Coordinates = new DoubleMatrix(cities + 1, 2);
+      problem.Demand = new DoubleArray(cities + 1);
+      problem.DueTime = new DoubleArray(cities + 1);
+      problem.ReadyTime = new DoubleArray(cities + 1);
+      problem.ServiceTime = new DoubleArray(cities + 1);
+
+      problem.Vehicles.Value = 100;
+      problem.Capacity.Value = 200;
+
+      for (int i = 0; i <= cities; i++) {
+        problem.Coordinates[i, 0] = rand.Next(0, 100);
+        problem.Coordinates[i, 1] = rand.Next(0, 100);
+
+        if (i == 0) {
+          problem.Demand[i] = 0;
+          problem.DueTime[i] = Int16.MaxValue;
+          problem.ReadyTime[i] = 0;
+          problem.ServiceTime[i] = 0;
+        } else {
+          problem.Demand[i] = rand.Next(10, 50);
+          problem.DueTime[i] = rand.Next((int)Math.Ceiling(problem.GetDistance(0, i, null)), 1200);
+          problem.ReadyTime[i] = problem.DueTime[i] - rand.Next(0, 100);
+          problem.ServiceTime[i] = 90;
+        }
+      }
+
+      this.ProblemInstance = problem;
+    }
+
+    public void ImportSolution(string solutionFileName) {
+      SolutionParser parser = new SolutionParser(solutionFileName);
+      parser.Parse();
+
+      HeuristicLab.Problems.VehicleRouting.Encodings.Potvin.PotvinEncoding encoding = new Encodings.Potvin.PotvinEncoding(ProblemInstance);
+
+      int cities = 0;
+      foreach (List<int> route in parser.Routes) {
+        Tour tour = new Tour();
+        tour.Stops.AddRange(route);
+        cities += tour.Stops.Count;
+
+        encoding.Tours.Add(tour);
+      }
+
+      if (cities != ProblemInstance.Coordinates.Rows - 1)
+        ErrorHandling.ShowErrorDialog(new Exception("The optimal solution does not seem to correspond with the problem data"));
+      else {
+        VRPSolution solution = new VRPSolution(ProblemInstance, encoding, new DoubleValue(0));
+        BestKnownSolutionParameter.Value = solution;
+      }
+    }
+
+    #region Instance Consuming
+    public void Load(IVRPData data, IVRPDataInterpreter interpreter) {
+      VRPInstanceDescription instance = interpreter.Interpret(data);
+
+      Name = instance.Name;
+      Description = instance.Description;
+
+      BestKnownQuality = null;
+      BestKnownSolution = null;
+
+      if (ProblemInstance != null && instance.ProblemInstance != null &&
+        instance.ProblemInstance.GetType() == ProblemInstance.GetType())
+        SetProblemInstance(instance.ProblemInstance);
+      else
+        ProblemInstance = instance.ProblemInstance;
+
+      OnReset();
+
+      if (instance.BestKnownQuality != null) {
+        BestKnownQuality = new DoubleValue((double)instance.BestKnownQuality);
+      }
+
+      if (instance.BestKnownSolution != null) {
+        VRPSolution solution = new VRPSolution(ProblemInstance, instance.BestKnownSolution, new DoubleValue(0));
+        BestKnownSolution = solution;
+      }
+    }
+    #endregion
+
+    #region IProblemInstanceConsumer<VRPData> Members
+
+    public void Load(IVRPData data) {
+      var interpreterDataType = data.GetType();
+      var interpreterType = typeof(IVRPDataInterpreter<>).MakeGenericType(interpreterDataType);
+
+      var interpreters = ApplicationManager.Manager.GetTypes(interpreterType);
+
+      var concreteInterpreter = interpreters.Single(t => GetInterpreterDataType(t) == interpreterDataType);
+
+      Load(data, (IVRPDataInterpreter)Activator.CreateInstance(concreteInterpreter));
+    }
+
+    private Type GetInterpreterDataType(Type type) {
+      var parentInterfaces = type.BaseType.GetInterfaces();
+      var interfaces = type.GetInterfaces().Except(parentInterfaces);
+
+      var interpreterInterface = interfaces.Single(i => typeof(IVRPDataInterpreter).IsAssignableFrom(i));
+      return interpreterInterface.GetGenericArguments()[0];
+    }
+
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.Designer.cs	(revision 15895)
@@ -0,0 +1,162 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Windows.Forms;
+
+namespace HeuristicLab.Scripting.Views {
+  partial class CSharpScriptView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.startStopButton = new System.Windows.Forms.Button();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.variableStoreView = new HeuristicLab.Scripting.Views.VariableStoreView();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(60, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(750, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(816, 4);
+      // 
+      // startStopButton
+      // 
+      this.startStopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.startStopButton.Location = new System.Drawing.Point(36, 26);
+      this.startStopButton.Name = "startStopButton";
+      this.startStopButton.Size = new System.Drawing.Size(24, 24);
+      this.startStopButton.TabIndex = 1;
+      this.startStopButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.startStopButton, "Run (F5)");
+      this.startStopButton.UseVisualStyleBackColor = true;
+      this.startStopButton.Click += new System.EventHandler(this.StartStopButtonOnClick);
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.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.splitContainer2.Location = new System.Drawing.Point(3, 56);
+      this.splitContainer2.Name = "splitContainer2";
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.splitContainer1);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.variableStoreView);
+      this.splitContainer2.Panel2.Controls.Add(this.viewHost);
+      this.splitContainer2.Size = new System.Drawing.Size(829, 543);
+      this.splitContainer2.SplitterDistance = 637;
+      this.splitContainer2.TabIndex = 7;
+      //
+      // splitContainer1
+      //
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Dock = DockStyle.Fill;
+      // 
+      // variableStoreView
+      // 
+      this.variableStoreView.Caption = "ItemCollection View";
+      this.variableStoreView.Content = null;
+      this.variableStoreView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableStoreView.Location = new System.Drawing.Point(0, 0);
+      this.variableStoreView.Name = "variableStoreView";
+      this.variableStoreView.ReadOnly = false;
+      this.variableStoreView.Size = new System.Drawing.Size(188, 543);
+      this.variableStoreView.TabIndex = 0;
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(188, 543);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // ScriptView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer2);
+      this.Controls.Add(this.startStopButton);
+      this.Name = "ScriptView";
+      this.Size = new System.Drawing.Size(835, 602);
+      this.Controls.SetChildIndex(this.startStopButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer2, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button startStopButton;
+    protected System.Windows.Forms.SplitContainer splitContainer2;
+    protected MainForm.WindowsForms.ViewHost viewHost;
+    protected VariableStoreView variableStoreView;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs	(revision 15895)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Scripting.Views {
+
+  [View("C# Script View")]
+  [Content(typeof(CSharpScript), true)]
+  public partial class CSharpScriptView : ScriptView {
+    protected bool Running { get; set; }
+
+    public new CSharpScript Content {
+      get { return (CSharpScript)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public CSharpScriptView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ScriptExecutionStarted += ContentOnScriptExecutionStarted;
+      Content.ScriptExecutionFinished += ContentOnScriptExecutionFinished;
+      Content.ConsoleOutputChanged += ContentOnConsoleOutputChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ScriptExecutionStarted -= ContentOnScriptExecutionStarted;
+      Content.ScriptExecutionFinished -= ContentOnScriptExecutionFinished;
+      Content.ConsoleOutputChanged -= ContentOnConsoleOutputChanged;
+      base.DeregisterContentEvents();
+    }
+
+    #region Content event handlers
+    protected virtual void ContentOnScriptExecutionStarted(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke((Action<object, EventArgs>)ContentOnScriptExecutionStarted, sender, e);
+      else {
+        Locked = true;
+        ReadOnly = true;
+        startStopButton.Image = VSImageLibrary.Stop;
+        toolTip.SetToolTip(startStopButton, "Stop (Shift+F5)");
+        infoTabControl.SelectedTab = outputTabPage;
+      }
+    }
+    protected virtual void ContentOnScriptExecutionFinished(object sender, EventArgs<Exception> e) {
+      if (InvokeRequired)
+        Invoke((Action<object, EventArgs<Exception>>)ContentOnScriptExecutionFinished, sender, e);
+      else {
+        Locked = false;
+        ReadOnly = false;
+        startStopButton.Image = VSImageLibrary.Play;
+        toolTip.SetToolTip(startStopButton, "Run (F5)");
+        Running = false;
+        var ex = e.Value;
+        if (ex != null)
+          PluginInfrastructure.ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void ContentOnConsoleOutputChanged(object sender, EventArgs<string> e) {
+      if (InvokeRequired)
+        Invoke((Action<object, EventArgs<string>>)ContentOnConsoleOutputChanged, sender, e);
+      else {
+        outputTextBox.AppendText(e.Value);
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        variableStoreView.Content = null;
+      } else {
+        variableStoreView.Content = Content.VariableStore;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      startStopButton.Enabled = Content != null && (!Locked || Running);
+    }
+
+    protected virtual void StartStopButtonOnClick(object sender, EventArgs e) {
+      if (Running) {
+        Content.Kill();
+      } else
+        if (Compile()) {
+          outputTextBox.Clear();
+          Content.Execute();
+          Running = true;
+        }
+    }
+
+    #region global HotKeys
+    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
+      switch (keyData) {
+        case Keys.F5:
+          if (Content != null && !Locked && !Running) {
+            if (Compile()) {
+              outputTextBox.Clear();
+              Content.Execute();
+              Running = true;
+            }
+          }
+          return true;
+        case Keys.F5 | Keys.Shift:
+          if (Running) Content.Kill();
+          return true;
+        case Keys.F6:
+          if (!Running) Compile();
+          return true;
+      }
+      return base.ProcessCmdKey(ref msg, keyData); ;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/HeuristicLab.Scripting.Views-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/HeuristicLab.Scripting.Views-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/HeuristicLab.Scripting.Views-3.3.csproj	(revision 15895)
@@ -0,0 +1,190 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.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>{0C2917C8-7AA8-4E18-800A-C4D064F992ED}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Scripting.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Scripting.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\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>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.CodeEditor-3.4">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.CodeEditor-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="CSharpScriptView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CSharpScriptView.Designer.cs">
+      <DependentUpon>CSharpScriptView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ProgrammableItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProgrammableItemView.Designer.cs">
+      <DependentUpon>ProgrammableItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScriptView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScriptView.Designer.cs">
+      <DependentUpon>ScriptView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableStoreView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableStoreView.Designer.cs">
+      <DependentUpon>VariableStoreView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Scripting\3.3\HeuristicLab.Scripting-3.3.csproj">
+      <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
+      <Name>HeuristicLab.Scripting-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Scripting.Views {
+  [Plugin("HeuristicLab.Scripting.Views", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Scripting.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.CodeEditor", "3.4")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabScriptingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.Designer.cs	(revision 15895)
@@ -0,0 +1,280 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Scripting.Views {
+  partial class ProgrammableItemView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form 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.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.codeGroupBox = new System.Windows.Forms.GroupBox();
+      this.codeEditor = new HeuristicLab.CodeEditor.CodeEditor();
+      this.errorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.errorsListView = new System.Windows.Forms.ListView();
+      this.iconColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.categoryColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.errorNumberColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.lineColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.columnColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.compileButton = new System.Windows.Forms.Button();
+      this.compilationLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.variableStoreView = new HeuristicLab.Scripting.Views.VariableStoreView();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.codeGroupBox.SuspendLayout();
+      this.errorsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.codeGroupBox);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.errorsGroupBox);
+      this.splitContainer2.Size = new System.Drawing.Size(357, 454);
+      this.splitContainer2.SplitterDistance = 382;
+      this.splitContainer2.TabIndex = 3;
+      // 
+      // codeGroupBox
+      // 
+      this.codeGroupBox.Controls.Add(this.codeEditor);
+      this.codeGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.codeGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.codeGroupBox.Name = "codeGroupBox";
+      this.codeGroupBox.Size = new System.Drawing.Size(357, 382);
+      this.codeGroupBox.TabIndex = 0;
+      this.codeGroupBox.TabStop = false;
+      this.codeGroupBox.Text = "Code";
+      // 
+      // codeEditor
+      // 
+      this.codeEditor.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.codeEditor.Location = new System.Drawing.Point(6, 19);
+      this.codeEditor.Name = "codeEditor";
+      this.codeEditor.Prefix = "";
+      this.codeEditor.ReadOnly = false;
+      this.codeEditor.Size = new System.Drawing.Size(345, 357);
+      this.codeEditor.Suffix = "";
+      this.codeEditor.TabIndex = 0;
+      this.codeEditor.UserCode = "";
+      this.codeEditor.Validated += new System.EventHandler(this.codeEditor_Validated);
+      // 
+      // errorsGroupBox
+      // 
+      this.errorsGroupBox.Controls.Add(this.errorsListView);
+      this.errorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.errorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.errorsGroupBox.Name = "errorsGroupBox";
+      this.errorsGroupBox.Size = new System.Drawing.Size(357, 68);
+      this.errorsGroupBox.TabIndex = 0;
+      this.errorsGroupBox.TabStop = false;
+      this.errorsGroupBox.Text = "Errors";
+      // 
+      // errorsListView
+      // 
+      this.errorsListView.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.errorsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.iconColumnHeader,
+            this.categoryColumnHeader,
+            this.errorNumberColumnHeader,
+            this.lineColumnHeader,
+            this.columnColumnHeader,
+            this.descriptionColumnHeader});
+      this.errorsListView.FullRowSelect = true;
+      this.errorsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.errorsListView.HideSelection = false;
+      this.errorsListView.Location = new System.Drawing.Point(6, 19);
+      this.errorsListView.Name = "errorsListView";
+      this.errorsListView.Size = new System.Drawing.Size(345, 43);
+      this.errorsListView.SmallImageList = this.imageList;
+      this.errorsListView.TabIndex = 0;
+      this.errorsListView.UseCompatibleStateImageBehavior = false;
+      this.errorsListView.View = System.Windows.Forms.View.Details;
+      this.errorsListView.DoubleClick += new System.EventHandler(this.errorsListView_DoubleClick);
+      // 
+      // iconColumnHeader
+      // 
+      this.iconColumnHeader.Text = "";
+      // 
+      // categoryColumnHeader
+      // 
+      this.categoryColumnHeader.Text = "Category";
+      // 
+      // errorNumberColumnHeader
+      // 
+      this.errorNumberColumnHeader.Text = "Error Number";
+      // 
+      // lineColumnHeader
+      // 
+      this.lineColumnHeader.Text = "Line";
+      // 
+      // columnColumnHeader
+      // 
+      this.columnColumnHeader.Text = "Column";
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // compileButton
+      // 
+      this.compileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Script;
+      this.compileButton.Location = new System.Drawing.Point(3, 3);
+      this.compileButton.Name = "compileButton";
+      this.compileButton.Size = new System.Drawing.Size(24, 24);
+      this.compileButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.compileButton, "Compile (F6)");
+      this.compileButton.UseVisualStyleBackColor = true;
+      this.compileButton.Click += new System.EventHandler(this.compileButton_Click);
+      // 
+      // compilationLabel
+      // 
+      this.compilationLabel.AutoSize = true;
+      this.compilationLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
+      this.compilationLabel.Location = new System.Drawing.Point(66, 9);
+      this.compilationLabel.Name = "compilationLabel";
+      this.compilationLabel.Size = new System.Drawing.Size(69, 13);
+      this.compilationLabel.TabIndex = 1;
+      this.compilationLabel.Text = "Not compiled";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 33);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.splitContainer2);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.variableStoreView);
+      this.splitContainer1.Size = new System.Drawing.Size(486, 454);
+      this.splitContainer1.SplitterDistance = 357;
+      this.splitContainer1.TabIndex = 4;
+      // 
+      // variableStoreView
+      // 
+      this.variableStoreView.Caption = "ItemCollection View";
+      this.variableStoreView.Content = null;
+      this.variableStoreView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableStoreView.Location = new System.Drawing.Point(0, 0);
+      this.variableStoreView.Name = "variableStoreView";
+      this.variableStoreView.ReadOnly = false;
+      this.variableStoreView.Size = new System.Drawing.Size(125, 454);
+      this.variableStoreView.TabIndex = 0;
+      // 
+      // ProgrammableItemView
+      // 
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.compilationLabel);
+      this.Controls.Add(this.compileButton);
+      this.Name = "ProgrammableItemView";
+      this.Size = new System.Drawing.Size(486, 487);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.codeGroupBox.ResumeLayout(false);
+      this.errorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer2;
+    protected System.Windows.Forms.GroupBox errorsGroupBox;
+    protected System.Windows.Forms.Button compileButton;
+    protected CodeEditor.CodeEditor codeEditor;
+    protected System.Windows.Forms.ListView errorsListView;
+    protected System.Windows.Forms.ColumnHeader iconColumnHeader;
+    protected System.Windows.Forms.ColumnHeader categoryColumnHeader;
+    protected System.Windows.Forms.ColumnHeader errorNumberColumnHeader;
+    protected System.Windows.Forms.ColumnHeader lineColumnHeader;
+    protected System.Windows.Forms.ColumnHeader columnColumnHeader;
+    protected System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    protected System.Windows.Forms.Label compilationLabel;
+    protected System.Windows.Forms.ImageList imageList;
+    protected System.Windows.Forms.GroupBox codeGroupBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+    protected VariableStoreView variableStoreView;
+
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ProgrammableItemView.cs	(revision 15895)
@@ -0,0 +1,169 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.CodeDom.Compiler;
+using System.Drawing;
+using System.Globalization;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Scripting.Views {
+  [View("ProgrammableItem View")]
+  [Content(typeof(IProgrammableItem), false)]
+  public partial class ProgrammableItemView : ItemView {
+    public new IProgrammableItem Content {
+      get { return (IProgrammableItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProgrammableItemView() {
+      InitializeComponent();
+      errorsListView.SmallImageList.Images.AddRange(new Image[] { VSImageLibrary.Warning, VSImageLibrary.Error });
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CodeChanged -= Content_CodeChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CodeChanged += Content_CodeChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      errorsListView.Items.Clear();
+      if (Content == null) {
+        codeEditor.UserCode = string.Empty;
+        variableStoreView.Content = null;
+      } else {
+        codeEditor.UserCode = Content.Code;
+        foreach (var asm in Content.GetAssemblies())
+          codeEditor.AddAssembly(asm);
+        variableStoreView.Content = Content.VariableStore;
+      }
+      ShowCompilationResults();
+      UpdateCompilationLabel();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      compileButton.Enabled = Content != null && Content.CanChangeCode && !Locked && !ReadOnly;
+      codeEditor.Enabled = Content != null && !Locked;
+      codeEditor.ReadOnly = ReadOnly || Locked || ((Content != null) && !Content.CanChangeCode);
+      variableStoreView.ReadOnly = (Content != null) && !Content.CanChangeCode;
+    }
+
+    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, Keys keyData) {
+      switch (keyData) {
+        case Keys.F6:
+          if (Content != null && !Locked)
+            Compile();
+          return true;
+      }
+      return base.ProcessCmdKey(ref msg, keyData);
+    }
+
+    protected virtual void Content_CodeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_CodeChanged), sender, e);
+      else {
+        codeEditor.UserCode = Content.Code;
+      }
+    }
+
+    private void compileButton_Click(object sender, EventArgs e) {
+      Compile();
+    }
+    private void codeEditor_Validated(object sender, EventArgs e) {
+      if ((Content != null) && Content.CanChangeCode) Content.Code = codeEditor.UserCode;
+    }
+    private void errorsListView_DoubleClick(object sender, EventArgs e) {
+      if ((Content != null) && (Content.CompileErrors != null)) {
+        codeEditor.ShowCompileErrors(Content.CompileErrors);
+      }
+    }
+
+    #region Helpers
+    protected virtual void Compile() {
+      ReadOnly = true;
+      Locked = true;
+      errorsListView.Items.Clear();
+      try {
+        Content.Compile();
+      } catch (Exception ex) {
+        if (!(ex is InvalidOperationException) || (Content.CompileErrors == null))
+          ErrorHandling.ShowErrorDialog(this, ex);
+      }
+      ShowCompilationResults();
+      UpdateCompilationLabel();
+      ReadOnly = false;
+      Locked = false;
+    }
+
+    protected virtual void ShowCompilationResults() {
+      if ((Content == null) || (Content.CompileErrors == null) || (Content.CompileErrors.Count == 0)) return;
+      var errors = Content.CompileErrors.OfType<CompilerError>()
+                                      .OrderBy(x => x.IsWarning)
+                                      .ThenBy(x => x.Line)
+                                      .ThenBy(x => x.Column);
+      foreach (var e in errors) {
+        var item = new ListViewItem();
+        item.SubItems.AddRange(new[] {
+          e.IsWarning ? "Warning" : "Error",
+          e.ErrorNumber,
+          e.Line.ToString(CultureInfo.InvariantCulture),
+          e.Column.ToString(CultureInfo.InvariantCulture),
+          e.ErrorText
+        });
+        item.ImageIndex = e.IsWarning ? 0 : 1;
+        errorsListView.Items.Add(item);
+      }
+
+      foreach (ColumnHeader ch in errorsListView.Columns) {
+        // adjusts column width to width of column header
+        ch.Width = -2;
+      }
+
+      codeEditor.ShowCompileErrors(Content.CompileErrors);
+    }
+
+    protected virtual void UpdateCompilationLabel() {
+      if ((Content == null) || (Content.CompileErrors == null)) {
+        compilationLabel.ForeColor = SystemColors.ControlDarkDark;
+        compilationLabel.Text = "Not compiled";
+      } else if (Content.CompileErrors.HasErrors) {
+        compilationLabel.ForeColor = Color.DarkRed;
+        compilationLabel.Text = "Compilation failed";
+      } else {
+        compilationLabel.ForeColor = Color.DarkGreen;
+        compilationLabel.Text = "Compilation successful";
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Scripting.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("78ef015f-0dd7-4dea-9808-a605fe30fbd3")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.10.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs	(revision 15895)
@@ -0,0 +1,284 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.Scripting.Views {
+  partial class ScriptView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScriptView));
+      this.compilationLabel = new System.Windows.Forms.Label();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.compileButton = new System.Windows.Forms.Button();
+      this.infoTabControl = new System.Windows.Forms.TabControl();
+      this.outputTabPage = new System.Windows.Forms.TabPage();
+      this.outputTextBox = new System.Windows.Forms.TextBox();
+      this.errorListTabPage = new System.Windows.Forms.TabPage();
+      this.errorListView = new System.Windows.Forms.ListView();
+      this.iconColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.categoryColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.errorNumberColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.lineColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.columnColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.codeEditor = new HeuristicLab.CodeEditor.CodeEditor();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.infoTabControl.SuspendLayout();
+      this.outputTabPage.SuspendLayout();
+      this.errorListTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(69, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(741, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(816, 4);
+      // 
+      // compilationLabel
+      // 
+      this.compilationLabel.AutoSize = true;
+      this.compilationLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
+      this.compilationLabel.Location = new System.Drawing.Point(66, 32);
+      this.compilationLabel.Name = "compilationLabel";
+      this.compilationLabel.Size = new System.Drawing.Size(69, 13);
+      this.compilationLabel.TabIndex = 3;
+      this.compilationLabel.Text = "Not compiled";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // compileButton
+      // 
+      this.compileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Script;
+      this.compileButton.Location = new System.Drawing.Point(6, 26);
+      this.compileButton.Name = "compileButton";
+      this.compileButton.Size = new System.Drawing.Size(24, 24);
+      this.compileButton.TabIndex = 8;
+      this.compileButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.compileButton, "Compile (F6)");
+      this.compileButton.UseVisualStyleBackColor = true;
+      this.compileButton.Click += new System.EventHandler(this.CompileButtonOnClick);
+      // 
+      // infoTabControl
+      // 
+      this.infoTabControl.Controls.Add(this.outputTabPage);
+      this.infoTabControl.Controls.Add(this.errorListTabPage);
+      this.infoTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.infoTabControl.Location = new System.Drawing.Point(0, 0);
+      this.infoTabControl.Name = "infoTabControl";
+      this.infoTabControl.SelectedIndex = 0;
+      this.infoTabControl.Size = new System.Drawing.Size(832, 112);
+      this.infoTabControl.TabIndex = 1;
+      // 
+      // outputTabPage
+      // 
+      this.outputTabPage.Controls.Add(this.outputTextBox);
+      this.outputTabPage.Location = new System.Drawing.Point(4, 22);
+      this.outputTabPage.Name = "outputTabPage";
+      this.outputTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.outputTabPage.Size = new System.Drawing.Size(824, 86);
+      this.outputTabPage.TabIndex = 1;
+      this.outputTabPage.Text = "Output";
+      this.outputTabPage.UseVisualStyleBackColor = true;
+      // 
+      // outputTextBox
+      // 
+      this.outputTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.outputTextBox.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.outputTextBox.Location = new System.Drawing.Point(3, 3);
+      this.outputTextBox.Multiline = true;
+      this.outputTextBox.Name = "outputTextBox";
+      this.outputTextBox.ReadOnly = true;
+      this.outputTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.outputTextBox.Size = new System.Drawing.Size(818, 80);
+      this.outputTextBox.TabIndex = 0;
+      this.outputTextBox.WordWrap = false;
+      // 
+      // errorListTabPage
+      // 
+      this.errorListTabPage.Controls.Add(this.errorListView);
+      this.errorListTabPage.Location = new System.Drawing.Point(4, 22);
+      this.errorListTabPage.Name = "errorListTabPage";
+      this.errorListTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.errorListTabPage.Size = new System.Drawing.Size(824, 86);
+      this.errorListTabPage.TabIndex = 0;
+      this.errorListTabPage.Text = "Error List";
+      this.errorListTabPage.UseVisualStyleBackColor = true;
+      // 
+      // errorListView
+      // 
+      this.errorListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.iconColumnHeader,
+            this.categoryColumnHeader,
+            this.errorNumberColumnHeader,
+            this.lineColumnHeader,
+            this.columnColumnHeader,
+            this.descriptionColumnHeader});
+      this.errorListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.errorListView.FullRowSelect = true;
+      this.errorListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.errorListView.HideSelection = false;
+      this.errorListView.Location = new System.Drawing.Point(3, 3);
+      this.errorListView.Name = "errorListView";
+      this.errorListView.Size = new System.Drawing.Size(818, 80);
+      this.errorListView.SmallImageList = this.imageList;
+      this.errorListView.TabIndex = 0;
+      this.errorListView.UseCompatibleStateImageBehavior = false;
+      this.errorListView.View = System.Windows.Forms.View.Details;
+      // 
+      // iconColumnHeader
+      // 
+      this.iconColumnHeader.Text = "";
+      // 
+      // categoryColumnHeader
+      // 
+      this.categoryColumnHeader.Text = "Category";
+      // 
+      // errorNumberColumnHeader
+      // 
+      this.errorNumberColumnHeader.Text = "Error Number";
+      // 
+      // lineColumnHeader
+      // 
+      this.lineColumnHeader.Text = "Line";
+      // 
+      // columnColumnHeader
+      // 
+      this.columnColumnHeader.Text = "Column";
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      // 
+      // codeEditor
+      // 
+      this.codeEditor.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.codeEditor.Location = new System.Drawing.Point(0, 0);
+      this.codeEditor.Name = "codeEditor";
+      this.codeEditor.Prefix = "";
+      this.codeEditor.Size = new System.Drawing.Size(832, 430);
+      this.codeEditor.Suffix = "";
+      this.codeEditor.TabIndex = 0;
+      this.codeEditor.UserCode = "";
+      this.codeEditor.TextEditorTextChanged += new System.EventHandler(this.CodeEditorOnTextEditorTextChanged);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 56);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.codeEditor);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.infoTabControl);
+      this.splitContainer1.Size = new System.Drawing.Size(832, 546);
+      this.splitContainer1.SplitterDistance = 430;
+      this.splitContainer1.TabIndex = 9;
+      // 
+      // ScriptView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.compileButton);
+      this.Controls.Add(this.compilationLabel);
+      this.Name = "ScriptView";
+      this.Size = new System.Drawing.Size(835, 602);
+      this.Controls.SetChildIndex(this.compilationLabel, 0);
+      this.Controls.SetChildIndex(this.compileButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.infoTabControl.ResumeLayout(false);
+      this.outputTabPage.ResumeLayout(false);
+      this.outputTabPage.PerformLayout();
+      this.errorListTabPage.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label compilationLabel;
+    protected System.Windows.Forms.Button compileButton;
+    protected System.Windows.Forms.ImageList imageList;
+    protected System.Windows.Forms.TabControl infoTabControl;
+    protected System.Windows.Forms.TabPage outputTabPage;
+    protected System.Windows.Forms.TextBox outputTextBox;
+    protected System.Windows.Forms.TabPage errorListTabPage;
+    protected System.Windows.Forms.ListView errorListView;
+    protected System.Windows.Forms.ColumnHeader iconColumnHeader;
+    protected System.Windows.Forms.ColumnHeader categoryColumnHeader;
+    protected System.Windows.Forms.ColumnHeader errorNumberColumnHeader;
+    protected System.Windows.Forms.ColumnHeader lineColumnHeader;
+    protected System.Windows.Forms.ColumnHeader columnColumnHeader;
+    protected System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    protected CodeEditor.CodeEditor codeEditor;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 15895)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.CodeDom.Compiler;
+using System.Drawing;
+using System.Globalization;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Scripting.Views {
+
+  [View("Script View")]
+  [Content(typeof(Script), true)]
+  public partial class ScriptView : NamedItemView {
+    public new Script Content {
+      get { return (Script)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ScriptView() {
+      InitializeComponent();
+      errorListView.SmallImageList.Images.AddRange(new Image[] { VSImageLibrary.Warning, VSImageLibrary.Error });
+    }
+
+    public override bool ReadOnly {
+      get { return codeEditor.ReadOnly || base.ReadOnly; }
+      set { base.ReadOnly = codeEditor.ReadOnly = value; }
+    }
+
+    public override bool Locked {
+      get { return codeEditor.ReadOnly || base.Locked; }
+      set { base.Locked = codeEditor.ReadOnly = value; }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CodeChanged += ContentOnCodeChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CodeChanged -= ContentOnCodeChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected virtual void ContentOnCodeChanged(object sender, EventArgs e) {
+      codeEditor.UserCode = Content.Code;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        codeEditor.UserCode = string.Empty;
+      } else {
+        codeEditor.UserCode = Content.Code;
+        foreach (var asm in Content.GetAssemblies())
+          codeEditor.AddAssembly(asm);
+        if (Content.CompileErrors == null) {
+          compilationLabel.ForeColor = SystemColors.ControlDarkDark;
+          compilationLabel.Text = "Not compiled";
+        } else if (Content.CompileErrors.HasErrors) {
+          compilationLabel.ForeColor = Color.DarkRed;
+          compilationLabel.Text = "Compilation failed";
+        } else {
+          compilationLabel.ForeColor = Color.DarkGreen;
+          compilationLabel.Text = "Compilation successful";
+        }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      compileButton.Enabled = Content != null && !Locked && !ReadOnly;
+      codeEditor.Enabled = Content != null;
+    }
+
+    protected virtual void CompileButtonOnClick(object sender, EventArgs e) {
+      Compile();
+    }
+
+    protected virtual void CodeEditorOnTextEditorTextChanged(object sender, EventArgs e) {
+      if (Content == null) return;
+      Content.Code = codeEditor.UserCode;
+    }
+    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
+      switch (keyData) {
+        case Keys.F6:
+          if (Content != null && !Locked)
+            Compile();
+          return true;
+      }
+      return base.ProcessCmdKey(ref msg, keyData);
+    }
+
+    public virtual bool Compile() {
+      ReadOnly = true;
+      Locked = true;
+      errorListView.Items.Clear();
+      outputTextBox.Text = "Compiling ... ";
+      try {
+        Content.Compile();
+        outputTextBox.AppendText("Compilation succeeded.");
+        return true;
+      } catch {
+        if (Content.CompileErrors.HasErrors) {
+          outputTextBox.AppendText("Compilation failed.");
+          return false;
+        } else {
+          outputTextBox.AppendText("Compilation succeeded.");
+          return true;
+        }
+      } finally {
+        ShowCompilationResults();
+        if (Content.CompileErrors.Count > 0)
+          infoTabControl.SelectedTab = errorListTabPage;
+        ReadOnly = false;
+        Locked = false;
+        OnContentChanged();
+      }
+    }
+
+    protected virtual void ShowCompilationResults() {
+      if (Content.CompileErrors.Count == 0) return;
+      var msgs = Content.CompileErrors.OfType<CompilerError>()
+                                      .OrderBy(x => x.IsWarning)
+                                      .ThenBy(x => x.Line)
+                                      .ThenBy(x => x.Column);
+      foreach (var m in msgs) {
+        var item = new ListViewItem();
+        item.SubItems.AddRange(new[] {
+          m.IsWarning ? "Warning" : "Error",
+          m.ErrorNumber,
+          m.Line.ToString(CultureInfo.InvariantCulture),
+          m.Column.ToString(CultureInfo.InvariantCulture),
+          m.ErrorText
+        });
+        item.ImageIndex = m.IsWarning ? 0 : 1;
+        errorListView.Items.Add(item);
+      }
+      AdjustErrorListViewColumnSizes();
+    }
+
+    protected virtual void AdjustErrorListViewColumnSizes() {
+      foreach (ColumnHeader ch in errorListView.Columns)
+        // adjusts the column width to the width of the column header
+        ch.Width = -2;
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs	(revision 15895)
@@ -0,0 +1,188 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Windows.Forms;
+
+namespace HeuristicLab.Scripting.Views {
+  partial class VariableStoreView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #region Windows Form 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.variableListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.valueColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.typeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // variableListView
+      // 
+      this.variableListView.AllowDrop = true;
+      this.variableListView.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.variableListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.valueColumnHeader,
+            this.typeColumnHeader});
+      this.variableListView.FullRowSelect = true;
+      this.variableListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.variableListView.HideSelection = false;
+      this.variableListView.LabelEdit = true;
+      this.variableListView.Location = new System.Drawing.Point(6, 49);
+      this.variableListView.Name = "variableListView";
+      this.variableListView.ShowItemToolTips = true;
+      this.variableListView.Size = new System.Drawing.Size(224, 395);
+      this.variableListView.SmallImageList = this.imageList;
+      this.variableListView.TabIndex = 5;
+      this.variableListView.UseCompatibleStateImageBehavior = false;
+      this.variableListView.View = System.Windows.Forms.View.Details;
+      this.variableListView.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.variableListView_AfterLabelEdit);
+      this.variableListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.variableListView_ItemDrag);
+      this.variableListView.SelectedIndexChanged += new System.EventHandler(this.variableListView_SelectedIndexChanged);
+      this.variableListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.variableListView_DragDrop);
+      this.variableListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.variableListView_DragEnter);
+      this.variableListView.DragOver += new System.Windows.Forms.DragEventHandler(this.variableListView_DragOver);
+      this.variableListView.DoubleClick += new System.EventHandler(this.variableListView_DoubleClick);
+      this.variableListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variableListView_KeyDown);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      // 
+      // valueColumnHeader
+      // 
+      this.valueColumnHeader.Text = "Value";
+      // 
+      // typeColumnHeader
+      // 
+      this.typeColumnHeader.Text = "Type";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(36, 19);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(66, 19);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(96, 19);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(6, 19);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variableListView);
+      this.variablesGroupBox.Controls.Add(this.addButton);
+      this.variablesGroupBox.Controls.Add(this.sortDescendingButton);
+      this.variablesGroupBox.Controls.Add(this.removeButton);
+      this.variablesGroupBox.Controls.Add(this.sortAscendingButton);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(236, 450);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // VariableStoreView
+      // 
+      this.Controls.Add(this.variablesGroupBox);
+      this.Name = "VariableStoreView";
+      this.Size = new System.Drawing.Size(236, 450);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.ColumnHeader nameColumnHeader;
+    protected GroupBox variablesGroupBox;
+    protected ListView variableListView;
+    protected Button addButton;
+    protected Button removeButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected Button sortAscendingButton;
+    protected Button sortDescendingButton;
+    private ColumnHeader valueColumnHeader;
+    private ColumnHeader typeColumnHeader;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 15895)
@@ -0,0 +1,486 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Scripting.Views {
+  [View("ItemCollection View")]
+  [Content(typeof(VariableStore), true)]
+  public partial class VariableStoreView : AsynchronousContentView {
+    #region Image Names
+    private const string ErrorImageName = "Error";
+    private const string WarningImageName = "Warning";
+    private const string HeuristicLabObjectImageName = "HeuristicLabObject";
+    private const string ObjectImageName = "Object";
+    private const string NothingImageName = "Nothing";
+    #endregion
+
+    protected readonly Dictionary<string, ListViewItem> itemListViewItemMapping;
+    protected readonly Dictionary<Type, bool> serializableLookup;
+    protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
+
+    public new VariableStore Content {
+      get { return (VariableStore)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return variableListView; }
+    }
+
+    public VariableStoreView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<string, ListViewItem>();
+      serializableLookup = new Dictionary<Type, bool>();
+
+      var images = variableListView.SmallImageList.Images;
+      images.Add(ErrorImageName, Common.Resources.VSImageLibrary.Error);
+      images.Add(WarningImageName, Common.Resources.VSImageLibrary.Warning);
+      images.Add(HeuristicLabObjectImageName, Common.Resources.HeuristicLab.Icon.ToBitmap());
+      images.Add(ObjectImageName, Common.Resources.VSImageLibrary.Object);
+      images.Add(NothingImageName, Common.Resources.VSImageLibrary.Nothing);
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= Content_ItemsAdded;
+      Content.ItemsReplaced -= Content_ItemsReplaced;
+      Content.ItemsRemoved -= Content_ItemsRemoved;
+      Content.CollectionReset -= Content_CollectionReset;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += Content_ItemsAdded;
+      Content.ItemsReplaced += Content_ItemsReplaced;
+      Content.ItemsRemoved += Content_ItemsRemoved;
+      Content.CollectionReset += Content_CollectionReset;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      variableListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (var item in Content)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+        SortItemsListView(SortOrder.Ascending);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        sortAscendingButton.Enabled = false;
+        sortDescendingButton.Enabled = false;
+        removeButton.Enabled = false;
+        variableListView.Enabled = false;
+      } else {
+        bool enabled = !Locked && !ReadOnly;
+        addButton.Enabled = enabled;
+        sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+        sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+        removeButton.Enabled = enabled && variableListView.SelectedItems.Count > 0;
+        variableListView.Enabled = enabled;
+        variableListView.LabelEdit = enabled;
+      }
+    }
+
+    protected virtual object CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog { Caption = "Select Item" };
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IItem), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (object)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+
+    protected virtual void AddVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      bool serializable = IsSerializable(variable);
+
+      var listViewItem = new ListViewItem();
+      AssignVariableToListViewItem(listViewItem, variable);
+      SetImageKey(listViewItem, serializable);
+      SetToolTipText(listViewItem, serializable);
+      variableListView.Items.Add(listViewItem);
+
+      itemListViewItemMapping[variable.Key] = listViewItem;
+      sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+      sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+      var item = variable.Value as IItem;
+      if (item != null) item.ToStringChanged += item_ToStringChanged;
+    }
+
+    protected virtual void RemoveVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+
+      ListViewItem listViewItem;
+      if (!itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) return;
+
+      itemListViewItemMapping.Remove(variable.Key);
+      variableListView.Items.Remove(listViewItem);
+      sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+      sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+      var item = variable.Value as IItem;
+      if (item != null) item.ToStringChanged -= item_ToStringChanged;
+    }
+
+    protected virtual void UpdateVariable(KeyValuePair<string, object> variable) {
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+
+      ListViewItem listViewItem;
+      if (!itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem))
+        throw new ArgumentException("A variable with the specified name does not exist.", "variable");
+
+      bool serializable = IsSerializable(variable);
+      AssignVariableToListViewItem(listViewItem, variable);
+      SetImageKey(listViewItem, serializable);
+      SetToolTipText(listViewItem, serializable);
+
+    }
+
+    #region ListView Events
+    protected virtual void variableListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = (Content != null) && !Locked && !ReadOnly && variableListView.SelectedItems.Count > 0;
+      AdjustListViewColumnSizes();
+    }
+    protected virtual void variableListView_KeyDown(object sender, KeyEventArgs e) {
+      switch (e.KeyCode) {
+        case Keys.Delete:
+          if ((variableListView.SelectedItems.Count > 0) && !Locked && !ReadOnly) {
+            foreach (ListViewItem item in variableListView.SelectedItems)
+              Content.Remove(item.Text);
+          }
+          break;
+        case Keys.F2:
+          if (variableListView.SelectedItems.Count != 1) return;
+          var selectedItem = variableListView.SelectedItems[0];
+          if (variableListView.LabelEdit)
+            selectedItem.BeginEdit();
+          break;
+        case Keys.A:
+          if (e.Modifiers.HasFlag(Keys.Control)) {
+            foreach (ListViewItem item in variableListView.Items)
+              item.Selected = true;
+          }
+          break;
+      }
+    }
+    protected virtual void variableListView_DoubleClick(object sender, EventArgs e) {
+      if (variableListView.SelectedItems.Count != 1) return;
+      var item = variableListView.SelectedItems[0].Tag as KeyValuePair<string, object>?;
+      if (item == null) return;
+
+      var value = item.Value.Value as IContent;
+      if (value == null) return;
+
+      IContentView view = MainFormManager.MainForm.ShowContent(value);
+      if (view == null) return;
+
+      view.ReadOnly = ReadOnly;
+      view.Locked = Locked;
+    }
+    protected virtual void variableListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (Locked || variableListView.SelectedItems.Count != 1) return;
+
+      var listViewItem = variableListView.SelectedItems[0];
+      var item = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (!(item.Value is IDeepCloneable)) return;
+      var data = new DataObject(HeuristicLab.Common.Constants.DragDropDataFormat, item);
+      DoDragDrop(data, DragDropEffects.Copy);
+    }
+    protected virtual void variableListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = !Locked && !ReadOnly && e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) != null;
+    }
+    protected virtual void variableListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+      }
+    }
+    protected virtual void variableListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.Copy) return;
+      object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+
+      string variableName;
+      bool editLabel;
+
+      if (item is KeyValuePair<string, object>) {
+        var variable = (KeyValuePair<string, object>)item;
+        variableName = GenerateNewVariableName(out editLabel, variable.Key, false);
+        item = variable.Value;
+      } else {
+        var namedItem = item as INamedItem;
+        if (namedItem != null)
+          variableName = GenerateNewVariableName(out editLabel, namedItem.Name, false);
+        else
+          variableName = GenerateNewVariableName(out editLabel);
+      }
+
+      var cloneable = item as IDeepCloneable;
+      if (cloneable != null) item = cloneable.Clone();
+
+      Content.Add(variableName, item);
+
+      var listViewItem = variableListView.FindItemWithText(variableName);
+      variableListView.SelectedItems.Clear();
+      if (editLabel) listViewItem.BeginEdit();
+    }
+
+    private readonly Regex SafeVariableNameRegex = new Regex("^[@]?[_a-zA-Z][_a-zA-Z0-9]*$");
+    private const string DefaultVariableName = "enter_name";
+
+    private void variableListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {
+      string name = e.Label;
+      if (!string.IsNullOrEmpty(name)) {
+        var variable = (KeyValuePair<string, object>)variableListView.Items[e.Item].Tag;
+        if (!Content.ContainsKey(name)) {
+          Content.Remove(variable.Key);
+          Content.Add(name, variable.Value);
+        }
+      }
+      e.CancelEdit = true;
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      object variableValue = CreateItem();
+      if (variableValue == null) return;
+
+      string variableName;
+      var namedItem = variableValue as INamedItem;
+      if (namedItem != null)
+        variableName = GenerateNewVariableName(namedItem.Name, false);
+      else
+        variableName = GenerateNewVariableName();
+
+      Content.Add(variableName, variableValue);
+
+      var item = variableListView.FindItemWithText(variableName);
+      variableListView.SelectedItems.Clear();
+      item.BeginEdit();
+    }
+    protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Ascending);
+    }
+    protected virtual void sortDescendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Descending);
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (variableListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variableListView.SelectedItems)
+          Content.Remove(item.Text);
+        variableListView.SelectedItems.Clear();
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (var item in e.Items)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsReplaced), sender, e);
+      else {
+        foreach (var item in e.Items)
+          UpdateVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_ItemsRemoved), sender, e);
+      else {
+        foreach (var item in e.Items)
+          RemoveVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, object>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<string, object>>(Content_CollectionReset), sender, e);
+      else {
+        foreach (var item in e.OldItems)
+          RemoveVariable(item);
+        foreach (var item in e.Items)
+          AddVariable(item);
+        AdjustListViewColumnSizes();
+      }
+    }
+
+    private void item_ToStringChanged(object sender, EventArgs e) {
+      foreach (ListViewItem item in variableListView.Items) {
+        var variable = item.Tag as KeyValuePair<string, object>?;
+        if (variable == null || variable.Value.Value != sender) continue;
+
+        string value = (variable.Value.Value ?? "null").ToString();
+        item.SubItems[1].Text = value;
+        item.SubItems[2].Text = variable.Value.Value.GetType().ToString();
+        SetToolTipText(item, item.ImageIndex != 0);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SortItemsListView(SortOrder sortOrder) {
+      variableListView.Sorting = SortOrder.None;
+      variableListView.Sorting = sortOrder;
+      variableListView.Sorting = SortOrder.None;
+    }
+    protected virtual void AdjustListViewColumnSizes() {
+      foreach (ColumnHeader ch in variableListView.Columns)
+        ch.Width = -2;
+    }
+
+    protected virtual void AssignVariableToListViewItem(ListViewItem listViewItem, KeyValuePair<string, object> variable) {
+      string value = (variable.Value ?? "null").ToString();
+      string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
+
+      listViewItem.Tag = variable;
+
+      var subItems = listViewItem.SubItems;
+      subItems[0].Text = variable.Key;
+      if (subItems.Count == 1) { // variable information is added; subitems do not exist yet
+        subItems.AddRange(new[] { value, type });
+      } else { // variable information is updated; subitems are changed
+        subItems[1].Text = value;
+        subItems[2].Text = type;
+      }
+    }
+
+    protected virtual void SetImageKey(ListViewItem listViewItem, bool serializable) {
+      var variable = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (!serializable) listViewItem.ImageKey = ErrorImageName;
+      else if (!SafeVariableNameRegex.IsMatch(variable.Key)) listViewItem.ImageKey = WarningImageName;
+      else if (variable.Value is IItem) listViewItem.ImageKey = HeuristicLabObjectImageName;
+      else if (variable.Value != null) listViewItem.ImageKey = ObjectImageName;
+      else listViewItem.ImageKey = NothingImageName;
+    }
+
+    protected virtual void SetToolTipText(ListViewItem listViewItem, bool serializable) {
+      var variable = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      string value = listViewItem.SubItems[1].Text;
+      string type = listViewItem.SubItems[2].Text;
+
+      string[] lines = {
+        "Name: " + variable.Key,
+        "Value: " + value,
+        "Type: " + type
+      };
+
+      string toolTipText = string.Join(Environment.NewLine, lines);
+      if (!SafeVariableNameRegex.IsMatch(variable.Key))
+        toolTipText = "Caution: Identifier is no valid C# identifier!" + Environment.NewLine + toolTipText;
+      if (!serializable)
+        toolTipText = "Caution: Type is not serializable!" + Environment.NewLine + toolTipText;
+      listViewItem.ToolTipText = toolTipText;
+    }
+
+    private string GenerateNewVariableName(string defaultName = DefaultVariableName, bool generateValidIdentifier = true) {
+      bool editLabel;
+      return GenerateNewVariableName(out editLabel, defaultName, generateValidIdentifier);
+    }
+
+    private string GenerateNewVariableName(out bool defaultNameExists, string defaultName = DefaultVariableName, bool generateValidIdentifier = true) {
+      if (string.IsNullOrEmpty(defaultName) || generateValidIdentifier && !SafeVariableNameRegex.IsMatch(defaultName))
+        defaultName = DefaultVariableName;
+      if (Content.ContainsKey(defaultName)) {
+        int i = 1;
+        string formatString = generateValidIdentifier ? "{0}{1}" : "{0} ({1})";
+        string newName;
+        do {
+          newName = string.Format(formatString, defaultName, i++);
+        } while (Content.ContainsKey(newName));
+        defaultNameExists = true;
+        return newName;
+      }
+      defaultNameExists = false;
+      return defaultName;
+    }
+
+    private bool IsSerializable(KeyValuePair<string, object> variable) {
+      Type type = null;
+      bool serializable;
+
+      if (variable.Value != null) {
+        type = variable.Value.GetType();
+        if (serializableLookup.TryGetValue(type, out serializable))
+          return serializable;
+      }
+
+      var ser = new Serializer(variable, ConfigurationService.Instance.GetDefaultConfig(new XmlFormat()), "ROOT", true);
+      try {
+        serializable = ser.Count() > 0; // try to create all serialization tokens
+      } catch (PersistenceException) {
+        serializable = false;
+      }
+
+      if (type != null)
+        serializableLookup[type] = serializable;
+      return serializable;
+    }
+    #endregion
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScript.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScript.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScript.cs	(revision 15895)
@@ -0,0 +1,168 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Scripting {
+  [Item("C# Script", "An empty C# script.")]
+  [Creatable("Scripts")]
+  [StorableClass]
+  public class CSharpScript : Script, IStorableContent {
+    #region Constants
+    protected const string ExecuteMethodName = "Execute";
+    protected override string CodeTemplate {
+      get {
+        return @"// use 'vars' to access variables in the script's variable store (e.g. vars.x = 5)
+// use 'vars[string]' to access variables via runtime strings (e.g. vars[""x""] = 5)
+// use 'vars.Contains(string)' to check if a variable exists
+// use 'vars.Clear()' to remove all variables
+// use 'foreach (KeyValuePair<string, object> v in vars) { ... }' to iterate over all variables
+// use 'variables' to work with IEnumerable<T> extension methods on the script's variable store
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+public class MyScript : HeuristicLab.Scripting.CSharpScriptBase {
+  public override void Main() {
+    // type your code here
+  }
+
+  // implement further classes and methods
+
+}";
+      }
+    }
+    #endregion
+
+    #region Fields & Properties
+    private CSharpScriptBase compiledScript;
+
+    public string Filename { get; set; }
+
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+    #endregion
+
+    #region Construction & Initialization
+    [StorableConstructor]
+    protected CSharpScript(bool deserializing) : base(deserializing) { }
+    protected CSharpScript(CSharpScript original, Cloner cloner)
+      : base(original, cloner) {
+      variableStore = cloner.Clone(original.variableStore);
+    }
+    public CSharpScript() {
+      variableStore = new VariableStore();
+      Code = CodeTemplate;
+    }
+    public CSharpScript(string code)
+      : base(code) {
+      variableStore = new VariableStore();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CSharpScript(this, cloner);
+    }
+    #endregion
+
+    protected virtual void RegisterScriptEvents() {
+      if (compiledScript != null)
+        compiledScript.ConsoleOutputChanged += CompiledScriptOnConsoleOutputChanged;
+    }
+
+    protected virtual void DeregisterScriptEvents() {
+      if (compiledScript != null)
+        compiledScript.ConsoleOutputChanged -= CompiledScriptOnConsoleOutputChanged;
+    }
+
+    #region Compilation
+
+    public override Assembly Compile() {
+      DeregisterScriptEvents();
+      compiledScript = null;
+      var assembly = base.Compile();
+      var types = assembly.GetTypes();
+      compiledScript = (CSharpScriptBase)Activator.CreateInstance(types.Single(x => typeof(CSharpScriptBase).IsAssignableFrom(x)));
+      RegisterScriptEvents();
+      return assembly;
+    }
+    #endregion
+
+    private Thread scriptThread;
+    public virtual void Execute() {
+      if (compiledScript == null) return;
+      scriptThread = new Thread(() => {
+        Exception ex = null;
+        try {
+          OnScriptExecutionStarted();
+          compiledScript.Execute(VariableStore);
+        } catch (ThreadAbortException) {
+          // the execution was cancelled by the user
+        } catch (Exception e) {
+          ex = e;
+        } finally {
+          OnScriptExecutionFinished(ex);
+        }
+      });
+      scriptThread.SetApartmentState(ApartmentState.STA);
+      scriptThread.Start();
+    }
+
+    public virtual void Kill() {
+      if (scriptThread.IsAlive)
+        scriptThread.Abort();
+    }
+
+    protected virtual void CompiledScriptOnConsoleOutputChanged(object sender, EventArgs<string> e) {
+      OnConsoleOutputChanged(e.Value);
+    }
+
+    public event EventHandler ScriptExecutionStarted;
+    protected virtual void OnScriptExecutionStarted() {
+      var handler = ScriptExecutionStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ScriptExecutionFinished;
+    protected virtual void OnScriptExecutionFinished(Exception e) {
+      var handler = ScriptExecutionFinished;
+      if (handler != null) handler(this, new EventArgs<Exception>(e));
+    }
+
+    public event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    protected virtual void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(this, new EventArgs<string>(args));
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScriptBase.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScriptBase.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/CSharpScriptBase.cs	(revision 15895)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.IO;
+using System.Text;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Scripting {
+  public abstract class CSharpScriptBase {
+    protected Variables variables;
+    protected dynamic vars;
+
+    private readonly EventWriter console;
+    protected EventWriter Console {
+      get { return console; }
+    }
+
+    protected CSharpScriptBase() {
+      console = new EventWriter(this);
+    }
+
+    public abstract void Main();
+
+    internal void Execute(VariableStore variableStore) {
+      variables = vars = new Variables(variableStore);
+      Main();
+    }
+
+    protected internal event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    private void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(null, new EventArgs<string>(args));
+    }
+
+    protected class EventWriter : TextWriter {
+      private readonly CSharpScriptBase script;
+
+      public EventWriter(CSharpScriptBase script) {
+        this.script = script;
+      }
+
+      public override Encoding Encoding {
+        get { return Encoding.UTF8; }
+      }
+
+      #region Write/WriteLine Overrides
+      #region Write
+      public override void Write(bool value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer)); }
+      public override void Write(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count)); }
+      public override void Write(decimal value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(double value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(float value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(int value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(long value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(object value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(string value) { script.OnConsoleOutputChanged(value); }
+      public override void Write(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0)); }
+      public override void Write(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg0)); }
+      public override void Write(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2)); }
+      public override void Write(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg)); }
+      public override void Write(uint value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(ulong value) { script.OnConsoleOutputChanged(value.ToString()); }
+      #endregion
+
+      #region WriteLine
+      public override void WriteLine() { script.OnConsoleOutputChanged(Environment.NewLine); }
+      public override void WriteLine(bool value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer) + Environment.NewLine); }
+      public override void WriteLine(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count) + Environment.NewLine); }
+      public override void WriteLine(decimal value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(double value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(float value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(int value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(long value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(object value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2) + Environment.NewLine); }
+      public override void WriteLine(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg) + Environment.NewLine); }
+      public override void WriteLine(uint value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(ulong value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      #endregion
+      #endregion
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 15895)
@@ -0,0 +1,151 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.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>{21977CC3-1757-4B3B-87BD-FF817AAA900F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Scripting</RootNamespace>
+    <AssemblyName>HeuristicLab.Scripting-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\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>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CSharpScript.cs" />
+    <Compile Include="IProgrammableItem.cs" />
+    <Compile Include="Variables.cs" />
+    <Compile Include="VariableStore.cs" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Script.cs" />
+    <Compile Include="CSharpScriptBase.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/IProgrammableItem.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/IProgrammableItem.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/IProgrammableItem.cs	(revision 15895)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace HeuristicLab.Scripting {
+  public interface IProgrammableItem : IItem {
+    string Code { get; set; }
+    CompilerErrorCollection CompileErrors { get; }
+    bool CanChangeCode { get; }
+    VariableStore VariableStore { get; }
+
+    void Compile();
+    IEnumerable<Assembly> GetAssemblies();
+
+    event EventHandler CodeChanged;
+    event EventHandler CompileErrorsChanged;
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Plugin.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Plugin.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Plugin.cs.frame	(revision 15895)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.Scripting {
+  [Plugin("HeuristicLab.Scripting", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Scripting-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.Persistence", "3.3")]
+  public class HeuristicLabScriptingPlugin : PluginBase {
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Properties/AssemblyInfo.cs.frame	(revision 15895)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Scripting")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("c8460c22-cba5-48ad-8283-1284313b2c17")]
+
+// 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("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.10.$WCREV$")]
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Script.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Script.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Script.cs	(revision 15895)
@@ -0,0 +1,168 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.CodeDom;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using Microsoft.CSharp;
+
+namespace HeuristicLab.Scripting {
+  [StorableClass]
+  public class Script : NamedItem {
+    protected virtual string CodeTemplate {
+      get { return string.Empty; }
+    }
+
+    #region Fields & Properties
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.Script; }
+    }
+
+    [Storable]
+    private string code;
+    public string Code {
+      get { return code; }
+      set {
+        if (value == code) return;
+        code = value;
+        OnCodeChanged();
+      }
+    }
+
+    private CompilerErrorCollection compileErrors;
+    public CompilerErrorCollection CompileErrors {
+      get { return compileErrors; }
+      private set {
+        compileErrors = value;
+        OnCompileErrorsChanged();
+      }
+    }
+    #endregion
+
+    #region Construction & Initialization
+    [StorableConstructor]
+    protected Script(bool deserializing) : base(deserializing) { }
+    protected Script(Script original, Cloner cloner)
+      : base(original, cloner) {
+      code = original.code;
+      if (original.compileErrors != null)
+        compileErrors = new CompilerErrorCollection(original.compileErrors);
+    }
+    public Script()
+      : base("Script", "An empty script.") {
+      code = string.Empty;
+    }
+    public Script(string code)
+      : this() {
+      this.code = code;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Script(this, cloner);
+    }
+    #endregion
+
+    #region Compilation
+    protected virtual CSharpCodeProvider CodeProvider {
+      get {
+        return new CSharpCodeProvider(
+          new Dictionary<string, string> {
+                {"CompilerVersion", "v4.0"}, // support C# 4.0 syntax
+              });
+      }
+    }
+
+    protected virtual CompilerResults DoCompile() {
+      var parameters = new CompilerParameters {
+        GenerateExecutable = false,
+        GenerateInMemory = true,
+        IncludeDebugInformation = true,
+        WarningLevel = 4
+      };
+      parameters.ReferencedAssemblies.AddRange(
+        GetAssemblies()
+        .Select(a => a.Location)
+        .ToArray());
+      var unit = CreateCompilationUnit();
+      var writer = new StringWriter();
+      CodeProvider.GenerateCodeFromCompileUnit(
+        unit,
+        writer,
+        new CodeGeneratorOptions {
+          ElseOnClosing = true,
+          IndentString = "  ",
+        });
+      return CodeProvider.CompileAssemblyFromDom(parameters, unit);
+    }
+
+    public virtual Assembly Compile() {
+      var results = DoCompile();
+      CompileErrors = results.Errors;
+      if (results.Errors.HasErrors) {
+        var sb = new StringBuilder();
+        foreach (CompilerError error in results.Errors) {
+          sb.Append(error.Line).Append(':')
+            .Append(error.Column).Append(": ")
+            .AppendLine(error.ErrorText);
+        }
+        throw new Exception(string.Format("Compilation of \"{0}\" failed:{1}{2}",
+          Name, Environment.NewLine, sb.ToString()));
+      } else {
+        return results.CompiledAssembly;
+      }
+    }
+
+    public virtual IEnumerable<Assembly> GetAssemblies() {
+      var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && File.Exists(a.Location)).ToList();    
+      assemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly); // for dlr functionality
+      return assemblies;
+    }
+
+    protected virtual CodeCompileUnit CreateCompilationUnit() {
+      var unit = new CodeSnippetCompileUnit(code);
+      return unit;
+    }
+    #endregion
+
+    public event EventHandler CodeChanged;
+    protected virtual void OnCodeChanged() {
+      var handler = CodeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CompileErrorsChanged;
+    protected virtual void OnCompileErrorsChanged() {
+      var handler = CompileErrorsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/UserScriptBase.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/UserScriptBase.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/UserScriptBase.cs	(revision 15895)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.IO;
+using System.Text;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Scripting {
+  public abstract class UserScriptBase {
+    protected dynamic vars;
+
+    private readonly EventWriter console;
+    protected EventWriter Console {
+      get { return console; }
+    }
+
+    protected UserScriptBase() {
+      console = new EventWriter(this);
+    }
+
+    public abstract void Main();
+
+    private void Execute(VariableStore variableStore) {
+      vars = new Variables(variableStore);
+      Main();
+    }
+
+    protected internal event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    private void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(null, new EventArgs<string>(args));
+    }
+
+    protected class EventWriter : TextWriter {
+      private readonly UserScriptBase usb;
+
+      public EventWriter(UserScriptBase usb) {
+        this.usb = usb;
+      }
+
+      public override Encoding Encoding {
+        get { return Encoding.UTF8; }
+      }
+
+      #region Write/WriteLine Overrides
+      #region Write
+      public override void Write(bool value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char[] buffer) { usb.OnConsoleOutputChanged(new string(buffer)); }
+      public override void Write(char[] buffer, int index, int count) { usb.OnConsoleOutputChanged(new string(buffer, index, count)); }
+      public override void Write(decimal value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(double value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(float value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(int value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(long value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(object value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(string value) { usb.OnConsoleOutputChanged(value); }
+      public override void Write(string format, object arg0) { usb.OnConsoleOutputChanged(string.Format(format, arg0)); }
+      public override void Write(string format, object arg0, object arg1) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg0)); }
+      public override void Write(string format, object arg0, object arg1, object arg2) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2)); }
+      public override void Write(string format, params object[] arg) { usb.OnConsoleOutputChanged(string.Format(format, arg)); }
+      public override void Write(uint value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(ulong value) { usb.OnConsoleOutputChanged(value.ToString()); }
+      #endregion
+
+      #region WriteLine
+      public override void WriteLine() { usb.OnConsoleOutputChanged(Environment.NewLine); }
+      public override void WriteLine(bool value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char[] buffer) { usb.OnConsoleOutputChanged(new string(buffer) + Environment.NewLine); }
+      public override void WriteLine(char[] buffer, int index, int count) { usb.OnConsoleOutputChanged(new string(buffer, index, count) + Environment.NewLine); }
+      public override void WriteLine(decimal value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(double value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(float value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(int value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(long value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(object value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0) { usb.OnConsoleOutputChanged(string.Format(format, arg0) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1, object arg2) { usb.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2) + Environment.NewLine); }
+      public override void WriteLine(string format, params object[] arg) { usb.OnConsoleOutputChanged(string.Format(format, arg) + Environment.NewLine); }
+      public override void WriteLine(uint value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(ulong value) { usb.OnConsoleOutputChanged(value + Environment.NewLine); }
+      #endregion
+      #endregion
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/VariableStore.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/VariableStore.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/VariableStore.cs	(revision 15895)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You 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.IO;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Scripting {
+  [Item("VariableStore", "Represents a variable store.")]
+  [StorableClass]
+  public class VariableStore : ObservableDictionary<string, object>, IContent, IDeepCloneable {
+    [StorableConstructor]
+    protected VariableStore(bool deserializing) : base(deserializing) { }
+    protected VariableStore(VariableStore original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      foreach (var kvp in original.dict) {
+        var clonedValue = kvp.Value as IDeepCloneable;
+        if (clonedValue != null) {
+          dict[kvp.Key] = cloner.Clone(clonedValue);
+        } else {
+          try {
+            dict[kvp.Key] = CloneByPersistence(kvp.Value);
+          } catch (PersistenceException pe) {
+            throw new NotSupportedException(string.Format(@"VariableStore: Variable ""{0}"" could not be cloned.", kvp.Key), pe);
+          }
+        }
+      }
+    }
+    public VariableStore() : base() { }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public IDeepCloneable Clone(Cloner cloner) {
+      return new VariableStore(this, cloner);
+    }
+
+    protected T CloneByPersistence<T>(T value) {
+      using (var serializerStream = new MemoryStream()) {
+        XmlGenerator.Serialize(value, serializerStream);
+        var bytes = serializerStream.GetBuffer();
+        using (var deserializerStream = new MemoryStream(bytes)) {
+          return XmlParser.Deserialize<T>(deserializerStream);
+        }
+      }
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Variables.cs
===================================================================
--- /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Variables.cs	(revision 15895)
+++ /branches/2205_OptimizationNetworks/HeuristicLab.Scripting/3.3/Variables.cs	(revision 15895)
@@ -0,0 +1,43 @@
+﻿using System.Collections;
+using System.Collections.Generic;
+using System.Dynamic;
+
+namespace HeuristicLab.Scripting {
+  public class Variables : DynamicObject, IEnumerable<KeyValuePair<string, object>> {
+    private readonly VariableStore variableStore;
+
+    public Variables(VariableStore variableStore) {
+      this.variableStore = variableStore;
+    }
+
+    public override bool TryGetMember(GetMemberBinder binder, out object result) {
+      return variableStore.TryGetValue(binder.Name, out result);
+    }
+
+    public override bool TrySetMember(SetMemberBinder binder, object value) {
+      variableStore[binder.Name] = value;
+      return true;
+    }
+
+    public object this[string key] {
+      get { return variableStore[key]; }
+      set { variableStore[key] = value; }
+    }
+
+    public bool Contains(string variableName) {
+      return variableStore.ContainsKey(variableName);
+    }
+
+    public void Clear() {
+      variableStore.Clear();
+    }
+
+    public IEnumerator<KeyValuePair<string, object>> GetEnumerator() {
+      return variableStore.GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+  }
+}
Index: /branches/2205_OptimizationNetworks/LRP-Network.sln
===================================================================
--- /branches/2205_OptimizationNetworks/LRP-Network.sln	(revision 15895)
+++ /branches/2205_OptimizationNetworks/LRP-Network.sln	(revision 15895)
@@ -0,0 +1,188 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Modeler-3.3", "HeuristicLab.Modeler\3.3\HeuristicLab.Modeler-3.3.csproj", "{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks-3.3", "HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj", "{7CF51332-0E37-447C-8017-82A258C59EF2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views-3.3", "HeuristicLab.Networks.Views\3.3\HeuristicLab.Networks.Views-3.3.csproj", "{792B263D-92BA-453A-BFDF-261511C2F63B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Common.Resources-3.3", "HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj", "{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views.NetworkVisualization-3.3", "HeuristicLab.Networks.Views.NetworkVisualization\3.3\HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj", "{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3", "HeuristicLab.Networks.Views.NetworkVisualization.Views\3.3\HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3.csproj", "{A1EFA7B2-C288-4342-8318-27F4D2F29C18}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.FacilityLocation-3.3", "HeuristicLab.Problems.FacilityLocation\3.3\HeuristicLab.Problems.FacilityLocation-3.3.csproj", "{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3", "HeuristicLab.Problems.FacilityLocation.CplexSolver\3.3\HeuristicLab.Problems.FacilityLocation.CplexSolver-3.3.csproj", "{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3", "HeuristicLab.Networks.IntegratedOptimization.LocationRouting\3.3\HeuristicLab.Networks.IntegratedOptimization.LocationRouting-3.3.csproj", "{B364F111-5C05-4B28-9A29-F6A50E539003}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization-3.3", "HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj", "{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.VehicleRouting-3.4", "HeuristicLab.Problems.VehicleRouting\3.4\HeuristicLab.Problems.VehicleRouting-3.4.csproj", "{B94FFB82-43D4-40AB-9980-B03470ADF221}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.VehicleRouting.Views-3.4", "HeuristicLab.Problems.VehicleRouting.Views\3.4\HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj", "{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}"
+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
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.ActiveCfg = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.Build.0 = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.ActiveCfg = Debug|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.Build.0 = Debug|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.ActiveCfg = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.Build.0 = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.ActiveCfg = Release|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.Build.0 = Release|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.ActiveCfg = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.Build.0 = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.ActiveCfg = Debug|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.Build.0 = Debug|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.ActiveCfg = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.Build.0 = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.ActiveCfg = Release|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.Build.0 = Release|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.ActiveCfg = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.Build.0 = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.ActiveCfg = Debug|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.Build.0 = Debug|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.ActiveCfg = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.Build.0 = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.ActiveCfg = Release|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.Build.0 = Release|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x64.ActiveCfg = Debug|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x64.Build.0 = Debug|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x86.ActiveCfg = Debug|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x86.Build.0 = Debug|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x64.ActiveCfg = Release|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x64.Build.0 = Release|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x86.ActiveCfg = Release|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x86.Build.0 = Release|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x64.ActiveCfg = Debug|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x64.Build.0 = Debug|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x86.ActiveCfg = Debug|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x86.Build.0 = Debug|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x64.ActiveCfg = Release|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x64.Build.0 = Release|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x86.ActiveCfg = Release|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x86.Build.0 = Release|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x64.ActiveCfg = Debug|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x64.Build.0 = Debug|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x86.ActiveCfg = Debug|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x86.Build.0 = Debug|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x64.ActiveCfg = Release|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x64.Build.0 = Release|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x86.ActiveCfg = Release|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x86.Build.0 = Release|x86
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|x64.Build.0 = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Debug|x86.Build.0 = Debug|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|x64.ActiveCfg = Release|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|x64.Build.0 = Release|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|x86.ActiveCfg = Release|Any CPU
+		{AA9D05E4-EAE1-45CA-97D2-275110A7E58D}.Release|x86.Build.0 = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|x64.Build.0 = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Debug|x86.Build.0 = Debug|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|x64.ActiveCfg = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|x64.Build.0 = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|x86.ActiveCfg = Release|Any CPU
+		{307DF76A-9D9D-4D0A-BB67-DEEF934A70FF}.Release|x86.Build.0 = Release|Any CPU
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|x64.ActiveCfg = Debug|x64
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|x64.Build.0 = Debug|x64
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|x86.ActiveCfg = Debug|x86
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Debug|x86.Build.0 = Debug|x86
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|x64.ActiveCfg = Release|x64
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|x64.Build.0 = Release|x64
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|x86.ActiveCfg = Release|x86
+		{B364F111-5C05-4B28-9A29-F6A50E539003}.Release|x86.Build.0 = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.ActiveCfg = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.Build.0 = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.ActiveCfg = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.Build.0 = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.ActiveCfg = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.Build.0 = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.ActiveCfg = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.Build.0 = Release|x86
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|x64.ActiveCfg = Debug|x64
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|x64.Build.0 = Debug|x64
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|x86.ActiveCfg = Debug|x86
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Debug|x86.Build.0 = Debug|x86
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|x64.ActiveCfg = Release|x64
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|x64.Build.0 = Release|x64
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|x86.ActiveCfg = Release|x86
+		{B94FFB82-43D4-40AB-9980-B03470ADF221}.Release|x86.Build.0 = Release|x86
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|x64.ActiveCfg = Debug|x64
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|x64.Build.0 = Debug|x64
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|x86.ActiveCfg = Debug|x86
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Debug|x86.Build.0 = Debug|x86
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|x64.ActiveCfg = Release|x64
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|x64.Build.0 = Release|x64
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|x86.ActiveCfg = Release|x86
+		{7EA0985E-A1D6-4FA7-B30A-2633FDFB01F0}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/2205_OptimizationNetworks/OptimizationNetworks.sln
===================================================================
--- /branches/2205_OptimizationNetworks/OptimizationNetworks.sln	(revision 15895)
+++ /branches/2205_OptimizationNetworks/OptimizationNetworks.sln	(revision 15895)
@@ -0,0 +1,132 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Modeler-3.3", "HeuristicLab.Modeler\3.3\HeuristicLab.Modeler-3.3.csproj", "{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks-3.3", "HeuristicLab.Networks\3.3\HeuristicLab.Networks-3.3.csproj", "{7CF51332-0E37-447C-8017-82A258C59EF2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views-3.3", "HeuristicLab.Networks.Views\3.3\HeuristicLab.Networks.Views-3.3.csproj", "{792B263D-92BA-453A-BFDF-261511C2F63B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Common.Resources-3.3", "HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj", "{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views.NetworkVisualization-3.3", "HeuristicLab.Networks.Views.NetworkVisualization\3.3\HeuristicLab.Networks.Views.NetworkVisualization-3.3.csproj", "{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3", "HeuristicLab.Networks.Views.NetworkVisualization.Views\3.3\HeuristicLab.Networks.Views.NetworkVisualization.Views-3.3.csproj", "{A1EFA7B2-C288-4342-8318-27F4D2F29C18}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization-3.3", "HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj", "{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization.Views-3.3", "HeuristicLab.Networks.IntegratedOptimization.Views\3.3\HeuristicLab.Networks.IntegratedOptimization.Views-3.3.csproj", "{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}"
+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
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.ActiveCfg = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.Build.0 = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.ActiveCfg = Debug|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.Build.0 = Debug|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.ActiveCfg = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.Build.0 = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.ActiveCfg = Release|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.Build.0 = Release|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.ActiveCfg = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.Build.0 = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.ActiveCfg = Debug|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.Build.0 = Debug|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.ActiveCfg = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.Build.0 = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.ActiveCfg = Release|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.Build.0 = Release|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.ActiveCfg = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.Build.0 = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.ActiveCfg = Debug|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.Build.0 = Debug|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.ActiveCfg = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.Build.0 = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.ActiveCfg = Release|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.Build.0 = Release|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x64.ActiveCfg = Debug|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x64.Build.0 = Debug|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x86.ActiveCfg = Debug|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Debug|x86.Build.0 = Debug|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x64.ActiveCfg = Release|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x64.Build.0 = Release|x64
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x86.ActiveCfg = Release|x86
+		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}.Release|x86.Build.0 = Release|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x64.ActiveCfg = Debug|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x64.Build.0 = Debug|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x86.ActiveCfg = Debug|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Debug|x86.Build.0 = Debug|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x64.ActiveCfg = Release|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x64.Build.0 = Release|x64
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x86.ActiveCfg = Release|x86
+		{B76A8CF7-BE2A-4CE7-943D-AB19A7CC7798}.Release|x86.Build.0 = Release|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x64.ActiveCfg = Debug|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x64.Build.0 = Debug|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x86.ActiveCfg = Debug|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Debug|x86.Build.0 = Debug|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x64.ActiveCfg = Release|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x64.Build.0 = Release|x64
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x86.ActiveCfg = Release|x86
+		{A1EFA7B2-C288-4342-8318-27F4D2F29C18}.Release|x86.Build.0 = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.ActiveCfg = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.Build.0 = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.ActiveCfg = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.Build.0 = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.ActiveCfg = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.Build.0 = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.ActiveCfg = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.Build.0 = Release|x86
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|x64.ActiveCfg = Debug|x64
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|x64.Build.0 = Debug|x64
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|x86.ActiveCfg = Debug|x86
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Debug|x86.Build.0 = Debug|x86
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|x64.ActiveCfg = Release|x64
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|x64.Build.0 = Release|x64
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|x86.ActiveCfg = Release|x86
+		{B7CBE751-C7EF-45CE-A59D-D8A5BBE6CA3E}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/2205_OptimizationNetworks/PreBuildEvent.cmd
===================================================================
--- /branches/2205_OptimizationNetworks/PreBuildEvent.cmd	(revision 15895)
+++ /branches/2205_OptimizationNetworks/PreBuildEvent.cmd	(revision 15895)
@@ -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/2205_OptimizationNetworks/TTP-Network.sln
===================================================================
--- /branches/2205_OptimizationNetworks/TTP-Network.sln	(revision 15895)
+++ /branches/2205_OptimizationNetworks/TTP-Network.sln	(revision 15895)
@@ -0,0 +1,51 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3", "HeuristicLab.Networks.IntegratedOptimization.TravelingThief\3.3\HeuristicLab.Networks.IntegratedOptimization.TravelingThief-3.3.csproj", "{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}"
+	ProjectSection(ProjectDependencies) = postProject
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429} = {B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Networks.IntegratedOptimization-3.3", "HeuristicLab.Networks.IntegratedOptimization\3.3\HeuristicLab.Networks.IntegratedOptimization-3.3.csproj", "{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}"
+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
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|x64.ActiveCfg = Debug|x64
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|x64.Build.0 = Debug|x64
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|x86.ActiveCfg = Debug|x86
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Debug|x86.Build.0 = Debug|x86
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|x64.ActiveCfg = Release|x64
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|x64.Build.0 = Release|x64
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|x86.ActiveCfg = Release|x86
+		{0259B7DD-1E4F-4838-9859-A1D428FA2AB4}.Release|x86.Build.0 = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.ActiveCfg = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x64.Build.0 = Debug|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.ActiveCfg = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Debug|x86.Build.0 = Debug|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.ActiveCfg = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x64.Build.0 = Release|x64
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.ActiveCfg = Release|x86
+		{B6263D3E-DCAF-42B0-A440-3DEEF1FF0429}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
